最近k8s官宣要把内置的docker支持剥离出去,所以本次集群部署采用的容器技术是containerd,毕竟相对于docker来说containerd的调用链更为简洁,如果不是k8s内置docker的支持,我觉得以后越来越多业务会倾向与使用后者吧,过程遇到了不少的坑,总结一下(我全程使用root操作的,如果你不是,最好执行的时候加上sudo)。
系统版本:centos7.6
k8s版本:1.19.4
containerd版本:containerd.io 1.3.9
更换源
将默认的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 总是出问题,愁死个人。