一步步教你如何搭建K8S叢集

2023-05-30 06:00:14

一、環境設定

三臺CentOS7虛擬機器器,預設設定,記憶體2GB、處理器2核心。

先更新下系統

1 sudo yum update
2 sudo yum upgrade

二、安裝並啟動 docker

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

三、安裝 kubeadm

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

五、ERROR

雖然上面 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

六、ERROR

降低版本後又出現如下保錯:

[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

7、ERROR

嘔、變著花樣報錯:

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。

提醒:

  • Docker 不要安裝太高版本,或者可按步驟先按照後降級
  • Docker 的 cgroup driver 驅動需要改成 systemd
  • kubeadm 不要預設安裝最新版,要安裝指定版本
  • 禁用 SELinux,禁用 swap
  • 關閉防火牆

2、加入節點

kubeadm join 192.168.33.133:6443 --token rodccq.t8fooat0paxcof56 \
    --discovery-token-ca-cert-hash sha256:64e91a185d8929b23c987683ffae359e62b09fb94e035322d511addbd065fb02

十、ERROR

說是 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。此時我再在工作節點執行該命令,還是會發生上面的報錯。

不過工作節點執行不了該命令也不是啥問題,主節點可以執行就行了。