天天看點

k8s(kubernetes)部署叢集(containerd)2020年12月

最近k8s官宣要把内置的docker支援剝離出去,是以本次叢集部署采用的容器技術是containerd,畢竟相對于docker來說containerd的調用鍊更為簡潔,如果不是k8s内置docker的支援,我覺得以後越來越多業務會傾向與使用後者吧,過程遇到了不少的坑,總結一下(我全程使用root操作的,如果你不是,最好執行的時候加上sudo)。

系統版本:centos7.6

k8s版本:1.19.4

containerd版本:containerd.io 1.3.9

更新:更簡單的部署方式請看這篇:

https://www.cnblogs.com/codenoob/p/14138333.html

更換源

将預設的yum源更換為國内的,我用的是阿裡的

# 1、安裝wget
yum install -y wget
# 2、下載下傳CentOS 7的repo檔案
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 3、更新鏡像源
清除緩存:yum clean all
生成緩存:yum makecache
           

安裝 kubelet kubeadm kubectl

master、node節點都需要執行

添加 kubernetes.repo 檔案

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=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
           
# 安裝kubelet kubeadm kubectl
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 關閉SElinux
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

sudo systemctl enable --now kubelet  # 開機啟動kubelet

sudo systemctl disable --now firewalld  # 關閉防火牆

# k8s要求關閉swap  (qxl)
sudo swapoff -a && sysctl -w vm.swappiness=0  # 關閉swap
sudo sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab  # 取消開機挂載swap
           

安裝containerd

安裝前配置

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 設定必需的 sysctl 參數,這些參數在重新啟動後仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system
           
### 安裝所需包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

### 新增 Docker 倉庫
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

## 安裝 containerd
sudo yum install -y containerd.io

# 配置 containerd
sudo mkdir -p /etc/containerd
sudo containerd config default > /etc/containerd/config.toml

# 重新開機 containerd
sudo systemctl restart containerd
           

還需要修改一些配置

# config kubelet cgroup
cat > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
EOF

# config CRI
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

vi /etc/containerd/config.toml
# [plugins."io.containerd.grpc.v1.cri"] 下的 sandbox_image
# 修改為一個你可以擷取到鏡像的源位址,我這邊随便從網上找了一個可用的
# 如果這個不可用自己去找一個能用的就行
sandbox_image="registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1"

# 還有需要加上下面
在[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]中加入
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

# 重新開機 containerd
sudo systemctl restart containerd

# 重新開機 kubelet
sudo systemctl restart kubelet
           

啟動叢集

master啟動的時候:

sudo kubeadm init --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --pod-network-cidr=192.168.0.0/16 

# --image-repository:指定鏡像源
           

啟動之後,需要再執行以下,否則在使用kubectl的時候會報8080端口錯誤:

# 非root使用者
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# root使用者
export KUBECONFIG=/etc/kubernetes/admin.conf
           

應用flannel網絡

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

node節點加入:

kubeadm join xxxxxxxxxxxxxxxxx --cri-socket /run/containerd/containerd.sock
前面就正常把master輸出的語句複制上,在最後添加一個參數
--cri-socket /run/containerd/containerd.sock 指定cri為containerd
           
# 然後看看整個系統正不正常
kubectl get pod -A
NAMESPACE     NAME                                            READY   STATUS    RESTARTS   AGE
kube-system   coredns-6c76c8bb89-7xsfl                        1/1     Running   0          40m
kube-system   coredns-6c76c8bb89-kk456                        1/1     Running   0          40m
kube-system   etcd-lijun-k8s-1.novalocal                      1/1     Running   0          40m
kube-system   kube-apiserver-lijun-k8s-1.novalocal            1/1     Running   0          40m
kube-system   kube-controller-manager-lijun-k8s-1.novalocal   1/1     Running   0          40m
kube-system   kube-flannel-ds-gs2fn                           1/1     Running   0          32s
kube-system   kube-flannel-ds-spcvw                           1/1     Running   0          38m
kube-system   kube-proxy-jkxqz                                1/1     Running   0          40m
kube-system   kube-proxy-p7tnc                                1/1     Running   0          32s
kube-system   kube-scheduler-lijun-k8s-1.novalocal            1/1     Running   0          40m
           

寫在最後:過程中遇到了一些問題:

# 如果啟動過程中總是顯示 kubelet 有問題,
systemctl status kubelet
  如果顯示是active,就再接着
  journalctl -xeu kubelet
  看一下日志裡面報的什麼錯誤,保證kubelet正常運作的狀态,使用ps指令檢視應該是
  ps -ef | grep kubelet
  /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
  --kubeconfig=/etc/kubernetes/kubelet.conf
    --config=/var/lib/kubelet/config.yaml
    --container-runtime=remote
    --container-runtime-endpoint=/run/containerd/containerd.sock --cgroup-driver=systemd
  有問題的話去看看這裡面顯示的那幾個配置檔案和上面要求的是不是一樣,還有最後面的那三個參數有沒有。
  沒有的話,去 /etc/sysconfig/kubelet 檔案中寫入
  KUBELET_EXTRA_ARGS=--cgroup-driver=systemd --container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock
  然後重新開機kubelet
如果 kubelet 根本就沒有正常啟動,首先看看是不是依賴的鏡像出了問題,本地有沒有,版本對不對,能不能正常啟動。
我在部署的時候 cni 總是出問題,愁死個人。