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.tomlcontainerd 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 info3. 安装同一精确 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 list6. 接入生产基线并验收#
为后续业务调度建立节点池标签,只选择实际工作节点:
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”。
- 持续业务读写,从 LB 逐一摘除一台控制面,确认 API/调谐正常;恢复并健康后再测下一台。
- 按 节点维护排空单个 worker,确认跨节点调度和卷挂载、DNS与业务正常。
- 在独立恢复环境重建并恢复 etcd,记录 RPO/RTO;不在正在服务的集群做全量恢复实验。
失败保留日志和 PKI;初始化中途失败先查 preflight,不自动 reset。退役需先迁业务和备份,逐节点处理;不提供一键删除整集群脚本。