Kubernetes 1.29 集群部署实战:3 节点高可用架构搭建与核心组件配置详解

在当今云原生技术快速发展的背景下,Kubernetes 已成为容器编排领域的事实标准。本文将深入探讨如何从零开始搭建一个生产级的高可用 Kubernetes 1.29 集群,涵盖架构设计、组件配置和最佳实践,为 DevOps 工程师和系统管理员提供一套完整、可复现的部署方案。

1. 环境准备与系统配置

1.1 硬件与操作系统要求

在开始部署前,我们需要确保所有节点满足以下最低配置要求:

  • 控制平面节点 :至少 2 核 CPU、4GB 内存、40GB 磁盘空间
  • 工作节点 :根据工作负载需求调整,建议至少 4 核 CPU、8GB 内存
  • 操作系统 :Ubuntu 22.04 LTS 或 CentOS 8 Stream(本文以 Ubuntu 为例)

关键系统参数调优

# 禁用交换分区
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system

1.2 容器运行时安装

Kubernetes 1.29 默认使用 containerd 作为容器运行时。以下是安装配置步骤:

# 安装依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

# 添加 Docker 仓库
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 containerd
sudo apt-get update
sudo apt-get install -y containerd.io

# 配置 containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo systemctl restart containerd

2. 高可用架构设计

2.1 三节点拓扑结构

我们采用典型的 3 节点高可用架构,包含:

  • 3 个控制平面节点 :运行 kube-apiserver、kube-scheduler 和 kube-controller-manager
  • 外部 etcd 集群 :3 节点 etcd 集群确保元数据高可用
  • 负载均衡器 :使用 HAProxy 实现 API Server 的负载均衡

架构示意图

+-------------------------------------------------+
|                   Load Balancer                 |
|                   (HAProxy)                     |
+--------+------------------+---------------------+
         |                  |
+--------v-------+ +--------v-------+ +-----------v---------+
| Control Plane  | | Control Plane  | | Control Plane       |
| Node 1         | | Node 2         | | Node 3              |
| - kube-apiserver| - kube-apiserver| - kube-apiserver      |
| - scheduler    | - scheduler     | - scheduler           |
| - controller   | - controller    | - controller          |
+----------------+ +---------------+ +----------------------+

2.2 HAProxy 配置

在负载均衡节点上配置 /etc/haproxy/haproxy.cfg

global
    log /dev/log local0
    log /dev/log local1 notice
    daemon

defaults
    log global
    mode tcp
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend k8s-api
    bind *:6443
    default_backend k8s-api

backend k8s-api
    balance roundrobin
    option tcp-check
    server k8s-cp-1 192.168.1.101:6443 check
    server k8s-cp-2 192.168.1.102:6443 check
    server k8s-cp-3 192.168.1.103:6443 check

3. Kubernetes 集群部署

3.1 使用 kubeadm 初始化集群

在主控制节点上执行初始化命令:

sudo kubeadm init \
  --control-plane-endpoint "LOAD_BALANCER_DNS:6443" \
  --upload-certs \
  --pod-network-cidr=10.244.0.0/16 \
  --service-cidr=10.96.0.0/12 \
  --kubernetes-version 1.29.0

初始化完成后,按照提示配置 kubectl:

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

3.2 添加其他控制平面节点

在其他控制节点上执行 kubeadm join 命令:

sudo kubeadm join LOAD_BALANCER_DNS:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash> \
  --control-plane \
  --certificate-key <key>

3.3 网络插件安装

我们选择 Calico 作为 CNI 插件:

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

验证网络插件状态:

kubectl get pods -n kube-system -l k8s-app=calico-node

4. 核心组件配置优化

4.1 kube-apiserver 高可用配置

编辑 /etc/kubernetes/manifests/kube-apiserver.yaml 添加以下参数:

spec:
  containers:
  - command:
    - kube-apiserver
    - --etcd-servers=https://192.168.1.101:2379,https://192.168.1.102:2379,https://192.168.1.103:2379
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
    - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
    - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
    - --apiserver-count=3
    - --endpoint-reconciler-type=lease

4.2 etcd 集群配置

每个 etcd 节点的 /etc/etcd/etcd.conf 配置示例:

# Node 1 配置
ETCD_NAME=etcd1
ETCD_DATA_DIR=/var/lib/etcd
ETCD_LISTEN_PEER_URLS=https://192.168.1.101:2380
ETCD_LISTEN_CLIENT_URLS=https://192.168.1.101:2379,https://127.0.0.1:2379
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.1.101:2380
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.1.101:2379
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.1.101:2380,etcd2=https://192.168.1.102:2380,etcd3=https://192.168.1.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN=k8s-etcd-cluster
ETCD_INITIAL_CLUSTER_STATE=new

4.3 kube-proxy IPVS 模式

修改 kube-proxy 配置以启用 IPVS:

kubectl edit configmap kube-proxy -n kube-system

更新以下内容:

mode: "ipvs"
ipvs:
  scheduler: "rr"
  strictARP: true

5. 集群验证与运维

5.1 集群状态检查

# 查看节点状态
kubectl get nodes -o wide

# 检查组件健康状态
kubectl get componentstatuses

# 验证高可用
curl -k https://LOAD_BALANCER_DNS:6443/healthz

5.2 关键监控指标

部署 Prometheus 和 Grafana 监控集群关键指标:

kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup/*
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/*

关键监控面板应包含:

  • API Server 请求延迟
  • etcd 写入延迟
  • 节点资源利用率
  • Pod 调度状态

5.3 备份与恢复策略

etcd 定期备份

ETCDCTL_API=3 etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db

恢复 etcd 备份

ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
  --data-dir /var/lib/etcd-restore \
  --initial-cluster etcd1=https://192.168.1.101:2380 \
  --initial-advertise-peer-urls https://192.168.1.101:2380

6. 生产环境最佳实践

6.1 安全加固措施

  • 启用 Pod 安全准入 :在 kube-apiserver 配置中添加:
- --enable-admission-plugins=NodeRestriction,PodSecurity
- --admission-control-config-file=/etc/kubernetes/pod-security.yaml
  • 网络策略 :使用 Calico NetworkPolicy 限制 Pod 间通信:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

6.2 性能优化技巧

kubelet 配置优化

# 在 /var/lib/kubelet/config.yaml 中添加
evictionHard:
  memory.available: "500Mi"
  nodefs.available: "10%"
kubeReserved:
  cpu: "500m"
  memory: "500Mi"
systemReserved:
  cpu: "500m"
  memory: "500Mi"

API Server 调优

- --max-requests-inflight=1500
- --max-mutating-requests-inflight=500
- --watch-cache-sizes=secrets=500,configmaps=500

6.3 故障排查指南

常见问题排查命令

# 查看 Pod 详细状态
kubectl describe pod <pod-name> -n <namespace>

# 检查组件日志
journalctl -u kubelet -f
kubectl logs -n kube-system <component-pod>

# 网络连通性测试
kubectl run -it --rm debug --image=nicolaka/netshoot -- /bin/bash

etcd 集群健康检查

ETCDCTL_API=3 etcdctl \
  --endpoints=https://192.168.1.101:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  endpoint health
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