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。
安装和配置先决条件
- 启用 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_forward2.cgroup 驱动
在 Linux 上,控制组(CGroup)用于限制分配给进程的资源
kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、内存这类资源设置请求和限制
若要对接控制组,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 containerd2.CRI-O
CRI-O 默认使用 systemd cgroup 驱动
配置文件路径:
1 2 /etc/crio/crio.conf /etc/crio/crio.conf.d/02-cgroup-manager.confCRI 套接字默认为: /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-dockerdcri-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.31kubeadm 中 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集群
###