安装k8s的前置操作
1.检查主机名、MAC 地址或 product_uuid,不能有重复值
ifconfig -a,对于linux主机,查看ens开头的网络接口,MAC 地址会以类似于 00:1a:2b:3c:4d:5e 的格式显示
hostname,查看主机名
hostnamectl set-hostname xxx 设置主机名
2.开启相关端口
控制平面:
| 协议 | 方向 | 端口范围 | 目的 | 使用者 |
|---|---|---|---|---|
| TCP | 入站 | 6443 | Kubernetes API server | 所有 |
| TCP | 入站 | 2379-2380 | etcd server client API | kube-apiserver, etcd |
| TCP | 入站 | 10250 | Kubelet API | 自身, 控制面 |
| TCP | 入站 | 10259 | kube-scheduler | 自身 |
| TCP | 入站 | 10257 | kube-controller-manager | 自身 |
工作节点:
| 协议 | 方向 | 端口范围 | 目的 | 使用者 |
|---|---|---|---|---|
| TCP | 入站 | 10250 | Kubelet API | 自身, 控制面 |
| TCP | 入站 | 30000-32767 | NodePort Services† | 所有 |
如果图省事,可以永久关闭防火墙:
sudo ufw disable
3.交换分区的配置
kubelet 的默认行为是在节点上检测到交换内存时无法启动。
自 v1.28 起,仅针对 cgroup v2 支持交换分区; kubelet 的 NodeSwap 特性门控处于 Beta 阶段,但默认被禁用。
如果 kubelet 未被正确配置使用交换分区,则必须禁用交换分区。
swapoff -a
临时关闭swap分区,重启后重置
sed -ri 's/.*swap.*/#&/' /etc/fstab
- `sed`: 是一个流编辑器,用来处理文本文件。
- `-r`: 这个选项允许使用扩展的正则表达式。
- `-i`: 这个选项代表原地编辑,它会直接修改文件内容,而不是仅仅输出到终端。
- `'s/.*swap.*/#&/'`: 这个部分是 `sed` 的替换命令,它使用了正则表达式。在这里,它会搜索文件中所有包含 `swap` 的行,并在这些行的开头加上 `#`,从而将其注释掉。
- `/etc/fstab`: 这是需要编辑的文件路径,`/etc/fstab` 是一个配置文件,它包含了文件系统表,用于描述硬盘分区和存储设备以及它们的挂载点。
这个命令的目的是将 `/etc/fstab` 文件中所有包含 `swap` 的行注释掉,以防止系统在启动时自动挂载 swap 分区。
4.转发 IPv4 并让 iptables 看到桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
这个命令的作用是将 overlay 和 br_netfilter 写入文件 /etc/modules-load.d/k8s.conf 中。overlay 模块用于 Docker 存储驱动,而 br_netfilter 模块则用于实现 Kubernetes 网络功能。通过将它们写入配置文件,系统在启动时就会自动加载这些内核模块。
sudo modprobe overlay
sudo modprobe br_netfilter
modprobe 命令用于加载指定的Linux 内核模块,并自动解决可能的依赖关系。
sudo modprobe overlay 用于加载 overlay 模块。overlay 模块通常用于支持 Docker 存储驱动,特别是在使用 overlay 存储驱动时。
sudo modprobe br_netfilter 用于加载 br_netfilter 模块。这个模块用于实现 Linux 网桥的网络功能。在 Kubernetes 中,这个模块常用于支持网络插件,比如 calico 和 flannel。
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
net.bridge.bridge-nf-call-iptables = 1 会确保在网络转发时会调用 iptables 进行处理。
net.bridge.bridge-nf-call-ip6tables = 1 会确保在网络转发时会调用 ip6tables 进行处理。
net.ipv4.ip_forward = 1 会启用 IPv4 的数据包转发。
这些配置通常在安装和配置 Kubernetes 时需要修改,以确保节点能够正确地进行网络转发并允许 Kubernetes 网络正常工作。通过将这些配置写入文件,系统在启动时会自动应用这些配置。
sudo sysctl --system
该命令会重新加载 /etc/sysctl.d/ 中的所有配置文件,以便立即应用新的内核参数设置,而无需重启系统。 sysctl --system 用于重新加载 sysctl 配置,使更改的网络参数立即生效。
5.检查容器运行时的cgroup驱动
kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、内存这类资源设置请求和限制。若要对接控制组,kubelet 和容器运行时需要使用一个 cgroup 驱动。 关键的一点是 kubelet 和容器运行时需使用相同的 cgroup 驱动并且采用相同的配置。
可用的 cgroup 驱动有两个:cgroupfs,systemd
cgroupfs 驱动是 kubelet 中默认的 cgroup 驱动。当 systemd 是初始化系统时, 不推荐使用 cgroupfs 驱动。
要将 systemd 设置为 cgroup 驱动,需编辑 KubeletConfiguration 的 cgroupDriver 选项,并将其设置为 systemd。
docker info | grep -i cgroup
tips:在 Kubernetes v1.28 中,启用 KubeletCgroupDriverFromCRI 特性门控结合支持 RuntimeConfig CRI RPC 的容器运行时,kubelet 会自动从运行时检测适当的 Cgroup 驱动程序,并忽略 kubelet 配置中的 cgroupDriver 设置。
6.安装容器运行时接口 CRI
CRI 是一个插件接口,它使 kubelet 能够使用各种容器运行时,无需重新编译集群组件。Kubernetes 容器运行时接口(Container Runtime Interface;CRI)定义了主要 gRPC 协议, 用于集群组件 kubelet 和容器运行时之间的通信。
使用 cri-dockerd 适配器来将 Docker Engine 与 Kubernetes 集成。
tips:v1.24 之前的 Kubernetes 版本直接集成了 Docker Engine 的一个组件,名为 dockershim。 这种特殊的直接整合不再是 Kubernetes 的一部分 。
下载
1. 在https://github.com/Mirantis/cri-dockerd/releases 下载预编译的二进制文件
2.wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.6/cri-dockerd-0.3.6.amd64.tgz
tar -xf cri-dockerd-0.3.6.amd64.tgz
-x 选项用于指定要解压缩归档文件。
-f 选项用于指定要处理的归档文件名。
安装
官方步骤(执行完成后会发现cri-docker.service启动不正常)
git clone https://github.com/Mirantis/cri-dockerd.git
install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
将下载的二进制文件安装到 /usr/local/bin/ 目录下,并设置所有者为 root 用户,组为 root 组,权限设置为 0755。
cd cri-dockerd
install packaging/systemd/* /etc/systemd/system
将位于 packaging/systemd/ 目录下的所有文件安装到 /etc/systemd/system 目录中。这样做的目的通常是安装一些与 systemd 服务管理有关的配置文件。这些文件可能包括服务单元配置文件(以 .service 结尾)等。
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable --now cri-docker.socket
在/etc/systemd/system/cri-docker.service文件中找到/usr/bin/cri-dockerd这个路径,并用/usr/local/bin/cri-dockerd来替换它。
systemctl daemon-reload:重新加载 systemd 管理的服务配置。
systemctl enable --now cri-docker.socket:启用并立即启动名为 cri-docker.socket 的 systemd 单元。
补救措施
sudo vim /etc/systemd/system/cri-docker.service
ExecStart=/usr/local/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
编辑ExecStart字段,更换为上述内容(tips:pause:3.9这个版本应与kubeadm要求版本一致)
systemctl daemon-reload && systemctl enable cri-docker && systemctl start cri-docker && systemctl enable --now cri-docker.socket
重新启动cri-docker的相关服务

浙公网安备 33010602011771号