最近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 總是出問題,愁死個人。