Kubernetes 1.26.0实战:在本地配置k8s集群
阶段一:开发环境及版本
以下环境均来自官网:
本地宿主机环境:Windows 10 21H2 64位
虚拟机软件:VMware workstation 15.5 pro
虚拟机镜像版本:ubuntu-20.04.5-desktop-amd64.iso
阶段二:在配置k8s之前的事前准备(已有机器环境可以跳过)
推荐的配置:2核处理器(必须)、2G内存、40G磁盘空间
需要准备三台相同配置的机器,以组成1 master + 2 slave 的集群,slave可以通过master克隆而来以减少工作量,但是要注意修改对应的host、nes/eth网卡IP配置。
从官网下载而来的Ubuntu是极为纯净的版本(自己可以提前配置好然后克隆),为了便于后续的操作,首先需要做一些基础配置:
(1).先把vim tiny改成full模式,这会大大方便接下来的操作,参考:
https://hufeng.blog.csdn.net/article/details/78045213
(2).执行以下命令:
apt-get update
apt-get install net-tools
使用ifconfig命令查看当前网卡的ipv4地址,以便于使用ssh远程登录:

注意,如果受网络环境限制,也许需要进行换源,阿里源或者网易源、华为源、utsc源均可。
换源需要验证密钥,可能需要提前下载gpg:
sudo apt-get install gnupg
再次运行apt-get命令,按照需求更新密钥:
gpg --keyserver keyserver.ubuntu.com --recv-keys 13EDEF05
gpg --export --armor 13EDEF05 | sudo apt-key add -
(3).准备ssh连接,apt-get install openssh-server
sudo passwd root,重设root密码,后续基本使用root登录。
使用vscode远程ssh以root身份连接Ubuntu:

至此,第二阶段的准备工作完成,我们拥有了一个可以正常运行k8s的良好Ubuntu环境。
阶段三:开始在master机上安装开源kubernetes软件
至今,kubernetes已经更新到了1.26.0版本,与前面几个版本相比,此版本变化较大,但参考资料网上不多,因此大部分参考官方文档https://docs.docker.com/engine/install/ubuntu/。
自K8s 1.25以上的版本禁用了dockershim,转为使用containerd。
Containerd的安装方法可以参考:
https://github.com/containerd/containerd/blob/main/docs/getting-started.md
docker安装完成后,开始下载kubernetes工具:
apt-get update && apt-get install -y docker.io kubelet kubernetes-cni kubeadm
在使用kubernetes前需要关闭swap交换区:
sudo swapoff -a #暂时关闭交换区,reboot后失效
vim /etc/fstab,注释掉swap相关行以永久禁用swap:

关闭防火墙,如Ubuntu系统的UFW或者centos系统的firewalld等,当然,这是为了便于实验,实际生产环境中采用开放特殊端口的形式提高系统的安全性。
例:iptables开放6443端口命令:
iptables -A INPUT -p tcp --dport 6443 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 6443 -j ACCEPT
获取当前镜像版本,并通过shell脚本下载:
kubeadm config images list


使用命令docker images查看pull下来的镜像,在该场景下docker仅作为containerd的镜像中转站使用。
Kubeadm init,初始化,提示至少需要2核的CPU,需要进行修改。

成功完成初始化后,k8s暂时无法使用,systemctl status kubelet检查服务状态,显示不可用(exit code 1)。
使用命令journalctl -xeu kubelet查看日志,显示CRI v1 runtime API与docker不兼容,这是在k8s升级到1.26.0版本以后出现的一个特殊bug,在开源项目的issue中予以反馈,截至报告撰写日期尚未修复。具体讨论在https://github.com/Mirantis/cri-dockerd/issues/125中。

在k8s官方手册中,给出了该情况下对于高级版本的适配方案,地址如下:
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd
检查并修改docker和k8s的cgroup driver相同,推荐为systemd(cgroups会出现可疑的重叠叠加情况)。


查看containerd的conf配置文件,取消对cri的禁用并增加对systemd的支持。


按照说明修改完成后,kubelet可以使用,服务状态正常:

