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集群的工作,此时只有单节点可用,如法炮制将其余节点加入集群。

 

 

posted @ 2023-10-20 10:00  真昼小天使daisuki  阅读(638)  评论(0)    收藏  举报