安装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

    这个命令的作用是将 overlaybr_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 中,这个模块常用于支持网络插件,比如 calicoflannel

  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的相关服务

posted @ 2023-10-25 14:35  花都八达鸟  阅读(168)  评论(0)    收藏  举报