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 之类的工具来检查端口是否开放,例如
交换分区的配置¶
kubelet 的默认行为是在节点上检测到交换内存时无法启动。 这意味着要么禁用交换(swap)功能,要么让 kubelet 容忍交换。
- 若需允许交换分区(swap),请在 kubelet 配置文件中添加
failSwapOn: false,或通过命令行参数指定。 注意:即使设置了failSwapOn: false,工作负载默认情况下仍无法访问交换空间。 可以通过在 kubelet 配置文件中设置swapBehavior来修改此设置。若要使用交换空间, 请设置swapBehavior的值,这个值不能是默认的NoSwap。 更多细节参阅交换内存管理。 - 要禁用交换分区(swap),可以使用命令
sudo swapoff -a暂时关闭交换分区功能。 要使此更改在重启后仍然生效,请确保在系统的配置文件(如/etc/fstab或systemd.swap)中禁用交换功能, 具体取决于你的系统配置方式。
启用 IPv4 数据包转发¶
- 手动启用 IPv4 数据包转发:
- 使用以下命令验证
net.ipv4.ip_forward是否设置为 1:
安装Containerd¶
Doc:https://github.com/containerd/containerd/blob/main/docs/getting-started.md
-
下载containerd二进制包
-
设置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 -
启动
安装Runc¶
- 从 https://github.com/opencontainers/runc/releases 下载
runc.<ARCH>二进制文件,验证其 sha256sum,并将其安装为/usr/local/sbin/runc。
安装 CNI 插件¶
- 从 https://github.com/containernetworking/plugins/releases 下载存档,
cni-plugins-<OS>-<ARCH>-<VERSION>.tgz验证其 sha256sum,并将其解压到/opt/cni/bin下。
换个源¶
安装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仓库所需要的包: -
下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:
说明: 在低于 Debian 12 和 Ubuntu 22.04 的发行版本中,# 如果 `/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 版本的文档)。 -
更新
apt包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
配置 systemd cgroup 驱动(Containerd)¶
-
查看当前 cgroup 驱动
-
生成默认配置文件(如果不存在)
-
根据版本修改 Containerd 1.x 版本:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] ... [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = trueContainerd 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,则推荐
systemdcgroup 驱动。 -
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
-
创建 /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中获取的加入集群命令
-
如果镜像拉不动