本文記錄了完整的在虛擬機中搭建K8S集群遇到的問題及解決方法,僅供大家學習。
部分教程可參考:https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/nd7yOvdY
硬件准備
1. 准備安裝一個master 節點和3個worker節點(強烈推薦為1核CPU,2G以上內存,如果設置為2核CPU,則本地打開多虛擬機會非常卡頓並得到內核軟件鎖死等錯誤信息),,本人首先只創建了一個master和worker1兩台虛擬機,其他node 節點可以在worker1節點完成后通過虛擬機自帶的克隆(clone)功能快速復制一模一樣的環境(ip,hostname等信息需要自己更新),克隆時需要選擇生成全新的網卡和mac地址等信息。
虛擬機創建好后通過以下命令 設置相應的hostname:
hostnamectl set-hostname master hostnamectl set-hostname worker1
master : 192.168.50.50
worker1:192.168.50.51
worker1:192.168.50.52
worker1:192.168.50.53
2. Oracle VM 設置:網卡連接都設置為橋接模式,通過宿主機(windows10)輸入ipconfig /all 命令得到宿主機IP 和網關,DNS 等信息。以便在虛擬機中/etc/sysconfig/network-scripts/目錄下網卡信息文件中配置中增加網絡配置信息,在文件中增加IPADDR 和宿主機在同一網段,增加NETMASK 和GATEWAY,DNS1 等信息,這樣可用保證虛擬機之間可以和宿主機在同一網段中,並能通過橋接連接訪問外部互聯網,方便k8s組件安裝包的下載。
重啟后route -n查看
注意:有些公司網絡會對橋接模式的IP dhcp 獲取有限制,如果需要宿主機訪問虛擬機,則可以使用NAT 網絡適配模式並進行端口映射。需要在全局設置中創建新的NAT network並分配好IP 網絡段
3.修改各個虛擬機/etc/hosts文件,配置映射信息。
安裝K8S組件 (每台主機需要安裝docker-ce組件,此文docker安裝步驟略過)
1.所有節點關閉和禁用各節點的防火牆:
systemctl stop firewalld && systemctl disable firewalld
臨時關閉SELINUX:setenforce 0
查看SELINUX狀態:sestatus -v
查看狀態:getenforce
永久關閉 vi /etc/selinux/config
關閉交換分區:swapoff -a
也可以使用這命令修改: sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
2. 下載最新版本K8S kubectl
curl -LO https://dl.k8s.io/release/v1.23.4/bin/linux/amd64/kubectl
下載校驗文件:curl -LO "https://dl.k8s.io/1.23.4/bin/linux/amd64/kubectl.sha256"
校驗文件: echo "$(<kubectl.sha256) kubectl" | sha256sum --check
通過:kubectl: OK
安裝:install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
查看安裝版本是否最新 :kubectl version --client
3.所有節點主機添加安裝源(進入網址操作)
https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b11kIpGBF
通過如下命令生成k8s repo文件
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
安裝所需組件( 在所有節點)
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet #啟用和開啟kubelet服務
查看狀態用 systemctl status kubelet,如果失敗 則查看失敗日志:journalctl -xefu kubelet
kubernetes 官方推薦docker等使用systemd 作為cgroupdriver,否則kubelet啟動不了。
cat <<EOF > daemon.json { "exec-opts":["native.cgroupdriver=systemd"] } EOF
生成文件后通過命令移動到docker配置目錄下
mv daemon.json /etc/docker
systemctl daemon-reload #重加載配置
systemctl restart docker #重啟docker服務
如果kubelet啟動仍然失敗 提示 :failed to load Kubelet config file /var/lib/kubelet/config.yaml 則需要查看是否執行了kubeadm init命令(僅在主節點跑),
如果swap分區沒關閉 需要swapoff -a 關閉分區 並進入文件 注釋掉加載swap分區那行 /etc/fstab ,完畢后reboot重啟。
4. 用kubeadm初始化一個集群(僅在主節點執行),失敗了可用kubeadm reset重置 :
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --ignore-preflight-errors=NumCPU
增加 --ignore-preflight-errors=NumCPU 命令是為了跳過要求cpu核高於2的限制,上文提到如果設置虛擬機cpu為2個則會很卡。
不增加則運行kubeadm init 會出現錯誤: [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
另外一種解決方法:臨時增加虛擬機為2個也可以,完成安裝后可恢復為1個。
安裝過程中當出現字樣 :Your Kubernetes control-plane has initialized successfully! 說明安裝成功!
TIPS: 如果更換了虛擬機的 ip地址則需要更改相應的hosts文件和/etc/kubernetes路徑下很多conf 文件里的ip地址,需要 kubeadm reset后重新安裝,
否則會出現kubectl 各種命令失效連接不上server的錯誤。如果reset不行 ,則可以yum remove 刪除之前的kubectl keubelet kubeadm 等組件。
安裝過程中還會打印出token信息,便於其他節點連接master主機加入K8S集群。注意保存該包含token的命令行信息 ,命令行中IP信息為master節點,下列命令是在worker節點中執行的。
kubeadm join 192.168.50.50:6443 --token 6vzabt.3zp3cbs7f7wmw4r8 --discovery-token-ca-cert-hash sha256:04abedbba674eab570cad77abc4f2ac61e029fa31c666493670ad958b74a2f3d
如果丟失或者過期,則可以重新獲取,執行命令
kubeadm token create --print-join-command
TIPS: 正常集群都是局域網內的機器,如果是用外網別的雲平台機器加入當前集群,則需要配置iptables :iptables -t nat -A OUTPUT -d TX雲外網ip -j DNAT --to-destination TX雲內網ip
iptables -t nat -A OUTPUT -d Ali內網ip -j DNAT --to-destination Ali外網ip
兩台機子需要相反得操作,網上搜下iptables就差不多了,如果是使用TX雲部署的時候,在端口轉發。
5.# 復制授權文件,以便 kubectl 可以有權限訪問集群 # 如果你其他節點需要訪問集群,需要從主節點復制這個文件過去其他節點
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
6. 把其他工作節點加入到集群中
kubeadm join 192.168.50.50:6443 --token 6vzabt.3zp3cbs7f7wmw4r8 --discovery-token-ca-cert-hash sha256:04abedbba674eab570cad77abc4f2ac61e029fa31c666493670ad958b74a2f3d
7.安裝網絡插件calico.yaml
此時start 然后查看master節點 systemctl start kubelet systemctl status kubelet,發現服務已經running了,但是有錯:Unable to update cni config" err="no networks found in /etc/cni/net.d
在老版本1.21之前可安裝的是 kube-flannel(被牆了,需要自己網上搜索文件下載)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
我當前安裝的是1.23.4 ,所以安裝calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
如果報錯:Port 10250 is in use 則執行以下:
kubeadm reset 重置配置
在將worker 節點加入master時報錯:It seems like the kubelet isn't running or healthy,無法加入master節點
journalctl -xefu kubelet查看kubelet日志 發現swap未關閉 ,則需要關閉。
8.安裝完成后查看安裝信息
通過命令kubectl get node 查看集群節點信息, 通過kubectl get configmap -n kube-system 命令查看已安裝插件信息,如果出現NotReady的節點,極可能是忘記安裝了網絡插件。
如果開啟兩個虛擬主機很卡 而且經常 出現soft lockup cpu#1 stuck 等錯誤,則需要改回虛擬機處理器設置為1個即可,之前安裝k8s組件時 設置了2個。
9. worker node 節點加入進master節點后 ,通過命令查看關鍵pod運行狀態
kubectl get pod -n kube-system
如果有發現coredns兩個pod無法啟動 一直為ContainerCreating 狀態,kubectl edit cm coredns -n kube-system 命令進入文件刪除loop 所在行 退出后 重啟 coredns pods並刪除那2個運行失敗的 ,再次查看 他們會自動創建運行。如果此種方法仍然失敗,則kubectl delete pod coredns-xxx-xxx -n kube-system 刪除
那2個失敗的容器,如果還是無法重新創建成功 則輸入命令查看pod日志信息:
kubectl describe pods -n kube-system coredns-6d8c4cb4d-jgxwb
更大的可能是忘記安裝了網絡插件 :我在安裝過程中復制錯了插件地址kubectl apply -f https://projectcalico.docs.tigera.io/manifests/flannel-migration/calico.yaml,導致calico沒有安裝成功。正確的是 kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
刪除文件,可以用命令 kubectl delete -f xxxx.yaml
kubectl get cs 查詢健康狀態
10. 安裝dashboard
注意該文件地址有時會無法訪問
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
可以下載到本地保存比如保存k8s-dashboar.yaml.
vim k8s-dashboar.yaml 增加type: nodeport 模式
執行變化 :
kubectl apply -f k8s-dashboar.yaml
如果不增加nodeport模式,則用kubectl 命令行工具來啟用 Dashboard 訪問:
kubectl proxy
查看clusterIP 信息
get svc -n kubernetes-dashboard
安裝成功后 通過master IP 訪問
http://192.168.50.50:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login
出現 Token和KubeConfig ,根據提示操作即可
11. 生成admin token
kubectl create serviceaccount dashboard-admin -n kube-system kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
查看令牌
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
復制下方token
如果使用nodeport 模式,則查看NodePort服務端口位32275
kubectl get service --all-namespaces |grep dash
則通過https://192.168.50.50:32275/#/login 訪問,復制上方步驟11生成的admin token
登錄成功
TIPS:如果重啟機器后Dashboard 沒有及時up,可能是在下載安裝..... 意外的機器重啟可能會導致一些docker容器出現異常 ,需要手動查看 docker ps -a 刪掉不在運行的容器,否則K8S 服務會有問題。
kubectl get pods --all-namespace 查看所有的pod
配置使用overlay2
# cat /etc/docker/daemon.json
{
"storage-opts": [
"overlay2.override_kernel_check=true",
"overlay2.size=10G"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m"
}
}
systemctl daemon-reload systemctl restart docker
這樣就可以把每個容器磁盤大小限制在10G了
12.同步K8S 集群網絡時間
做時間同步
之前的版本:yum install -y ntp
centos8:yum -y install chrony
查看同步狀態 chronyc sourcestats
查看ntp詳細的同步狀態 chronyc sources -v
查看時間同步狀態 timedatectl status
# 開啟網絡時間同步
timedatectl set-ntp true
# 查看時區列表
timedatectl list-timezones
timedatectl list-timezones | grep -E "Asia/S.*"
設定為上海時區timedatectl set-timezone Asia/Shanghai
13.查看全屬性pod 狀態信息
kubectl get pods --all-namespaces -o wide
查看所有kind資源類型
kubectl api-resources -o wide --namespaced=true 或者kubectl api-resources -o wide --namespaced=false
創建nginxpod
kubectl create deployment web --image=nginx
暴露對外接口
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
定義一個service並導出yaml文件類型(Type如果沒做設置,默認ClusterIP) :kubectl expose deployment web --port=80 --target-port=80 --dry-run -o yaml >service1.yaml,
基於這個service1.yaml可通過kubectl apply -f service1.yaml 創建service
查看service kubectl get svc
刪除service kubectl delete service nginx-web
顯示完成的docker描述信息,不顯示省略號:docker search kube-webhook-certgen:v1.1.1 --no-trunc
14.設置swap
****************************設置swap*****************
free -m
swapon -s
dd if=/dev/zero of=/tmp/swap bs=1M count=4096 通過dd命令在/tmp/目錄下新增加一個4G大小的空文件。
chmod 600 /tmp/swap 修改文件權限,只有root讀寫
mkswap /tmp/swap 使用mkswap命令把創建的文件格式化為swap
ls -lh /tmp/swap #查看創建的文件大小和權限
swapon /tmp/swap 使用swapon命令使swap生效
編輯fatab文件加入下面swap 便於下次啟用
/tmp/swap swap swap defaults 0 0