下面進行k8s環境的搭建,當然我是在自己本地電腦的虛拟機搭建的,并且每個節點配置設定了4G的記憶體,我電腦共16G記憶體,三個節點就占據了12G,卡卡的,但是沒辦法,總不能用雲伺服器吧,不過貌似用雲伺服器也是可以的,按量計費,搭建完也費不了多少錢吧,練習完後就删掉即可。
講真下面已經是我第二次搭建了,第一次搭建,雖然控制台進去了,但是在一個節點竟然不能通路另一個節點的pod,pod和service在叢集中不是可以肆意的通路麼?網上查可能是因為Pod CIDR與節點IP沖突,Calico的Pod CIDR即—pod-network-cidr預設使用的是192.168.0.0/16,而當叢集節點的IP段也為192.168.0.0/16時,必然導緻IP段沖突,由于不會在搭建好後重新修改這些配置,是以隻能重新搭建了。
一、環境準備
1、相關版本
Linux: CentOS7 64位
docker:20.10.7
kubelet:1.20.9
kubeadm:1.20.9
kubectl:1.20.9
2、虛拟機準備
我是準備搭建三個節點的叢集,畢竟本地虛拟機,配置比較弱,linux記憶體都是給的4G,已經是我能給的極限了,大家有條件的可以用8G。目前規劃下面幾個IP。
k8s-new-master:192.168.192.8
k8s-new-node1:192.168.192.9
k8s-new-node2:192.168.192.10
這裡虛拟機的搭建可以參考我如下幾篇筆記
安裝VMware15
CentOS7鏡像官網下載下傳
VMWare安裝CentOS7超全圖解
最小系統Centos7進行網絡配置以及 ifconfig和vim的安裝
VMWare 克隆Linux虛拟機
3、安裝好後先克隆三台機器
密碼都是root/forever、記憶體都是4G、然後參考上面的筆記修改好對應的ip位址。弄好後最好做個快照,防止後面操作失敗可以恢複快照重新來過(我就是master節點忘記設定host本身的k8s-new-master導緻重新來過了)。
二、k8s叢集搭建
1、先安裝好docker
1-1、解除安裝以前的docker包,這個步驟正常新的linux不用執行
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1-2、配置好yum源
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1-3、安裝docker,我們選擇固定版本
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
在加入節點的時候會報警告說版本不對,其實可以不用理會,如果有強迫症可以用下面的版本
yum install -y docker-ce-19.03.0 docker-ce-cli-19.03.0 containerd.io-1.4.6
如果用預設版本就用這個
sudo yum install -y docker-ce docker-ce-cli containerd.io
1-4、啟動docker
systemctl enable docker --now
1-5、配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://970k7x82.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2、安裝k8s基礎環境設定
所有機器執行如下操作
各個機器設定自己的域名
hostnamectl set-hostname xxxx
我這裡就設定為
hostnamectl set-hostname k8s-new-master
hostnamectl set-hostname k8s-new-node1
hostnamectl set-hostname k8s-new-node2
将 SELinux 設定為 permissive 模式(相當于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
關閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
關閉防火牆
systemctl stop firewalld
允許 iptables 檢查橋接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
讓上面的配置生效
sudo sysctl --system
3、安裝kubelet、kubeadm、kubectl
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
4、使用kubeadm引導叢集
4-1、下載下傳各個機器需要的鏡像
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF
chmod +x ./images.sh && ./images.sh
4-2、初始化主節點
所有機器添加master域名映射,以下需要修改為自己的
echo "192.168.192.8 k8s-new-master" >> /etc/hosts
下面的操作都在主節點即可
主節點初始化,隻需要在主節點也就是master做即可
正常service-cidr和pod-network-cidr不建議修改,應為後面一些網絡配置用的就是它,如果修改了要做相應的調整
但是我這裡pod-network-cidr因為這個跟本機沖突了,是以導緻ping不通pod,是以我這裡改了一下,後面安裝網絡插件calico.yaml的時候也需要對應的修改下,pod-network-cidr的預設值為192.168.0.0/16,我改為10.244.0.0/16。(參考:https://blog.csdn.net/weixin_43757027/article/details/123577417)
kubeadm init \
--apiserver-advertise-address=192.168.192.8 \
--control-plane-endpoint=k8s-new-master \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
要保證所有網絡範圍不重疊,執行完後會有一段日志,一定要拷貝下來,後面加入節點有用
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
--discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2 \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
--discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2
根據上面的日志提示繼續執行
4-3、設定.kube/config
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4-4、安裝網絡元件
若沒有wget指令,可以先安裝
yum install -y wget
wget https://docs.projectcalico.org/manifests/calico.yaml
然後發現網絡不通,下載下傳報錯,則用這個https://www.suibibk.com//fileupload/files/calico.yaml
這裡一定要修改下面邏輯
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
ip一定要改為跟之前初始化指定的一樣。
kubectl apply -f calico.yaml
4-5、加入node節點,也是用上面的日志,這裡要在位元組點執行
kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
--discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2
如果令牌不記得了,可以執行如下指令産生新令牌
kubeadm token create --print-join-command
提示如下錯誤
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.7. Latest validated version: 19.03
這裡要降低docker的版本(當然不降低也可以,畢竟隻是警告)
如果卡住,那麼需要關閉防火牆,前面的流程應該已經關閉
systemctl stop firewalld
當然最好先永久關閉,不然開機後可能有問題
systemctl disable firewalld #永久關閉,即設定開機的時候不自動啟動
加入後過幾分鐘,在master節點就會看到
[root@k8s-new-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-new-master Ready control-plane,master 31m v1.20.9
k8s-new-node1 Ready <none> 3m22s v1.20.9
k8s-new-node2 Ready <none> 3m4s v1.20.9
4-6、如果是加入高可用的主節點,也是按日志的步驟執行下面指令即可
kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
--discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2 \
--control-plane
4-7、相關指令
#檢視叢集所有節點
kubectl get nodes
#根據配置檔案,給叢集建立資源
kubectl apply -f xxxx.yaml
#檢視叢集部署了哪些應用?
docker ps === kubectl get pods -A
# 運作中的應用在docker裡面叫容器,在k8s裡面叫Pod
kubectl get pods -A
5、部署dashboard
kubernetes官方提供的可視化界面
https://github.com/kubernetes/dashboard
執行如下指令就可
kubectl apply -f https://www.suibibk.com//fileupload/files/dashboard.yaml
可以下載下傳下來再執行,裡面的主節點是k8s-master,記得全部要改為自己的,我現在是k8s-new-master
檢視狀态
kubectl get pods -A
都running了後再繼續執行
如果出錯了,可以重新開機
kubectl replace --force -f dashboard.yaml
5-1、設定通路端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
type: ClusterIP 改為 type: NodePort
5-2、找到端口
kubectl get svc -A |grep kubernetes-dashboard
443:30110
雲伺服器需要安全組放行,防火牆放行
通路:
https://叢集任意IP:端口
我這裡是:https://192.168.192.8:30110
5-3、故障
完全通路不了,檢視日志
#檢視容器
kubectl get pods -A
#檢視日志
kubectl logs kubernetes-dashboard-775688487c-fpzv8 -n kubernetes-dashboard
發現錯誤
Initializing csrf token from kubernetes-dashboard-csrf secret panic: Get https://10.96.0.1:443/api/v1/namespaces/kubernetes-dashboard/secrets/kubernetes-dashboard-csrf: dial tcp 10.96.0.1:443: i/o timeout
跟我遇到的一樣的原因
https://blog.csdn.net/qq_44847649/article/details/123504663
https://blog.csdn.net/qq_44847649/article/details/123082308
參考解決下,解決完後,要用這個強制重新部署
kubectl replace --force -f dashboard.yaml
再檢視狀态就很正常了
kubectl get pods -A
重走5-1,5-2
通路,大公告成:https://192.168.192.8:30110
如果用我上面的yaml,則隻需修改主節點的名字即可,不需要做其他操作,也不會遇到上面的問題。
5-4、建立通路賬号
#建立通路賬号,準備一個yaml檔案; vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f dash.yaml
5-5、擷取通路令牌
#擷取通路令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
下面的是我的登入token,每個人都要用自己的
eyJhbGciOiJSUzI1NiIsImtpZCI6IkVRZGZRRm52ZlJwcWRlc040dURELTluQ1daZjV2M3o2dnBzaEhReDBZbTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXRqbXJwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJmN2M3OGJkZi0xN2YzLTQxY2UtYmVhNS1lYzA0MDY4ZDgxYTQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.tUEW6nt4KvoV48eoAShBFqGUQx4e5KHb8nB8X24JhNf9vGhAfgAKgLo1S4HEgmqPkM1FUsMxxeNZMvRvjOI7Ju9AVUQkG7bz3skd1I_yZSoiOlcc6_woCXZ0az_nOGwvjjYeE8s8TuBT0nGkiKyZBiruyjyluHJyvv_wYex4DsyGUTKytX7ab0ndSz67JdVvzsfKjOrHmvSc_93D_mWvPwuboma-22qtdH5B-OZ3LOtj-15jRdSd3B4fTsZkw8Sijjgda5ltfncYvg-MJbAq0BEOhYYzmLL5p6CfD5Nq9rnDC1NcrMQfkUu3FblekDfWasHqRvM7iEBr_G0dvuh_Pg
5-6、這裡建議永久關閉下firewall
因為上面就是因為防火牆沒關閉加入節點報錯
systemctl disable firewalld #永久關閉,即設定開機的時候不自動啟動
5-7、重新開機試試,重新開機完後執行指令
#重新開機
reboot
#檢視節點
kubectl get nodes
#檢視pod
kubectl get pods -A
通路控制台https://192.168.192.8:30110
發現都正常,至此,k8s叢集搭建成功
喵的,電腦才16G記憶體,搭建這個叢集果然有點費力
5-8、簡單測試
建立一個nginx的yaml:nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
# namespace: default
spec:
containers:
- image: nginx
name: mynginx
kubectl apply -f nginx-pod.yaml
檢視pod的ip
kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mynginx 1/1 Running 0 2m2s 10.244.53.1 k8s-new-node2 <none> <none>
可以看到是在節點2,我們在master通路下
curl 10.244.53.1:80
發現成功啦,第二次安裝由于指定了pod-network-cidr,終于沒有出現問題,開心,得打個快照才行,防止後面搞kubesphere搞壞。