kubeadm 高可用集群建设 Hands-on

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。
本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
API Application Programming Interface 应用程序编程接口
AZ Availability Zone 可用区
BGP Border Gateway Protocol 边界网关协议
CA Certificate Authority 证书颁发机构
CCM Cloud Controller Manager Kubernetes 云控制器管理器
CNI Container Network Interface 容器网络接口
CPU Central Processing Unit 中央处理器
CSI Container Storage Interface 容器存储接口
DNS Domain Name System 域名系统
EKS Elastic Kubernetes Service AWS 托管 Kubernetes 服务
GKE Google Kubernetes Engine Google 托管 Kubernetes 服务
HA High Availability 高可用
IP Internet Protocol 网际协议;IP 地址是网络寻址标识
LB Load Balancer 负载均衡器
OIDC OpenID Connect 基于 OAuth 2.0 的身份认证协议
OS Operating System 操作系统
PKI Public Key Infrastructure 公钥基础设施
RPO Recovery Point Objective 恢复点目标,可接受的数据丢失时间范围
RTO Recovery Time Objective 恢复时间目标,可接受的恢复耗时
SHA256 Secure Hash Algorithm 256-bit 256 位安全散列算法,常写为 SHA-256
SSD Solid-State Drive 固态硬盘
TOML Tom’s Obvious, Minimal Language 一种配置文件格式
vCPU Virtual CPU 虚拟处理器
VIP Virtual IP address 虚拟 IP 地址
VPC Virtual Private Cloud 虚拟私有云网络
VPN Virtual Private Network 虚拟专用网络
VXLAN Virtual Extensible LAN 虚拟可扩展局域网;LAN 为 Local Area Network(局域网)

范围:新建自管 Linux 集群;Ubuntu 24.04、containerd 2.x、kubeadm v1beta4 配置。现有集群不要重跑 init/reset。前置:实践约定、三台控制面+三台 worker,独立主机/故障域、固定私网 IP、时间同步、企业镜像出口。

1. 固定网络与容量#

项目 本文示例,必须先查重
控制面 cp1/2/3:10.20.0.11–13;各至少 4 vCPU/8GiB、低延迟 SSD
API 企业冗余四层 LB:api.k8s.internal:6443;后端三台控制面 6443
Pod / Service 10.244.0.0/16 / 10.96.0.0/12;不与办公/VPN/VPC/其他集群重叠
防火墙 管理端/节点→API 6443;控制面间 etcd 2379–2380;控制面→kubelet 10250;CNI 所需端口按模式放行
身份与备份 独立管理员、OIDC、离线保护 CA/解密材料、外部 etcd 备份存储

LB 在 init 前建好,DNS 指向 VIP。三台 LB 后端必须能健康探测;不要把单台 HAProxy 叫高可用入口。控制面保留默认 taint,不混跑业务;磁盘和 CPU 数值只是启动基线,容量以压测为准。

2. 所有节点配置内核与运行时#

以下在全新节点执行,已安装的企业 runtime 不覆盖配置:

sudo swapoff -a
# 编辑 /etc/fstab 禁用对应 swap 条目;不要误删其他挂载。
printf 'overlay\nbr_netfilter\n' | sudo tee /etc/modules-load.d/k8s.conf
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<'EOF' | sudo tee /etc/sysctl.d/99-kubernetes.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
EOF
sudo sysctl --system

从企业 OS 软件源安装已审核、固定版本的 containerd 2.x 与 runc;记录来源、版本、SHA256。示例假设企业源的 runtime 包名为 containerd.io(可能已包含 runc,不重复安装冲突包):

sudo apt-get update
apt-cache madison containerd.io
export CONTAINERD_PACKAGE_VERSION='REPLACE_APPROVED_2_X_PACKAGE_VERSION'
sudo apt-get install -y containerd.io="$CONTAINERD_PACKAGE_VERSION"
sudo apt-mark hold containerd.io
runc --version

企业包名/依赖不同则按源调整,crictl 同样使用审核版本。生成默认配置后,只修改实际生效的 runc 配置块:

containerd --version
sudo mkdir -p /etc/containerd
sudo sh -c 'containerd config default > /etc/containerd/config.toml'
sudoedit /etc/containerd/config.toml

containerd 2.x 目标 TOML 配置:

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

确认 disabled_plugins 不包含 cri。containerd 1.x 的路径不同,不能套用本段;容器 runtime 与 kubelet 的 cgroup driver 都使用 systemd。

sudo systemctl enable --now containerd
sudo systemctl restart containerd
sudo ctr plugins ls
sudo crictl --runtime-endpoint unix:///run/containerd/containerd.sock info

