在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集群及网络已经创建成功。

 
参考:
posted @ 2022-03-31 11:53  xiaoxiongfei  阅读(351)  评论(0)    收藏  举报