跳转至

Kubernetes

安装

Kubeadm初始化集群

检查操作系统版本

  • kubeadm 项目支持 LTS 内核。参阅 LTS 内核列表
  • 你可以使用命令 uname -r 获取内核版本。
Version Maintainer Released Projected EOL
6.12 Greg Kroah-Hartman & Sasha Levin 2024-11-17 Dec, 2026
6.6 Greg Kroah-Hartman & Sasha Levin 2023-10-29 Dec, 2026
6.1 Greg Kroah-Hartman & Sasha Levin 2022-12-11 Dec, 2027
5.15 Greg Kroah-Hartman & Sasha Levin 2021-10-31 Dec, 2026
5.10 Greg Kroah-Hartman & Sasha Levin 2020-12-13 Dec, 2026
5.4 Greg Kroah-Hartman & Sasha Levin 2019-11-24 Dec, 2025

MAC 地址 & product_uuid

确保每个节点上 MAC 地址和 product_uuid 的唯一性

  • 你可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址
  • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验

检查网络适配器

如果你有一个以上的网络适配器,同时你的 Kubernetes 组件通过默认路由不可达,我们建议你预先添加 IP 路由规则, 这样 Kubernetes 集群就可以通过对应的适配器完成连接。

检查所需端口

启用这些必要的端口后才能使 Kubernetes 的各组件相互通信。 可以使用 netcat 之类的工具来检查端口是否开放,例如

nc 127.0.0.1 6443 -zv -w 

交换分区的配置

kubelet 的默认行为是在节点上检测到交换内存时无法启动。 这意味着要么禁用交换(swap)功能,要么让 kubelet 容忍交换。

  • 若需允许交换分区(swap),请在 kubelet 配置文件中添加 failSwapOn: false,或通过命令行参数指定。 注意:即使设置了 failSwapOn: false,工作负载默认情况下仍无法访问交换空间。 可以通过在 kubelet 配置文件中设置 swapBehavior 来修改此设置。若要使用交换空间, 请设置 swapBehavior 的值,这个值不能是默认的 NoSwap。 更多细节参阅交换内存管理
  • 要禁用交换分区(swap),可以使用命令 sudo swapoff -a 暂时关闭交换分区功能。 要使此更改在重启后仍然生效,请确保在系统的配置文件(如 /etc/fstabsystemd.swap)中禁用交换功能, 具体取决于你的系统配置方式。

启用 IPv4 数据包转发

  • 手动启用 IPv4 数据包转发:
    # 设置所需的 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:
    sysctl net.ipv4.ip_forward
    

安装Containerd

Doc:https://github.com/containerd/containerd/blob/main/docs/getting-started.md

  1. 下载containerd二进制包

    wget https://github.com/containerd/containerd/releases/download/v1.7.29/containerd-1.7.29-linux-amd64.tar.gz
    
    tar Cxzvf /usr/local containerd-1.7.29-linux-amd64.tar.gz
    

  2. 设置systemd

    • 创建 /usr/lib/systemd/system/containerd.service
    # Copyright The containerd Authors.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    [Unit]
    Description=containerd container runtime
    Documentation=https://containerd.io
    After=network.target dbus.service
    
    [Service]
    ExecStartPre=-/sbin/modprobe overlay
    ExecStart=/usr/local/bin/containerd
    
    Type=notify
    Delegate=yes
    KillMode=process
    Restart=always
    RestartSec=5
    
    # Having non-zero Limit*s causes performance problems due to accounting overhead
    # in the kernel. We recommend using cgroups to do container-local accounting.
    LimitNPROC=infinity
    LimitCORE=infinity
    
    # Comment TasksMax if your systemd version does not supports it.
    # Only systemd 226 and above support this version.
    TasksMax=infinity
    OOMScoreAdjust=-999
    
    [Install]
    WantedBy=multi-user.target
    
  3. 启动

    systemctl daemon-reload
    systemctl enable --now containerd
    

安装Runc

  1. 从 https://github.com/opencontainers/runc/releases 下载 runc.<ARCH> 二进制文件,验证其 sha256sum,并将其安装为 /usr/local/sbin/runc
    wget https://github.com/opencontainers/runc/releases/download/v1.3.1/runc.amd64
    
    install -m 755 runc.amd64 /usr/local/sbin/runc
    
    runc --version
    

安装 CNI 插件

  1. 从 https://github.com/containernetworking/plugins/releases 下载存档, cni-plugins-<OS>-<ARCH>-<VERSION>.tgz 验证其 sha256sum,并将其解压到 /opt/cni/bin 下。
    wget https://github.com/containernetworking/plugins/releases/download/v1.8.0/cni-plugins-linux-amd64-v1.8.0.tgz
    
    mkdir -p /opt/cni/bin
    tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.8.0.tgz
    

换个源

sudo sed -i 's/mirrors.tuna.tsinghua.edu.cn/mirrors.huaweicloud.com/g' /etc/apt/sources.list

安装kubelet kubeadm kubectl

你需要在每台机器上安装以下的软件包:

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

kubeadm 不能帮你安装或者管理 kubeletkubectl, 所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 之间可以存在一个次要版本的偏差,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。

有关安装 kubectl 的信息,请参阅安装和设置 kubectl 文档。

以下指令适用于 Kubernetes 1.34.

  1. 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:

    sudo apt-get update
    # apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
    sudo apt-get install -y apt-transport-https ca-certificates curl gpg
    
  2. 下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:

    # 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
    # sudo mkdir -p -m 755 /etc/apt/keyrings
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    
    说明: 在低于 Debian 12 和 Ubuntu 22.04 的发行版本中,/etc/apt/keyrings 默认不存在。 应在 curl 命令之前创建它。

  3. 添加 Kubernetes apt 仓库。 请注意,此仓库仅包含适用于 Kubernetes 1.34 的软件包; 对于其他 Kubernetes 次要版本,则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本 (你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档)。

    # 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    

  4. 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:

    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
    

配置 systemd cgroup 驱动(Containerd)

  1. 查看当前 cgroup 驱动

    # 检查 containerd 当前配置
    sudo containerd config dump | grep SystemdCgroup
    
    # 检查系统 cgroup 版本
    stat -fc %T /sys/fs/cgroup/
    # 如果显示 cgroup2fs,说明是 cgroup v2(必须用 systemd)
    

  2. 生成默认配置文件(如果不存在)

    # 如果 /etc/containerd/config.toml 不存在,生成默认配置
    sudo mkdir -p /etc/containerd
    sudo containerd config default | sudo tee /etc/containerd/config.toml
    

  3. 根据版本修改 Containerd 1.x 版本:

    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
      ...
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
        SystemdCgroup = true
    

    Containerd versions 2.x 版本:

    [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc]
      ...
      [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]
        SystemdCgroup = true
    

    如果你使用 cgroup v2,则推荐 systemd cgroup 驱动。

  4. sudo systemctl daemon-reload sudo systemctl restart containerd

配置 kubelet 的 cgroup 驱动

  • 在版本 1.22 及更高版本中,如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段, kubeadm 会将它设置为默认值 systemd

初始化集群

  1. 创建配置文件kubeadm-config-calico-hw.yaml
# kubeadm-config-calico-hw.yaml
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: "172.30.24.210"  # 替换为你的节点IP
  bindPort: 6443
nodeRegistration:
  criSocket: "unix:///var/run/containerd/containerd.sock"
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: "v1.34.0"
networking:
  podSubnet: "192.168.0.0/16"
  serviceSubnet: "10.96.0.0/12" 
imageRepository: "registry.cn-hangzhou.aliyuncs.com/google_containers"  # 华为云镜像源
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: "systemd"
  1. ```bash # 查看当前版本默认的镜像列表 kubeadm config images list

    # 查看指定版本的镜像列表 kubeadm config images list --kubernetes-version v1.34.0

    # 拉取所有所需镜像 kubeadm config images pull

    # 指定配置文件拉取 kubeadm config images pull --config kubeadm-config.yaml

    #手动拉 sudo ctr -n k8s.io images pull registry.k8s.io/pause:3.8 sudo ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8

    sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers ```

  2. containerd换源

    • vim /etc/containerd/config.toml
    ...
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    
            [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
              endpoint=["https://docker.m.daocloud.io"]
    ...
    
    • sudo systemctl restart containerd sudo systemctl status containerd
  3. kubeadm init --config kubeadm-config-calico-hw.yaml

  4. ```shell Your Kubernetes control-plane has initialized successfully!

    To start using your cluster, you need to run the following as a regular user:

    mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

    Alternatively, if you are the root user, you can run:

    export KUBECONFIG=/etc/kubernetes/admin.conf ```

containerd设置仓库http

  • vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
      config_path = "/etc/containerd/certs.d"
  • 创建 /etc/containerd/certs.d

    创建/etc/containerd/certs.d/172.30.24.201:30002 vim 172.30.24.201:30002/hosts.toml

server = "http://172.30.24.201:30002"

[host."http://172.30.24.201:30002"]
  capabilities = ["pull", "resolve", "push"]
  skip_verify = true

节点加入的前提条件

  1. 控制平面节点必须完成的步骤

    # 在控制平面节点上检查:
    # ✅ 集群已初始化成功
    kubectl get nodes
    # ✅ 网络插件已安装且运行正常
    kubectl get pods -A
    # ✅ 获取加入集群的命令
    kubeadm token create --print-join-command
    
  2. 工作节点需要满足的条件

    # ✅ 相同的操作系统环境
    # ✅ 容器运行时已安装(containerd/docker)
    # ✅ kubeadm、kubelet、kubectl 已安装
    # ✅ 网络连通性(能访问控制平面节点的 6443 端口)
    # ✅ 关闭 swap
    
  3. 在共工作节点执行1中获取的加入集群命令

    kubeadm join 172.30.24.210:6443 --token fcnap0.6mftjxx9av57qfxy --discovery-token-ca-cert-hash sha256:4893fa99219e17a52df43faade00860465e4826e65b9a2c728f777b9b5a5baed
    

  4. 如果镜像拉不动

    # 导出镜像(需要知道完整的镜像名称)
    ctr -n=k8s.io images export kube-ovn.tar docker.io/kubeovn/kube-ovn:v1.10.0
    
    # 如果不确定完整镜像名,先列出所有镜像
    ctr -n=k8s.io images ls
    
    #导入
    ctr -n=k8s.io images import kube-ovn.tar