然而,此时仍然无法启动,查看kubelet日志,出现failed to pull image \"registry.k8s.io/pause:3.6\" 字样的报错信息。原因是由于pause:3.6镜像需要连接外网才能够拉取。
这里使用先前在docker images中已经在国内源下载完成的pause:3.6镜像,在docker中做中转并对镜像打对应的tag,转移到containerd中,注意tag和日志中的名称应完全相符。具体命令如下:
docker save k8s.gcr.io/pause:3.6 -o pause.tar #从docker中转站中取出对应版本的镜像
ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6 #给镜像打tag
此处部分的操作参考:https://blog.51cto.com/u_12790562/5223807?articleABtest=1
需要注意的是,根据journalctl -xeu kubelet命令的查询结果,镜像tag一定要严格按照日志说明中拉取并命名,否则无法正确识别。且根据k8s和containerd的版本不同,默认命名空间及前缀会有差异,根据互联网上的绝大多数调试经验不一定完全适用,需要根据日志情况进行调试。
至此,k8s可以正常使用。尝试查看命名空间:

Master机配置完成,克隆出几个虚拟机作为slave节点。
阶段四:安装并配置网络插件
在master机上,为了使集群中的pod能够互相通信,需要安装对应的网络插件,此处仅在master机上安装即可。
完成master node的配置之后(相同配置通过克隆设置于slave node上)
配置网络插件,有很多选择,此处选用flannel:
通过以下命令查看Namespace,与前文相比多了kube-flannel命名空间(此处已安装完成):

需要在kubeadm init 时设置 --pod-network-cidr=10.244.0.0/16,如果先前没有进行相应设置,reset掉并重新设置,此处不再赘述。
命令如下:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
国内环境大概率无法直连github,会出现timeout,可以直接访问复制/下载。

将对应yml文件下载到master节点处,执行:
kubectl apply -f kube-flannel.yml
此时,kubectl get pod --all-namespaces查看pod状态,发现
Flannel pod始终处于CrashLoopBackOff状态,且doredns保持ContainerCreating状态。

命令journalctl -xeu kubelet查看kubelet报错信息:
Error syncing pod, skipping" err="failed to \"StartContainer\" for \"kube-flannel\" with CrashLoopBackOff: \"back-off 2m40s restartin
查看具体pod的log,命令为:
kubectl get pod --all-namespaces #查询pod的具体名字和状态
kubectl logs -n kube-flannel kube-flannel-ds-gg9kr #查询具体pod的log
报错信息如下:
E1224 12:38:12.602471 1 main.go:327] Error registering network: failed to acquire lease: subnet "10.224.0.0/16" specified in the flannel net config doesn't contain "10.244.0.0/24" PodCIDR of the "ubuntu" node
将前文kube-flannel.yml中对应json修改为master节点的IP

再次执行kubectl apply -f kube-flannel.yml,restart后,flannel正常工作。
flannel会间断时间restart,可以通过watch -n1 kubectl get pods -A命令查看实时状态。

至此,master节点配置完成,将slave节点join进入容器组中。
阶段五:尝试在k8s上部署一个应用
由于本地资源限制,此处暂时采用单机部署,在master节点上调度pod,命令如下:
kubectl taint nodes --all node-role.kubernetes.io/master-
由于此时节点暂时没有master属性,使用control-plane替代:

kubectl taint nodes --all node-role.kubernetes.io/control-plane-:
部署应用,通常需要编写yaml文件,来说明应用的各项属性、资源占用、版本等。
此处nginx应用的yaml文件来自于教程:
https://blog.csdn.net/piaoruiqing/article/details/102511315

Master节点默认不允许调度pod,因此在只有一个master节点的情况下,部署的应用处于pending状态。

查看该pod的状态,命令为:kubectl describe pod nginx-pod

显示untolerated taint node,master节点为污点,即在该节点上不允许pod运行调度。
命令kubectl describe nodes ubuntu | grep -i taint查看节点调度限制。
使用以下命令解除单节点pod调度限制:

Master节点上可以调度pod,应用部署成功,状态正常:

使用dashboard,图形化界面便于应用的部署与调度:
从https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml 中下载并获取对应的应用yaml信息,部署应用:


在master节点处创建证书:

Windows客户端下导入该证书:

浏览器登录,选择证书:

顺利进入dashboard的管理界面,可以开始配置并使用:

修改命令中关于token的设置项并重启设置:


生成登录使用的token:


进入主界面:

查看节点状态:

至此,基本完成在本地部署一个k8s集群的工作,此时只有单节点可用,如法炮制将其余节点加入集群。
浙公网安备 33010602011771号