3. 安装同一精确 Kubernetes 版本#

所有节点执行,K8S_MINOR 例如选定的 1.N,K8S_PACKAGE_VERSION 从实际源中选择完整版本,不能保留 REPLACE:

export K8S_MINOR='1.REPLACE'
sudo apt-get update
sudo apt-get install -y ca-certificates curl gpg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL "https://pkgs.k8s.io/core:/stable:/v${K8S_MINOR}/deb/Release.key" | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
printf 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v%s/deb/ /\n' "$K8S_MINOR" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
apt-cache madison kubeadm
export K8S_PACKAGE_VERSION='REPLACE_EXACT_PACKAGE_VERSION'
sudo apt-get install -y kubelet="$K8S_PACKAGE_VERSION" kubeadm="$K8S_PACKAGE_VERSION" kubectl="$K8S_PACKAGE_VERSION"
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable kubelet

记录 kubeadm version -o short 返回的 v1.N.P,用于下一步;未 init 时 kubelet 重启等待配置正常。

4. 初始化第一个控制面#

cp1 保存 kubeadm.yaml,替换 kubernetesVersion;kubeReserved/systemReserved 要与实际节点容量匹配:

apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint: {advertiseAddress: 10.20.0.11, bindPort: 6443}
nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.REPLACE.PATCH
controlPlaneEndpoint: api.k8s.internal:6443
networking:
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
apiServer:
  certSANs: [api.k8s.internal]
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
rotateCertificates: true
systemReserved: {cpu: 250m, memory: 512Mi}
kubeReserved: {cpu: 250m, memory: 512Mi}
evictionHard: {memory.available: 200Mi, nodefs.available: '10%', imagefs.available: '15%', nodefs.inodesFree: '5%'}
sudo kubeadm config validate --config kubeadm.yaml
sudo kubeadm config images pull --config kubeadm.yaml
sudo kubeadm init --config kubeadm.yaml --upload-certs
mkdir -p "$HOME/.kube"
sudo install -o "$(id -u)" -g "$(id -g)" -m 600 /etc/kubernetes/admin.conf "$HOME/.kube/config"

输出含 token/certificate-key,禁止写公共终端日志。super-admin.conf 是应急材料,不分发;admin.conf 也仅供引导。

5. 加入其余节点并安装 CNI#

cp2/cp3 顺序运行 init 输出的 control-plane join 命令,分别指定自己的 --apiserver-advertise-address;worker 运行无 --control-plane 的 join 命令。保留 CA hash 验证,不用 unsafe skip。过期时在 cp1 创建短期 join token,并按需重新 upload-certs,完成后删除引导 token。

CNI 本实验选 Calico;按 Calico 安装篇固定 Operator 版本,确保 Installation 的 IP pool 与 10.244.0.0/16 一致,选择与网络防火墙一致的 VXLAN/BGP 模式。不要同时安装 Cilium/Calico。托管云上的自建集群如需要云 LB/路由,还需相应 CCM,不等同 EKS/GKE。

kubectl wait --for=condition=Ready nodes --all --timeout=10m
kubectl -n kube-system get pods -o wide
kubectl get --raw='/readyz?verbose'
kubectl get nodes -o wide
sudo kubeadm token list

6. 接入生产基线并验收#

为后续业务调度建立节点池标签,只选择实际工作节点:

kubectl get nodes -o wide
kubectl label node REPLACE_WORKER_1 REPLACE_WORKER_2 REPLACE_WORKER_3 pool=application --overwrite
kubectl get nodes -l pool=application

至少有三台 Ready 的目标节点后,再应用 调度篇的 nodeSelector: {pool: application};否则业务会一直 Pending。不要把控制面或存储专用节点误标为业务池。

顺序完成 权限→加固→CSI或Ceph→监控→etcd 备份。按实际故障域给节点写正确的 zone 标签,不能编造“三 AZ”。

  1. 持续业务读写,从 LB 逐一摘除一台控制面,确认 API/调谐正常;恢复并健康后再测下一台。
  2. 按 节点维护排空单个 worker,确认跨节点调度和卷挂载、DNS与业务正常。
  3. 在独立恢复环境重建并恢复 etcd,记录 RPO/RTO;不在正在服务的集群做全量恢复实验。

失败保留日志和 PKI;初始化中途失败先查 preflight,不自动 reset。退役需先迁业务和备份,逐节点处理;不提供一键删除整集群脚本。

参考:HA kubeadm、runtime 配置、安装 kubeadm。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