天天看點

基于Cri-dockerd使用Kubeadm部署Kubernetes1.25叢集

1. 前言介紹

關于Kuebernetes的部署

常用于部署K8s叢集的工具和部署方式

  • minikube
  • kubeadm
  • 二進制包

本文使用kubeadm部署方式

K8s叢集的部署有多種方式,而使用Kubeadm是部署K8s叢集是其一,通過使用kubeadm方式部署,相教于使用二進制方式部署K8s多個元件的方法,Kubeadm使用一條指令即可完成整個k8s叢集的搭建。

官網:https://github.com/kubernetes/kubeadm

關于Kubernetes1.24以上版本的情況說明

Kubernetes1.24+版本,預設取消了對Docker的支援,是以需要通過在每個K8s節點安裝Cri-dockerd這個中間層插件,K8s Api通過Cri-dockerd去和Docker容器進行互動,因為Cri-dockerd需要go語言環境的支援,是以每個節點還需要部署Go語言環境。

2. 環境準備

K8s叢集配置級安裝軟體

主機名 IP位址 部署軟體
matser01 192.168.30.80 GO、Cri-dockerd、Kubectl、Kubeadm、Kubelet
node01 192.168.30.81 GO、Cri-dockerd、Kubectl、Kubeadm、Kubelet
node02 192.168.30.82 GO、Cri-dockerd、Kubectl、Kubeadm、Kubelet

先決條件

  1. CPU不能少于2核
  2. 記憶體不能小于2G,建議至少4G

3. 安裝部署

3.1. 基礎環境配置

在matser01、node01、node02上操作,保證網絡正常的情況下可以直接寫入腳本運作或使用xshell複制黏貼直接刷入主機(建議科學上網)

#關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
#關閉Selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
#關閉交換分區(必須關閉)
swapoff -a						
sed -ri 's/.*swap.*/#&/' /etc/fstab

#配置本地解析
cat >> /etc/hosts <<EOF
192.168.30.80 master01
192.168.30.81 node01
192.168.30.82 node02
EOF

#調整核心參數
cat > /etc/sysctl.d/kubernetes.conf << EOF
#開啟網橋模式,可将網橋的流量傳遞給iptables鍊
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
EOF
sysctl --system	 #使核心配置生效

#安裝使用軟體
yum install -y yum-utils device-mapper-persistent-data lvm2 git unzip wget

#配置yum源(阿裡倉庫)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo	

#安裝docker
yum -y install docker-ce

#配置docker網絡驅動和鏡像加速
cat > /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

#重新開機docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker

#安裝Go語言(有時候壓縮包下載下傳失敗是因為沒有科學上網,沒有網絡環境可以通過手動下載下傳壓縮包方式進行安裝)
#切換到tmp目錄
if [ ! -d "/tmp" ];then mkdir /tmp;fi;cd /tmp
wget https://go.dev/dl/go1.19.2.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.2.linux-amd64.tar.gz

cat >> /etc/profile <<EOF
export PATH=$PATH:/usr/local/go/bin
EOF

source /etc/profile

#安裝Cri-Dockerd
git clone https://github.com/Mirantis/cri-dockerd.git
cd cri-dockerd
mkdir bin
go build -o bin/cri-dockerd
mkdir -p /usr/local/bin
install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
cp -a packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service


#修改/etc/systemd/system/cri-docker.service配置裡的ExecStart為
#ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=kubebiz/pause:3.8

#以下使用變量指派使用sed指令直接修改配置

#定義config變量,将要追加的内容作為值傳給變量
config="--network-plugin=cni --pod-infra-container-image=kubebiz/pause:3.8"

#使用sed指令修改/etc/systemd/system/cri-docker.service檔案
sed -i -r 's,(^E[a-z]+S[a-z]+=/[a-z].+/),\1 '"$config"',' /etc/systemd/system/cri-docker.service

#取消config變量
unset config

#重新加載啟動cri-docker
systemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket
systemctl start cri-docker

#配置k8s yum源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
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-1.25.0 kubeadm-1.25.0 kubectl-1.25.0
systemctl enable kubelet --now
           

3.2. master節點配置

#修改主機名
hostnamectl set-hostname master01

#重新登入shell使主機名生效
exit

#使用kubeadm部署K8s叢集master節點
kubeadm init \
  --apiserver-advertise-address=192.168.30.80 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.25.0 \
  --service-cidr=10.125.0.0/16 \
  --pod-network-cidr=10.244.0.0/16 \
  --cri-socket /var/run/cri-dockerd.sock \

#--apiserver-advertise-address的值為master節點的IP位址
#--image-repository registry.aliyuncs.com/google_containers基礎鏡像使用阿裡雲的鏡像庫
#--kubernetes-version v1.25.0 k8s版本為1.25
#--cri-socket /var/run/cri-dockerd.sock k8s CRI選擇Cri-dockerd,必須

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

           
基于Cri-dockerd使用Kubeadm部署Kubernetes1.25叢集

成功建立K8s叢集結果傳回如下,圈紅部分為其他節點加入叢集的指令,因為使用cri-dockerd,其他系欸但加入時需加上--cri-socket /var/run/cri-dockerd.sock,否則會報錯

3.3. 檢視master節點狀态(在master上操作)

kubectl get cs

基于Cri-dockerd使用Kubeadm部署Kubernetes1.25叢集

kubectl cluster-info

基于Cri-dockerd使用Kubeadm部署Kubernetes1.25叢集

kubeadm join加入叢集時需要master節點的IP位址和token和叢集CA公鑰的的hash值,若忘記可以使用下面的指令檢視

#列出token
kubeadm token list | awk -F" " '{print $1}' |tail -n 1

#擷取CA公鑰的的hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^ .* //'
           

3.4. node01、node02節點配置

修改node01主機名(在node01上操作)
hostnamectl set-hostname node01

#退出shell重新登入使主機名生效
exit
           
修改node02主機名(在node02上操作)
hostnamectl set-hostname node02

#退出shell重新登入使主機名生效
exit
           
#加入K8s叢集(在node01和node02上操作)
kubeadm join 192.168.30.80:6443 --token q9ev7q.348bo0ng5xttjact \
	--discovery-token-ca-cert-hash sha256:7e06b2fe75dcda3d4eba5b19f92b03fc0b7c04cb5b8c69234e36009722458a22 \
--cri-socket /var/run/cri-dockerd.sock
           
基于Cri-dockerd使用Kubeadm部署Kubernetes1.25叢集

以上放回結果表示加入k8s叢集成功

3.5. master節點安裝網絡套件(此處使用flannel)

節點剛加入叢集時,因為master節點還未部署網絡套件,是以所有節點的狀态為Notready

kubectl apply -f \
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
           

安裝好網絡套件等待一會後node就會進入ready狀态

基于Cri-dockerd使用Kubeadm部署Kubernetes1.25叢集

3.6. 解決不健康的節點問題(非必要,出現時執行)

vim /etc/kubernetes/manifests/kube-scheduler.yaml 
vim /etc/kubernetes/manifests/kube-controller-manager.yaml

# 找到port=0,把這一行注釋掉
#- --port=0	

systemctl restart kubelet
           

繼續閱讀