最近在研究K8s的部署方式,参考官方Document进行部署测试,中间也遇到了一些问题,总结做为自己学习、记录,如果有错误欢迎大家指出。
准备工作
准备三台机器:(os:ubuntu kernel-version : 4.15.0-142-generic)
master:172.17.18.237
node1 : 172.17.122.216
node2 : 172.17.130.191
对环境进行初始化:
进行必要的设置:
1:关闭swap,看网上说是避免对性能产生影响
sudo swapoff -a
2:关闭禁用各防火墙:(根据系统不同,执行命令不同,自己可以查询对应系统的命令)
systemctl stop firewalld.service
3: 关闭各节点的selinux 编辑/etc/selinux/config 文件并设置 SELINUX 的值为 disabled。
4: 给各节点添加kubernetes的apt-get源码,由于使用的阿里云的虚机,因此添加了阿里云的 apt-get镜像,执行如下命令:
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
sudo vim /etc/apt/sources.list.d/kubernetes.list
# 将下面的阿里源加入文件中 deb
https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
基于Kubeadm搭建集群
1: 执行完上述第四步后,可以安装最新的kubectl kubelet kubeadm
apt update && apt install kubectl kubelet kubeadm -y
注意:如果之前安装了相关的的组件,请先移除掉
2: 选择相应的 container runtime,我选择使用的是containerd,参考官方指导
Container runtimes | Kubernetes
注意除修改cgroup driver,还要修改一个地方,默认pod启动的时候,会拉去pause镜像,初始化sandbox container,默认使用的是ks8.gcr.io的镜像仓库,但是国内无法访问,因此需要修该,否则无法正常启动k8s-master以及node相关组件服务
修改上述sandbox_image为上述阿里云的镜像仓库中的pause:3.5
然后执行service containerd restart重新启动containerd服务
3:安装crictl,默认使用containerd需要使用crictl进行调试,以及执行exec等相关调试命令,通过kubeadm启动时,会检测,这个去github下载加压后,放到/usr/local/bin下就可以.
修改或者创建/etc/crictl.yaml 写入以下内容:
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
上述步骤在master和node上都要执行。
4:通过kubeadm生成默认config文件
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
修改kubeadm.yml文件,修改后如下(根据个人环境不同,可能不太一样)
1)修改 criSocket:默认使用docker做为runtime,修改为containerd.sock,使用containerd 做为runtime
2)修改imageRepository,改为aliyun的镜像仓库地址
3)修改podSubnet以及serviceSubnet,根据的自己的环境进行设置
4)设置cgroupDriver为systemd
5:查看、拉取相关镜像(可跳过,建议使用本地镜像,因为coredns镜像的原因,kubeadm init会拉取失败,参考第6步)
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
拉取后,如果使用本地镜像,请修改kubeadm.yml中的镜像拉取策略:imagePullPolicy,
6:准备好相关配置后,执行如下命令,初始化master集群
kubeadm init --config=kubeadm.yml --upload-certs --ignore-preflight-errors=ImagePull
--ignore-preflight-errors因为我使用的是默认imagePullPolicy, coredns会拉取失败,所以选择忽略
建议还是先执行第5步,将所有镜像拉取到本地,使用本地镜像,初始化时间差不多
到这一步基本配置完成,如果没有特殊问题,master集群应该正常启动
通过crictl可以看到相关的pod已经启动
通过kubeadm join加入master时,要加上参数 --cri-socket /run/containerd/containerd.sock
指定使用containerd做为container runtime
命令如下,master地址及token cert,master执行完Kubeadm init后,会有提示,在后面追加
--cri-socket /run/containerd/containerd.sock执行
kubeadm join 172.17.18.237:8080 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:f63893c3540a5b5032ba25c86293d54f118728476a6544478a93e8d051984c55 --cri-socket /run/containerd/containerd.sock