由于之前很少使用Ubuntu系统,这次使用Ubuntu系统熟悉一下,Kubeadm+Docker+cri-docker的组合模式部署搭建最简单的一个Kubernetes集群
一、环境准备
- OS:Ubuntu 20.04
- Kubernetes:v1.28.2
- Container Runtime:Docker CE 24.0.7
- CRI:cri-docker v0.3.7
本次共使用3台虚拟机,一台做master,两台做work_node,如下准备工作在3台虚拟机上同时设置
IP地址 | 主机名 | 配置说明 |
10.49.33.100 | kubeapi.likai.com | 可以是一个VIP |
10.49.33.241 | k8s-master01 k8s-master.liaki.com | 1、启用ssh服务 2、设置时间同步 3、禁用swap 4、禁用ufw |
10.49.33.242 | k8s-node01 k8s-node01.likai.com | |
10.49.33.243 | k8s-node02 k8s-node02likai.com |
1、开启ssh服务,允许root远程登录
2、设置时间同步
~# apt install chrony
~# systemctl start chrony.service
修改节点的/etc/chrony/chrony.conf配置文件,并将时间服务器指向相应的主机即可,配置格式如下:
server CHRONY-SERVER-NAME-OR-IP iburst 3、主机名解析
4、禁用swap
~# swapoff -a
5、禁用ufw
~# ufw disable
~# ufw status
二、安装程序包
安装docker
首先,生成docker-ce相关程序包的仓库,这里以阿里云的镜像服务器为例进行说明:
~# apt -y install apt-transport-https ca-certificates curl software-properties-common
~# curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
~# add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
~# apt update
~# apt install docker-ce
kubelet需要让docker容器引擎使用systemd作为CGroup的驱动,其默认值为cgroupfs,因而,我们还需要编辑docker的配置文件/etc/docker/daemon.json,添加如下内容,其中的registry-mirrors用于指明使用的镜像加速服务。
提示:自Kubernetes v1.22版本开始,未明确设置kubelet的cgroup driver时,则默认即会将其设置为systemd。
配置完成后即可启动docker服务,并将其设置为随系统启动而自动引导:
~# systemctl daemon-reload
~# systemctl start docker.service
~# systemctl enable docker.service
安装cri-dockerd
Kubernetes自v1.24移除了对docker-shim的支持,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker 。
项目地址:https://github.com/Mirantis/cri-dockerd
cri-dockerd项目提供了预制的二进制格式的程序包,用户按需下载相应的系统和对应平台的版本即可完成安装,这里使用的Ubuntu20.04,所以选用
完成安装后,相应的服务cri-dockerd.service便会自动启动。我们也可以使用如下命令进行验证,若服务处于Running状态即可进行后续步骤 。
安装kubeadm、kubelet和kubectl
首先,在各主机上生成kubelet和kubeadm等相关程序包的仓库,这里以阿里云的镜像服务为例:
~# apt update && apt install -y apt-transport-https curl
~# curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
~# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
~# apt update
接着,在各主机安装kubelet、kubeadm和kubectl等程序包,并将其设置为随系统启动而自动引导:
~# apt install -y kubelet kubeadm kubectl
~# systemctl enable kubelet
安装完成后,要确保kubeadm等程序文件的版本,这将也是后面初始化Kubernetes集群时需要明确指定的版本号。
三、整合kubelet和cri-dockerd
仅支持CRI规范的kubelet需要经由遵循该规范的cri-dockerd完成与docker-ce的整合。
配置cri-dockerd
配置cri-dockerd,确保其能够正确加载到CNI插件。编辑/usr/lib/systemd/system/cri-docker.service文件,确保其[Service]配置段中的ExecStart的值类似如下内容。
这里有两个设置,一个是--pod-infra-container-image指定使用pause的镜像,这里指定的话,kubelet默认使用pause:3.6这个版本不容易下载;第二个设置就是cni网络插件的几个选项。
需要添加的各配置参数(各参数的值要与系统部署的CNI插件的实际路径相对应):
-
--network-plugin:指定网络插件规范的类型,这里要使用CNI;
-
--cni-bin-dir:指定CNI插件二进制程序文件的搜索目录;
-
--cni-cache-dir:CNI插件使用的缓存目录;
-
--cni-conf-dir:CNI插件加载配置文件的目录;
配置完成后,重载并重启cri-docker.service服务。
~# systemctl daemon-reload && systemctl restart cri-docker.service
配置kubelet
配置kubelet,为其指定cri-dockerd在本地打开的Unix Sock文件的路径,该路径一般默认为“/run/cri-dockerd.sock“。编辑文件/etc/sysconfig/kubelet,为其添加 如下指定参数。
提示:若/etc/sysconfig目录不存在,则需要先创建该目录。
四、初始化第一个主节点
该步骤开始尝试构建Kubernetes集群的master节点,配置完成后,各worker节点直接加入到集群中的即可。需要特别说明的是,由kubeadm部署的Kubernetes集群上,集群核心组件kube-apiserver、kube-controller-manager、kube-scheduler和etcd等均会以静态Pod的形式运行,它们所依赖的镜像文件默认来自于registry.k8s.io这一Registry服务之上。但我们无法直接访问该服务,本示例将选择使用国内镜像服务器上的服务。
初始化master节点(在master01上完成如下操作)
在运行初始化命令之前先运行如下命令单独获取相关的镜像文件,而后再运行后面的kubeadm init命令,以便于观察到镜像文件的下载过程。
使用国内镜像服务器
这里编写了一个镜像下载脚本,使用docker下载国内镜像,在三台机器上都运行该脚本下载进行,脚本如下:
而后即可进行master节点初始化。kubeadm init命令支持两种初始化方式,一是通过命令行选项传递关键的部署设定,另一个是基于yaml格式的专用配置文件,后一种允许用户自定义各个部署参数,在配置上更为灵活和便捷。下面分别给出了两种实现方式的配置步骤,建议读者采用第二种方式进行
初始化方式一
在k8s-master01上运行如下命令
~# kubeadm init --control-plane-endpoint="kubeapi.likai.com" --kubernetes-version=v1.28.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --cri-socket unix:///run/cri-dockerd.sock --upload-certs --image-repository=registry.aliyuncs.com/google_containers
初始化方式二
使用#kubeadm config print init-defaults命令获取配置框架,然后修改里面的内容选项到自己设定的配置,将修改后的选项保存在配置文件kubeadm-config.yaml中,然后使用命令初始化
~# kubeadm init --config kubeadm-config.yaml --upload-certs
初始化完成后的操作步骤
对于Kubernetes系统的新用户来说,无论使用上述哪种方法,命令运行结束后,请记录最后的kubeadm join命令输出的最后提示的操作步骤。下面的内容是需要用户记录的一个命令输出示例,它提示了后续需要的操作步骤。
# 第1个步骤提示, Kubernetes集群管理员认证到Kubernetes集群时使用的kubeconfig配置文件 # 第2个步骤提示,为Kubernetes集群部署一个网络插件,具体选用的插件则取决于管理员; # 第3个步骤提示,向集群添加额外的控制平面节点 # 第4个步骤提示,向集群添加工作节点 # 提示:与cri-dockerd结合使用docker-ce作为container runtime时,通常需要为下面的命令 # 额外附加“--cri-socket unix:///run/cri-dockerd.sock”选项;
部署网络插件
因为flannel不支持network plocy,所以这里直接部署calico
在GitHub上搜索calico项目,找到最新的release,这里下载了release-v3.26.4.tgz这个包,这个包里包含image,yaml文件,这样就可以本地导入image,不用等待image下载了
解压之后,images里是需要的image,可以使用for IMG in `ls images`docker image load -i $IMG;done全部导入,三个节点上都导入
manifasts目录下的calico.yaml文件中,修改CALICO_IPV4POOL_CIDR选项,将value内容改成本集群的pod网段地址,修改后apply部署calico即可
之后检查集群的pod和节点状态
引自文章