文章

kubeadm部署k8s集群

1. 环境依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
基础资源
1. 2+核, 2+GB内存,Linux主机
2. 节点之中不可以有重复的主机名、MAC 地址或 product_uuid
	1. 使用命令 ip link 或 ifconfig -a 来获取网络接口的 MAC 地址
	2. cat /sys/class/dmi/id/product_uuid 对 product_uuid 校验
3. 开启机器上的某些端口
	1. nc 127.0.0.1 6443 -v
	2. Pod 网络插件 (详见后续章节) 也可能需要开启某些特定端口。
4. 交换分区的配置
	1. 如果 kubelet 未被正确配置使用交换分区,则你必须禁用交换分区
5. 安装容器运行时: 为了在 Pod 中运行容器,Kubernetes 使用容器运行时(Container Runtime)
	1. 默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互
	2. 如果你不指定运行时,kubeadm 会自动尝试通过扫描已知的端点列表来检测已安装的容器运行时

安装容器运行时, CRI 版本支持

注意:

v1.24 之前的 Kubernetes 版本直接集成了 Docker Engine 的一个组件,名为 dockershim。

安装和配置先决条件

  1. 启用 IPv4 数据包转发
1
2
3
4
5
6
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system

使用以下命令验证 net.ipv4.ip_forward 是否设置为 1:

1
sysctl net.ipv4.ip_forward

2.cgroup 驱动

  1. 在 Linux 上,控制组(CGroup)用于限制分配给进程的资源

  2. kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、内存这类资源设置请求和限制

  3. 若要对接控制组,kubelet 和容器运行时需要使用一个 cgroup 驱动。 关键的一点是 kubelet 和容器运行时需使用相同的 cgroup 驱动并且采用相同的配置

说明:

从 v1.22 开始,在使用 kubeadm 创建集群时,如果用户没有在 KubeletConfiguration 下设置 cgroupDriver 字段,kubeadm 默认使用 systemd。

cgroup 驱动有两个:

cgroupfs: 是 kubelet 中默认的 cgroup 驱动。 当使用 cgroupfs 驱动时, kubelet 和容器运行时将直接对接 cgroup 文件系统来配置 cgroup

systemd

1.containerd 系统上安装 containerd,创建有效的 config.toml 配置文件后返回此步骤

注意: 安装Docker时默认使用的也是containerd服务

Linux

配置文件路径: /etc/containerd/config.toml

CRI 套接字是: /run/containerd/containerd.sock

说明:

如果你从软件包(例如,RPM 或者 .deb)中安装 containerd,你可能会发现其中默认禁止了 CRI 集成插件

启用 CRI 支持:

1
2
在 /etc/containerd/config.toml 文件中 disabled_plugins 列表内 删除 cri
改完之后 要重启 containerd: systemctl restart containerd

重载沙箱(pause)镜像:

配置文件中修改

1
2
[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.k8s.io/pause:3.2" 改完之后 要重启 containerd: systemctl restart containerd

2.CRI-O

CRI-O 默认使用 systemd cgroup 驱动

配置文件路径:

1
2
/etc/crio/crio.conf
/etc/crio/crio.conf.d/02-cgroup-manager.conf

CRI 套接字默认为: /var/run/crio/crio.sock

切换为 cgroupfs cgroup 驱动: 在上方配置文件中 任意一个插入以下配置

1
2
3
[crio.runtime]
conmon_cgroup = "pod"
cgroup_manager = "cgroupfs"

CRI-O 的 cgroup 设置为 cgroupfs 时,必须将 conmon_cgroup 设置为值 pod

通常需要保持 kubelet 的 cgroup 驱动配置(通常通过 kubeadm 完成)和 CRI-O 同步

重载沙箱(pause)镜像

1
2
[crio.image]
pause_image="registry.k8s.io/pause:3.6"

3.Docker Engine

需要配合 cri-dockerd 与k8s连接

每个节点上都需要:

1
2
安装 Docker Engine 
安装 cri-dockerd

cri-dockerd CRI 套接字是: /run/cri-dockerd.sock

4.Mirantis Container Runtime

以前称为 Docker 企业版

查看使用了那种CGroup驱动

Docker

1
2
3
4
docker info | grep "Cgroup Driver"

# 输出如下:
Cgroup Driver: systemd

配置文件: /etc/docker/daemon.json

1
2
3
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

Kubernetes

1
2
3
4
5
kubectl describe node [node-name] | grep "Cgroup Driver"

# 输出如下
Cgroup Driver: systemd
Cgroup Driver: cgroupfs

配置文件: /etc/default/kubelet 或 /etc/sysconfig/kubelet

1
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock --cgroup-driver=systemd"

系统级别检查

1
2
3
4
cat /etc/systemd/system.conf | grep "CGroup"

# 类似以下内容
#CGroupSubsystems=cpu,cpuacct,blkio,cpuset,freezer,devices,memory,pids

看到了相关的 CGroup 配置,并且没有禁用 systemd,那么可以确认你的系统默认使用 systemd 来管理 cgroup

安装软件包

1.每台机器上安装以下的软件包

1
2
3
kubeadm:用来初始化集群的指令
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl:用来与集群通信的命令行工具。


kubeadm 中的 Kubernetes 版本偏差

1.kubeadm 可以与 Kubernetes 组件一起使用,这些组件的版本与 kubeadm 相同,或者比它大一个版本

2.Kubernetes 版本可以通过使用 –kubeadm init–kubernetes-version 标志或使用 –config 时的 ClusterConfiguration.kubernetesVersion 字段指定给 kubeadm

比如:

1
2
kubeadm 的版本为 1.32, 
kubernetesVersion 必须为 1.32 或者 1.31

kubeadm 中 kubelet 的版本偏差

1
与 Kubernetes 版本类似,kubeadm 可以使用与 kubeadm 相同版本的 kubelet, 或者比 kubeadm 老三个版本的 kubelet。

比如:

1
2
kubeadm 的版本为 1.32。
主机上的 kubelet 必须为 1.32、1.31、 1.30 或 1.29。

kubeadm 支持的 kubeadm 的版本偏差

kubeadm 命令在现有节点或由 kubeadm 管理的整个集群上的操作有一定限制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
如果新的节点加入到集群中

用于 kubeadm join 的 kubeadm 二进制文件  必须与 用 kubeadm init 创建集群或用 kubeadm upgrade 升级同一节点时所用的 kubeadm 版本一致。

================================================================

类似的规则适用于除了 kubeadm upgrade 以外的其他 kubeadm 命令
 
================================================================
 
 kubeadm join 的例子
	 使用 kubeadm init 创建集群时使用版本为 1.32 的 kubeadm。
	 添加节点所用的 kubeadm 可执行文件为版本(版本也为 1.32)

================================================================

对于正在升级的节点,所使用的的 kubeadm 必须与管理该节点的 kubeadm 具有相同的 MINOR 版本或比后者新一个 MINOR 版本。

================================================================

kubeadm upgrade 的例子:
	用于创建或升级节点的 kubeadm 版本为 1.31。
	用于升级节点的 kubeadm 版本必须为 1.31 或 1.32。

kubernetes 版本偏差策略:

1
Kubernetes 版本以 x.y.z 表示,其中 x 是主要版本, y 是次要版本,z 是补丁版本,遵循语义版本控制术语。 

详细地址: 版本偏差策略

安装k8s集群

###

本文由作者按照 CC BY 4.0 进行授权