在centos7.9上使用kubeadm+containerd+flannel搭建kuberntes1.23.0集群
安装containerd
使用yum安装
yum -y install containerd.io
containerd.io包含containerd服务、ctr命令和ctrctl命令
为containerd生成配置
containerd config default > /etc/containerd/config.toml
重启containerd
systemctl restart containerd
添加crictl配置文件/etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 2 debug: false pull-image-on-create: true
执行crictl img,检查是否报错,不报错即正常
安装kubernetes机群
安装master
指定kubernetes版本、指定镜像仓库地址、指定cri-socket、指定apiserver地址
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.1.26 --image-repository=registry.aliyuncs.com/google_containers --cri-socket /run/containerd/containerd.sock --kubernetes-version=v1.23.0
安装失败,使用‘journalctl -xeu kubelet’命令查看kubelet的日志,发现是拉取镜像k8s.gcr.io/pause:3.5失败
解决办法:
sudo ctr -n k8s.io i pull registry.aliyuncs.com/google_containers/pause:3.5 sudo ctr -n k8s.io i tag registry.aliyuncs.com/google_containers/pause:3.5 k8s.gcr.io/pause:3.5
安装worker
指定cri-socket
sudo kubeadm join 192.168.2.126:6443 --token tz33vw.ynfla3o5g2wt02d7 --discovery-token-ca-cert-hash sha256:7909b5b1b2a62363550199e57876425fc1a1a959da6ad51d8b499e328eadb6d8 --cri-socket /run/containerd/containerd.sock
验证
在master上执行‘kubectl get node’命令查看节点信息,如果能看到节点信息表示集群安装成功
查看pod,如果worker上的kube-proxy的状态是ContainerCreating,使用kubectl describe命令查看,如果是k8s.gcr.io/pause镜像拉取失败,执行ctr命令拉取景象打标签即可。
安装flannel
在各节点上配置子网信息
在master上/run/flannel/subnet.env文件中配置flannel的子网信息
FLANNEL_NETWORK=10.244.0.0/16 FLANNEL_SUBNET=10.244.0.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true
在worker1上/run/flannel/subnet.env文件中配置flannel的子网信息
FLANNEL_NETWORK=10.244.0.0/16 FLANNEL_SUBNET=10.244.1.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true
在master2上/run/flannel/subnet.env文件中配置flannel的子网信息
FLANNEL_NETWORK=10.244.0.0/16 FLANNEL_SUBNET=10.244.2.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true
配置好各个节点上的子网信息后,就可以在kubernetes上创建flannel了
下载kube-flannel.yaml文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
编辑kube-flannel.yaml文件
为/opt/bin/flanneld添加ifcae参数,指定自己机器上的网络出口,如下所示:
command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr - --iface=eth0
创建flannel
kubectl apply -f kube-flannel.yml
查看pod看到三个kube-flannel-ds的pod处于running状态就成功了
创建一个2副本的nginx应用
kubectl apply -f nginx.yml
查看nginx的pod,发现其中一个节点上的pod一直处于ContainerCreating状态
使用kube describe 查看该pod的信息,发现报错:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedCreatePodSandBox 71s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "3c3e420190385754e08ad01c8c6c062ce0e3404b8788ccfe853fc6fefcb969b2": failed to delegate add: failed to set bridge addr: "cni0" already has an IP address different from 10.244.2.1/24
报错原因是该worker上创建的cni0的ip是10.244.3.1,掩码是24位的,与该节点上/run/flannel/subnet.env中配置的子网不在一个网段,所以报错。
有两种解决方法
方法1
修改/run/flannel/subet.env,把子网改成与cni0相同的网段
方法2
停掉cni0网卡,再删除cni0网卡,最后把调度到该节点上的pod删除。cni0网卡会重新创建,新创建出来的cni0网卡的ip是属于/run/flannel/subnet.env里配置的子网的。
sudo ifconfig cni0 down
sudo ip link delete cni0
kubectl delete pod nginx-deployment-9fbb7d78-4z56h
pod删除后会创建新的pod,该节点上的kubelet创建pod的时候,调用/opt/cni/bin/flannel为其分配ip地址,在分配ip地址的过程中,发现cni0网卡不存在,便会进行创建,这样新的cni0网卡的ip就会从/run/flannel/subnet.env里配置的子网中申请,创建出来的cni0网卡就与配置的子网网段一致了。
验证网络
在master上,ping创建的nginx的pod的ip地址,发现都是通的。
至此,kubernetes集群及网络已经创建成功。
参考: