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 link或ifconfig -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/fstab或systemd.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
-
下载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 -
设置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
- 启动
systemctl daemon-reload systemctl enable --now containerd
安装Runc
- 从 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 插件
- 从 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 不能帮你安装或者管理 kubelet 或 kubectl, 所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 之间可以存在一个次要版本的偏差,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。
有关安装 kubectl 的信息,请参阅安装和设置 kubectl 文档。
以下指令适用于 Kubernetes 1.34.
- 更新
apt包索引并安装使用 Kubernetesapt仓库所需要的包:
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
- 下载用于 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
/etc/apt/keyrings 默认不存在。 应在 curl 命令之前创建它。
-
添加 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 -
更新
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)
-
查看当前 cgroup 驱动
# 检查 containerd 当前配置 sudo containerd config dump | grep SystemdCgroup # 检查系统 cgroup 版本 stat -fc %T /sys/fs/cgroup/ # 如果显示 cgroup2fs,说明是 cgroup v2(必须用 systemd) -
生成默认配置文件(如果不存在)
# 如果 /etc/containerd/config.toml 不存在,生成默认配置 sudo mkdir -p /etc/containerd sudo containerd config default | sudo tee /etc/containerd/config.toml -
根据版本修改 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 驱动。
- sudo systemctl daemon-reload sudo systemctl restart containerd
配置 kubelet 的 cgroup 驱动
- 在版本 1.22 及更高版本中,如果用户没有在
KubeletConfiguration中设置cgroupDriver字段,kubeadm会将它设置为默认值systemd。
初始化集群
- 创建配置文件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"
- ```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 ```
-
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 -
kubeadm init --config kubeadm-config-calico-hw.yaml
-
```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
节点加入的前提条件
-
控制平面节点必须完成的步骤
# 在控制平面节点上检查: # ✅ 集群已初始化成功 kubectl get nodes # ✅ 网络插件已安装且运行正常 kubectl get pods -A # ✅ 获取加入集群的命令 kubeadm token create --print-join-command -
工作节点需要满足的条件
# ✅ 相同的操作系统环境 # ✅ 容器运行时已安装(containerd/docker) # ✅ kubeadm、kubelet、kubectl 已安装 # ✅ 网络连通性(能访问控制平面节点的 6443 端口) # ✅ 关闭 swap -
在共工作节点执行1中获取的加入集群命令
kubeadm join 172.30.24.210:6443 --token fcnap0.6mftjxx9av57qfxy --discovery-token-ca-cert-hash sha256:4893fa99219e17a52df43faade00860465e4826e65b9a2c728f777b9b5a5baed -
如果镜像拉不动
# 导出镜像(需要知道完整的镜像名称)
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