三臺CentOS7虛擬機器器,預設設定,記憶體2GB、處理器2核心。
先更新下系統
1 sudo yum update 2 sudo yum upgrade
1 yum -y install wget 2 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo 3 yum -y install docker-ce 4 systemctl enable docker 5 systemctl start docker
1、設定阿里源
官網這種帶 google 的一看就會被牆,我們直接使用阿里的源:
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
設定完源後再更新一下:
sudo yum update
2、禁用 SELinux
將 SELinux 設定為 permissive 模式,相當於將其禁用
1 sudo setenforce 0 2 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
3、安裝並啟用 kubelet
1 sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes 2 sudo systemctl enable --now kubelet
1、檢視 kubeadm 版本資訊
kubeadm config print init-defaults
apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd: local: dataDir: /var/lib/etcd imageRepository: registry.k8s.io kind: ClusterConfiguration kubernetesVersion: 1.27.0
其中 apiVersion 和 kubernetesVersion 需要和下面編寫的 kubeadm.yml 保持一致。
2、編寫 kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: 1.27.0 imageRepository: registry.aliyuncs.com/google_containers apiServer: extraArgs: runtime-config: "api/all=true" etcd: local: dataDir: /data/k8s/etcd
3、關閉防火牆
1 systemctl stop firewalld 2 systemctl disable firewalld
4、關閉 swap
swapoff -a
5、執行 kubelet.service
systemctl enable kubelet.service
6、啟動容器執行時
1 rm -rf /etc/containerd/config.toml 2 systemctl restart containerd
7、使網橋支援 ip6
1 cd /etc/sysctl.d/ 2 vi k8s-sysctl.conf 3 #新增如下文字 4 net.bridge.bridge-nf-call-ip6tables = 1 5 net.bridge.bridge-nf-call-iptables = 1 6 #使其生效 7 sysctl -p k8s-sysctl.con
8、部署 master
kubeadm init --config kubeadm.yaml
雖然上面 3~7 等步驟解決了一些警告,以及報錯,但最終步驟8還是跑不起來,將版本換到 1.23.xx 再試試
1、解除安裝安裝的 kubeadm
sudo yum remove kubelet kubeadm kubectl
2、重新安裝指定版本 kubeadm
yum install kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17 kubernetes-cni
3、啟用 kubelet
sudo systemctl enable --now kubelet
4、檢視 kubeadm 版本資訊
5、修改 kubeadm.yaml 版本為 1.23.0
6、部署 master
降低版本後又出現如下保錯:
[init] Using Kubernetes version: v1.23.0 [preflight] Running pre-flight checks [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 24.0.2. Latest validated version: 20.10 error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists [ERROR Port-10250]: Port 10250 is in use [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher
1、首先需要將 24.0.2 版本的 Docker 降級為 20.10 的版本
存取 Docker 版本 可檢視 docker-ce 版本:
yum downgrade --setopt=obsoletes=0 -y docker-ce-20.10.24 docker-ce-selinux-20.10.24 containerd.io
2、重置 kubeadm
kubeadm reset
3、部署 master
嘔、變著花樣報錯:
Unfortunately, an error has occurred: timed out waiting for the condition This error is likely caused by: - The kubelet is not running - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled) If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands: - 'systemctl status kubelet' - 'journalctl -xeu kubelet' Additionally, a control plane component may have crashed or exited when started by the container runtime. To troubleshoot, list all containers using your preferred container runtimes CLI. Here is one example how you may list all Kubernetes containers running in docker: - 'docker ps -a | grep kube | grep -v pause' Once you have found the failing container, you can inspect its logs with: - 'docker logs CONTAINERID'
1、先看一下 kubelet 是否在執行
systemctl status kubelet
2、輸入如下命令檢視報錯紀錄檔
journalctl -xefu kubelet
May 28 23:23:50 localhost.localdomain kubelet[19052]: E0528 23:23:50.235324 19052 server.go:302] "Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\"" May 28 23:23:50 localhost.localdomain systemd[1]: kubelet.service: main process exited, code=exited, status=1/FAILURE May 28 23:23:50 localhost.localdomain systemd[1]: Unit kubelet.service entered failed state. May 28 23:23:50 localhost.localdomain systemd[1]: kubelet.service failed.
3、Google或百度下報錯原因
kubelet cgroup driver: \「systemd\「 is different from docker cgroup driver: \「cgroupfs\「
上面說是 Docker 和 kubelet 的 cgroup driver 不一樣,kubelet 的是 systemd,docker 的是 cgroupfs。
3.1 將 docker 的改成 systemd:
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://gmkz82n7.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] } EOF
registry-mirrors 是為了設定映象加速器,exec-opts 才是將 docker 的 cgroup driver 改成 systemd。
映象加速器地址可以在阿里雲官網搜容器映象服務,然後找到映象加速器。
3.2 重啟 docker:
1 sudo systemctl daemon-reload 2 sudo systemctl restart docker
3.3 檢視 docker 的 cgroup
docker info
3.4 重置 kubeadm
kubeadm reset
3.5 部署 master
上圖說了要啟動叢集需要執行的命令:
1 mkdir -p $HOME/.kube 2 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 3 sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
最後,你應該部署一個 pod 網路附加元件,可參考 weaveworks網站 進行部署:
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
檢查部署狀態:
kubectl get pods -n kube-system
從失敗到成功大概可能要個五分鐘左右吧。
1、重複步驟 一 ~ 三,安裝 kubeadmin。
提醒:
2、加入節點
kubeadm join 192.168.33.133:6443 --token rodccq.t8fooat0paxcof56 \ --discovery-token-ca-cert-hash sha256:64e91a185d8929b23c987683ffae359e62b09fb94e035322d511addbd065fb02
說是 token 過期了,不過我主節點出現這個 token 到部署 WorkNode 不過一小時。
那麼重新生成一下 Token 看看:
kubeadm token create --print-join-command
出現如下命令:
kubeadm join 192.168.33.133:6443 --token vz24u8.4h5vuriszbns3cfi --discovery-token-ca-cert-hash sha256:64e91a185d8929b23c987683ffae359e62b09fb94e035322d511addbd065fb02
在 WorkNode 上執行一下上面命令,過了幾分鐘後,還是出現同樣報錯。
網上搜到說本地時間錯誤同樣會導致證書過期報錯,檢查一下兩臺機器的本地時間
date
發現確實不對,同步時間命令,兩臺機器都執行一下:
1 sudo yum install ntpdate 2 ntpdate ntp1.aliyun.com
MasterNode 重新生成下 token,WorkNode 執行加入節點命令。
很遺憾的是我的虛擬機器器上的主節點突然宕機了,並且之後換了一個 IP,然後我又立馬給它起起來了。
然後再 MasterNode 重新生成下 token,WorkNode 執行加入節點命令。
繼續報錯,如果你們的沒有像我一樣突然發生宕機,可能不會出現這樣的問題:
You must delete the existing Node or change the name of this new joining
然後我就給新加入的節點重新命名主機名:
hostnamectl set-hostname node01
再重新加入,然後又報了一個錯:
[ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists
這需要重置一下 kubeadm:
kubeadm reset
再再重新加入,終於成功了:
接著我們執行一下檢視節點的命令:
kubectl get nodes
但是又又報錯了,嘔:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
那我們再在主節點上執行看看:
這個命令我在主節點上執行了三次,第一次是工作節點還沒加入前,第二次是工作節點加入後,可以看到 node01 狀態是 NotReady,過了幾分鐘後,我又執行了一次,node01 的狀態變成了 Ready。此時我再在工作節點執行該命令,還是會發生上面的報錯。
不過工作節點執行不了該命令也不是啥問題,主節點可以執行就行了。