适配环境:国产化芯片(鲲鹏、飞腾、海光等)+ 国产操作系统(银河麒麟 V10、统信 UOS、华为欧拉等)

适用人群:K8s 初学者、信创环境运维工程师、云原生技术入门者

1 背景认知

1.1 什么是信创 K8s 多主高可用架构?

  • 信创:即 “信息技术应用创新”,核心是采用国产化软硬件(芯片、操作系统、中间件)构建 IT 基础设施,保障数据安全与自主可控。
  • K8s 多主架构:指部署 3 个及以上 Master 节点(控制平面),避免单 Master 节点的 “单点故障”,确保集群持续运行。
  • 高可用(HA):通过组件冗余、故障自动转移、负载均衡等机制,实现集群服务可用性达 99.95% 以上(年中断时间≤4.38 小时),满足企业级生产环境要求。

1.2 为什么需要多主高可用架构?

1.2.1 单主架构的痛点
  • 单点故障风险:单 Master 节点承载 API Server、Controller Manager 等核心组件,一旦宕机,整个集群失控。
  • 业务中断损失:生产环境服务中断可能导致经济损失、合规风险(如金融、政务场景)。
  • 维护受限:单 Master 节点升级、重启时,集群需停机,影响业务连续性。
1.2.2 多主架构的核心价值
  • 消除单点故障:多个 Master 节点冗余,单个节点故障不影响整体集群。
  • 负载均衡:客户端请求(kubectl、应用程序)均匀分发到多个 Master 节点,提升并发处理能力。
  • 灵活维护:可离线维护单个 Master 节点,不中断集群服务。
  • 信创适配:兼容国产化软硬件,满足政策合规要求(如等保 2.0、信创目录适配)。

1.3 高可用架构的核心目标

  1. 消除单点故障:Master 节点、etcd 存储集群均冗余部署。
  2. 故障自动转移:主节点故障时,10 秒内自动切换到备用节点。
  3. 数据一致性:集群状态(如 Pod 配置、节点信息)通过 etcd 集群同步,确保所有节点数据一致。
  4. 最小化中断:故障恢复时间(RTO)≤5 分钟,数据丢失量(RPO)≈0。

1.4 两种主流架构模式(初学者重点掌握)

架构模式

堆叠(Stacked)etcd 拓扑

外部(External)etcd 拓扑

部署方式

etcd 与 Master 组件(API Server 等)部署在同一节点

etcd 集群独立部署,与 Master 节点分离

优点

部署简单、资源需求低、配置简洁

隔离性强、性能优、故障域小(推荐生产环境)

缺点

组件耦合度高,节点故障影响控制平面 + 存储

部署复杂、需要更多服务器资源

适用场景

测试环境、中小型集群(≤50 节点)

生产环境、中大型集群(≥50 节点)

信创适配

支持国产化芯片 / OS

支持国产化芯片 / OS(推荐选型)

2 核心配置

2.1 硬件配置推荐(信创环境适配)

2.1.1 节点数量要求
  • Master 节点:≥3 个(高可用最小配置,推荐 3 个)
  • Worker 节点:≥2 个(应用运行节点,可根据业务需求扩展)
  • etcd 节点:外部 etcd 拓扑需≥3 个(存储集群,推荐与 Master 节点独立)
2.1.2 服务器规格(国产化服务器示例)

节点类型

推荐规格(鲲鹏 920 / 飞腾 2000+)

用途说明

Master 节点

8 核 CPU + 32GB 内存 + 40GB ESSD 系统盘 + 100GB ESSD 数据盘

运行控制平面组件,需较高 CPU / 内存

Worker 节点

8 核 CPU + 16GB 内存 + 40GB ESSD 系统盘 + 200GB ESSD 数据盘

运行应用 Pod,需较大存储容量

etcd 节点(外部)

4 核 CPU + 16GB 内存 + 200GB ESSD(IOPS≥10000)

etcd 为 I/O 密集型,需高性能 SSD

2.2 核心组件与作用

2.2.1 控制平面组件(Master 节点)
  1. kube-apiserver:集群 “入口网关”,提供 RESTful API,所有组件通信都需经过它(需负载均衡)。
  2. kube-controller-manager:集群 “控制器”,维护集群期望状态(如 Pod 副本数、节点健康),通过 Leader Election 机制确保仅 1 个活跃实例。
  3. kube-scheduler:集群 “调度器”,为新创建的 Pod 选择合适的 Worker 节点,同样通过 Leader Election 实现高可用。
2.2.2 高可用关键组件
  1. etcd 集群:分布式键值存储,保存集群所有状态数据(如 Pod 配置、用户权限),需 3 个节点实现高可用。
  2. 负载均衡器
    • HAProxy:软件负载均衡,分发 API Server 请求(端口 6443)到多个 Master 节点。
    • Keepalived:为 HAProxy 提供虚拟 IP(VIP),实现 HAProxy 高可用(避免负载均衡器单点故障)。
  1. 容器运行时:containerd(推荐,Docker 已弃用),负责运行容器,需适配国产化架构(arm64/amd64)。
2.2.3 信创适配组件
  • 国产化容器运行时:华为容器引擎、统信 containerd。
  • 国产化负载均衡:开源 HAProxy(适配 arm64)、深信服硬件负载均衡(可选)。
  • 部署工具:kt(适配信创环境,简化 arm64 架构部署)。

2.3 网络配置要求

2.3.1 端口开放清单(所有节点)

组件

端口范围

协议

用途

kube-apiserver

6443

TCP

集群 API 通信

etcd

2379-2380

TCP

etcd 集群通信

kubelet

10250

TCP

节点与控制平面通信

HAProxy

6443(转发)

TCP

负载均衡 API Server 请求

Keepalived

8200

TCP

健康检查

应用 Pod

30000-32767

TCP/UDP

容器应用对外暴露端口

2.3.2 网络规划示例(VPC 环境)
  • VPC 网段:192.168.1.0/24
  • Master 节点 IP:192.168.1.10(master1)、192.168.1.11(master2)、192.168.1.12(master3)
  • Worker 节点 IP:192.168.1.20(node1)、192.168.1.21(node2)
  • etcd 节点 IP(外部):192.168.1.30(etcd1)、192.168.1.31(etcd2)、192.168.1.32(etcd3)
  • 虚拟 IP(VIP):192.168.1.100(HAProxy 对外提供的统一入口)

3 基础实操(分步部署,不省略任何步骤)

3.1 前置条件

  • 已准备 3 台 Master 节点、2 台 Worker 节点、3 台 etcd 节点(外部拓扑),均安装国产操作系统(如银河麒麟 V10)。
  • 所有节点网络互通(同一 VPC / 局域网),可通过 SSH 登录。
  • 服务器已挂载 ESSD 数据盘(推荐≥100GB)。

3.2 步骤 1:所有节点环境初始化(信创环境适配)

3.2.1 关闭防火墙与 SELinux

# 关闭防火墙(银河麒麟/统信UOS)

sudo systemctl stop firewalld

sudo systemctl disable firewalld

# 关闭SELinux(永久生效)

sudo setenforce 0  # 临时关闭

sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config  # 永久关闭

3.2.2 关闭 Swap 分区(K8s 强制要求)

sudo swapoff -a  # 临时关闭

sudo sed -i '/ swap / s/^<inline_LaTeX_Formula>.*inline_LaTeX_Formula>$/#\1/g' /etc/fstab  # 永久关闭(注释swap分区)

3.2.3 配置内核参数(容器网络所需)

# 创建内核配置文件

cat < sudo tee /etc/modules-load.d/k8s.conf

overlay

br_netfilter

EOF

# 加载模块

sudo modprobe overlay

sudo modprobe br_netfilter

# 配置网络参数

cat < 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

3.2.4 配置 hosts 文件(所有节点互认)

sudo vi /etc/hosts  # 编辑hosts文件,添加以下内容(替换为实际IP)

192.168.1.10 master1

192.168.1.11 master2

192.168.1.12 master3

192.168.1.20 node1

192.168.1.21 node2

192.168.1.30 etcd1

192.168.1.31 etcd2

192.168.1.32 etcd3

192.168.1.100 k8s-vip  # 虚拟IP

3.2.5 安装依赖工具(信创环境适配)

# 银河麒麟/华为欧拉(yum)

sudo yum install -y ipset ipvsadm wget curl socat conntrack-tools

# 统信UOS(apt)

sudo apt update && sudo apt install -y ipset ipvsadm wget curl socat conntrack

3.3 步骤 2:部署 etcd 集群(外部拓扑,3 节点)

etcd 是集群 “数据库”,需先部署且确保高可用。

3.3.1 安装 etcd(所有 etcd 节点)

# 下载etcd(信创适配版本,以v3.5.10为例)

wget https://github.com/etcd-io/etcd/releases/download/v3.5.10/etcd-v3.5.10-linux-arm64.tar.gz  # arm64架构

# 若为amd64架构,替换为:etcd-v3.5.10-linux-amd64.tar.gz

# 解压并安装

tar -zxvf etcd-v3.5.10-linux-arm64.tar.gz

sudo mv etcd-v3.5.10-linux-arm64/etcd* /usr/local/bin/

# 创建etcd数据目录与配置目录

sudo mkdir -p /data/etcd /etc/etcd

3.3.2 配置 etcd 集群(以 etcd1 为例,其他节点修改对应参数)

# 创建etcd配置文件

sudo vi /etc/etcd/etcd.conf

添加以下内容(替换ETCD_NAMEETCD_LISTEN_PEER_URLSETCD_LISTEN_CLIENT_URLS为当前节点信息):

ETCD_NAME="etcd1"  # etcd2节点改为"etcd2",etcd3改为"etcd3"

ETCD_DATA_DIR="/data/etcd"

ETCD_LISTEN_PEER_URLS="https://192.168.1.30:2380"  # 当前节点IP

ETCD_LISTEN_CLIENT_URLS="https://192.168.1.30:2379,https://127.0.0.1:2379"

ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.30:2379"

ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.30:2380"

ETCD_INITIAL_CLUSTER="etcd1=https://192.168.1.30:2380,etcd2=https://192.168.1.31:2380,etcd3=https://192.168.1.32:2380"

ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-token"

ETCD_INITIAL_CLUSTER_STATE="new"

ETCD_CERT_FILE="/etc/etcd/server.crt"

ETCD_KEY_FILE="/etc/etcd/server.key"

ETCD_TRUSTED_CA_FILE="/etc/etcd/ca.crt"

ETCD_PEER_CERT_FILE="/etc/etcd/peer.crt"

ETCD_PEER_KEY_FILE="/etc/etcd/peer.key"

ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/ca.crt"

3.3.3 生成 etcd 证书(任选一个 etcd 节点执行)

# 安装cfssl工具(证书生成)

wget https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssl_1.6.4_linux_arm64

wget https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssljson_1.6.4_linux_arm64

wget https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssl-certinfo_1.6.4_linux_arm64

sudo chmod +x cfssl*

sudo mv cfssl* /usr/local/bin/

# 创建证书配置文件

mkdir -p /etc/etcd/certs && cd /etc/etcd/certs

# 生成CA证书

cat <.json

{

  "signing": {

    "default": {

      "expiry": "87600h"

    },

    "profiles": {

      "etcd": {

        "usages": ["signing", "key encipherment", "server auth", "client auth"],

        "expiry": "87600h"

      }

    }

  }

}

EOF

cat < | tee ca-csr.json

{

  "CN": "etcd-ca",

  "key": {

    "algo": "rsa",

    "size": 2048

  },

  "names": [

    {

      "C": "CN",

      "L": "Beijing",

      "O": "xinchuang",

      "OU": "k8s",

      "ST": "Beijing"

    }

  ]

}

EOF

# 生成CA证书和密钥

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

# 生成etcd服务器证书

cat < | tee server-csr.json

{

  "CN": "etcd-server",

  "hosts": [

    "127.0.0.1",

    "192.168.1.30",

    "192.168.1.31",

    "192.168.1.32"

  ],

  "key": {

    "algo": "rsa",

    "size": 2048

  },

  "names": [

    {

      "C": "CN",

      "L": "Beijing",

      "O": "xinchuang",

      "OU": "k8s",

      "ST": "Beijing"

    }

  ]

}

EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd server-csr.json | cfssljson -bare server

# 生成etcdpeer证书

cat < | tee peer-csr.json

{

  "CN": "etcd-peer",

  "hosts": [

    "127.0.0.1",

    "192.168.1.30",

    "192.168.1.31",

    "192.168.1.32"

  ],

  "key": {

    "algo": "rsa",

    "size": 2048

  },

  "names": [

    {

      "C": "CN",

      "L": "Beijing",

      "O": "xinchuang",

      "OU": "k8s",

      "ST": "Beijing"

    }

  ]

}

EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd peer-csr.json | cfssljson -bare peer

# 复制证书到所有etcd节点

sudo scp ca.pem ca-key.pem server.pem server-key.pem peer.pem peer-key.pem root@etcd2:/etc/etcd/

sudo scp ca.pem ca-key.pem server.pem server-key.pem peer.pem peer-key.pem root@etcd3:/etc/etcd/

3.3.4 启动 etcd 集群(所有 etcd 节点)

# 创建etcd系统服务

sudo vi /usr/lib/systemd/system/etcd.service

添加以下内容:

[Unit]

Description=Etcd Server

After=network.target

[Service]

Type=notify

ExecStart=/usr/local/bin/etcd --config-file=/etc/etcd/etcd.conf

Restart=on-failure

RestartSec=5

[Install]

WantedBy=multi-user.target

# 启动并设置开机自启

sudo systemctl daemon-reload

sudo systemctl start etcd

sudo systemctl enable etcd

# 验证etcd集群状态(任意etcd节点)

etcdctl --endpoints=https://192.168.1.30:2379,https://192.168.1.31:2379,https://192.168.1.32:2379 \

  --ca-file=/etc/etcd/ca.pem \

  --cert-file=/etc/etcd/server.pem \

  --key-file=/etc/etcd/server.key \

  endpoint health

# 成功输出示例:

# https://192.168.1.30:2379 is healthy: successfully committed proposal: took = 1.234ms

# https://192.168.1.31:2379 is healthy: successfully committed proposal: took = 1.567ms

# https://192.168.1.32:2379 is healthy: successfully committed proposal: took = 1.345ms

3.4 步骤 3:部署负载均衡器(HAProxy+Keepalived,所有 Master 节点)

3.4.1 安装 HAProxy(负载均衡 API Server)

# 安装HAProxy

sudo yum install -y haproxy  # 银河麒麟/华为欧拉

# sudo apt install -y haproxy  # 统信UOS

# 配置HAProxy

sudo vi /etc/haproxy/haproxy.cfg

添加以下配置(替换为 Master 节点 IP):

global

    log         127.0.0.1 local2

    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon

defaults

    mode                    tcp

    log                     global

    option                  tcplog

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    option                  redispatch

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 3000

frontend k8s-api

    bind *:6443

    mode tcp

    option tcplog

    default_backend k8s-master-servers

backend k8s-master-servers

    mode tcp

    option tcplog

    option tcp-check

    balance roundrobin

    server master1 192.168.1.10:6443 check fall 3 rise 2

    server master2 192.168.1.11:6443 check fall 3 rise 2

    server master3 192.168.1.12:6443 check fall 3 rise 2

# 启动HAProxy并设置开机自启

sudo systemctl start haproxy

sudo systemctl enable haproxy

sudo systemctl status haproxy  # 验证状态,确保active

3.4.2 安装 Keepalived(提供虚拟 IP)

# 安装Keepalived

sudo yum install -y keepalived  # 银河麒麟/华为欧拉

# sudo apt install -y keepalived  # 统信UOS

# 配置Keepalived(以master1为例,master2/master3修改priority和state)

sudo vi /etc/keepalived/keepalived.conf

添加以下配置(master1 为 MASTER,优先级 100;master2/master3 为 BACKUP,优先级 90/80):

! Configuration File for keepalived

global_defs {

   router_id LVS_DEVEL

}

vrrp_script chk_haproxy {

    script "/usr/bin/systemctl is-active haproxy"

    interval 2

    weight 2

}

vrrp_instance VI_1 {

    state MASTER  # master2/master3改为BACKUP

    interface eth0  # 替换为服务器实际网卡名(通过ip addr查看)

    virtual_router_id 51

    priority 100  # master2改为90,master3改为80

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.100/24  # 虚拟IP(VIP)

    }

    track_script {

        chk_haproxy

    }

}

# 启动Keepalived并设置开机自启

sudo systemctl start keepalived

sudo systemctl enable keepalived

sudo systemctl status keepalived

# 验证虚拟IP(master1节点执行,应看到VIP已绑定)

ip addr | grep 192.168.1.100

3.5 步骤 4:部署 K8s Master 节点(3 个节点)

3.5.1 安装容器运行时(containerd)

# 安装containerd(信创适配版本)

sudo yum install -y containerd.io  # 银河麒麟/华为欧拉

# sudo apt install -y containerd.io  # 统信UOS

# 配置containerd

sudo mkdir -p /etc/containerd

containerd config default | sudo tee /etc/containerd/config.toml

# 修改配置(适配K8s,设置SystemdCgroup=true)

sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

# 重启containerd并设置开机自启

sudo systemctl restart containerd

sudo systemctl enable containerd

3.5.2 配置 K8s YUM 源(信创镜像)

cat < sudo tee /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-\$basearch

enabled=1

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

exclude=kubelet kubeadm kubectl

EOF

3.5.3 安装 K8s 组件(kubelet、kubeadm、kubectl)

# 安装指定版本(推荐1.26.x,稳定且信创适配好)

sudo yum install -y kubelet-1.26.10 kubeadm-1.26.10 kubectl-1.26.10 --disableexcludes=kubernetes

# 设置kubelet开机自启(暂不启动,等待初始化)

sudo systemctl enable kubelet

3.5.4 初始化第一个 Master 节点(master1)

# 初始化集群(替换VIP和etcd节点信息)

sudo kubeadm init \

  --control-plane-endpoint "192.168.1.100:6443" \  # 虚拟IP:端口

  --upload-certs \  # 上传证书,用于添加其他Master节点

  --pod-network-cidr=10.244.0.0/16 \  # Pod网络网段(后续部署Calico需一致)

  --service-cidr=10.96.0.0/12 \  # 服务网段

  --etcd-servers=https://192.168.1.30:2379,https://192.168.1.31:2379,https://192.168.1.32:2379 \  # 外部etcd集群地址

  --etcd-cafile=/etc/etcd/ca.pem \

  --etcd-certfile=/etc/etcd/server.pem \

  --etcd-keyfile=/etc/etcd/server.key

# 初始化成功后,会输出以下关键信息(务必保存!):

# 1. 配置kubectl的命令

# 2. 添加其他Master节点的命令(含证书密钥)

# 3. 添加Worker节点的命令

3.5.5 配置 kubectl(master1 节点)

# 普通用户配置(推荐)

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 验证kubectl(应看到master1节点状态Ready)

kubectl get nodes

3.5.6 添加其他 Master 节点(master2、master3)

在 master2 和 master3 节点执行初始化成功后输出的 “添加控制平面节点” 命令(示例,需替换实际证书和 IP):

sudo kubeadm join 192.168.1.100:6443 \

  --token abcdef.0123456789abcdef \

  --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \

  --control-plane \

  --certificate-key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# 配置kubectl(master2、master3节点,重复3.5.5步骤)

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 验证所有Master节点(任意Master节点执行)

kubectl get nodes

# 成功输出示例(3个Master节点均为Ready):

# NAME     STATUS   ROLES           AGE   VERSION

# master1  Ready    control-plane   30m   v1.26.10

# master2  Ready    control-plane   20m   v1.26.10

# master3  Ready    control-plane   15m   v1.26.10

3.6 步骤 5:部署网络插件(Calico,任意 Master 节点)

K8s 集群需网络插件实现 Pod 间通信,推荐 Calico(信创适配好)。

# 下载Calico配置文件

wget https://docs.projectcalico.org/v3.26/manifests/calico.yaml

# 修改Pod网络网段(与初始化时--pod-network-cidr一致)

sudo sed -i 's/192.168.0.0\/16/10.244.0.0\/16/g' calico.yaml

# 部署Calico

kubectl apply -f calico.yaml

# 验证Calico Pod状态(所有Pod需为Running)

kubectl get pods -n kube-system | grep calico

3.7 步骤 6:添加 Worker 节点(可选,扩展计算资源)

在 Worker 节点(node1、node2)执行初始化成功后输出的 “添加工作节点” 命令(示例):

sudo kubeadm join 192.168.1.100:6443 \

  --token abcdef.0123456789abcdef \

  --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# 验证Worker节点(Master节点执行)

kubectl get nodes

# 成功输出示例(新增node1、node2为Ready):

# NAME     STATUS   ROLES           AGE   VERSION

# master1  Ready    control-plane   40m   v1.26.10

# master2  Ready    control-plane   30m   v1.26.10

# master3  Ready    control-plane   25m   v1.26.10

# node1    Ready    <none>          10m   v1.26.10

# node2    Ready    <none>           5m   v1.26.10

3.8 步骤 7:高可用性测试(验证架构有效性)

3.8.1 故障转移测试(模拟 Master 节点故障)

# 1. 查看当前活跃的kube-controller-manager Leader(master1节点)

kubectl get endpoints kube-controller-manager -n kube-system -o jsonpath='{.subsets[0].addresses[0].ip}'

# 2. 停止master1节点的kube-controller-manager

sudo systemctl stop kube-controller-manager

# 3. 等待10秒后,再次查看Leader(应切换到master2或master3)

kubectl get endpoints kube-controller-manager -n kube-system -o jsonpath='{.subsets[0].addresses[0].ip}'

# 4. 恢复master1节点的kube-controller-manager

sudo systemctl start kube-controller-manager

3.8.2 负载均衡测试(验证 HAProxy)

# 查看API Server连接分布(master1节点)

sudo netstat -anp | grep 6443 | grep ESTABLISHED

# 应看到客户端连接均匀分布在3个Master节点

4 高阶用法

4.1 集群监控与告警(信创适配)

4.1.1 部署 Prometheus+Grafana(监控集群状态)

# 下载监控组件配置(信创优化版)

git clone https://gitee.com/xinchuang-cloud/k8s-monitor.git

cd k8s-monitor

# 部署Prometheus

kubectl apply -f prometheus/

# 部署Grafana

kubectl apply -f grafana/

# 暴露Grafana服务(NodePort方式)

kubectl expose deployment grafana -n monitoring --type=NodePort --port=3000

kubectl get svc grafana -n monitoring  # 查看暴露的端口(如30008)

  • 访问地址:http://Worker节点IP:30008(默认账号密码:admin/admin)
  • 导入 K8s 监控模板(ID:8588),可查看 Master 节点状态、etcd 集群健康度、Pod 运行状态。
4.1.2 配置告警(邮件 / 短信通知)

在 Grafana 中配置告警规则(如 Master 节点宕机、etcd 集群异常),对接国产化邮件服务器(如网易企业邮、自建 Postfix)或短信网关(如阿里云短信、华为云短信)。

4.2 集群备份与恢复(etcd 数据安全)

4.2.1 手动备份 etcd 数据

# 备份命令(任意Master节点执行)

sudo ETCDCTL_API=3 etcdctl --endpoints=https://192.168.1.30:2379,https://192.168.1.31:2379,https://192.168.1.32:2379 \

  --ca-file=/etc/etcd/ca.pem \

  --cert-file=/etc/etcd/server.pem \

  --key-file=/etc/etcd/server.key \

  snapshot save /data/etcd-backup/etcd-snapshot-$(date +%Y%m%d%H%M%S).db

4.2.2 自动备份(定时任务)

# 创建备份脚本

sudo vi /usr/local/bin/etcd-backup.sh

添加以下内容:

#!/bin/bash

BACKUP_DIR="/data/etcd-backup"

DATE=$(date +%Y%m%d%H%M%S)

ETCD_ENDPOINTS="https://192.168.1.30:2379,https://192.168.1.31:2379,https://192.168.1.32:2379"

# 创建备份目录

mkdir -p $BACKUP_DIR

# 执行备份

ETCDCTL_API=3 etcdctl --endpoints=$ETCD_ENDPOINTS \

  --ca-file=/etc/etcd/ca.pem \

  --cert-file=/etc/etcd/server.pem \

  --key-file=/etc/etcd/server.key \

  snapshot save $BACKUP_DIR/etcd-snapshot-$DATE.db

# 保留最近7天的备份

find $BACKUP_DIR -name "etcd-snapshot-*.db" -mtime +7 -delete

# 添加执行权限并设置定时任务(每天凌晨2点备份)

sudo chmod +x /usr/local/bin/etcd-backup.sh

sudo crontab -e

# 添加:0 2 * * * /usr/local/bin/etcd-backup.sh

4.3 集群升级(不中断业务)

信创环境推荐 “滚动升级”,避免集群停机:

# 1. 升级kubeadm(所有节点)

sudo yum install -y kubeadm-1.27.5 --disableexcludes=kubernetes

# 2. 验证升级计划(master1节点)

sudo kubeadm upgrade plan

# 3. 升级控制平面(master1节点)

sudo kubeadm upgrade apply v1.27.5

# 4. 升级其他Master节点(master2、master3)

sudo kubeadm upgrade node

# 5. 升级kubelet和kubectl(所有节点)

sudo yum install -y kubelet-1.27.5 kubectl-1.27.5 --disableexcludes=kubernetes

sudo systemctl daemon-reload

sudo systemctl restart kubelet

# 6. 升级Worker节点(逐个升级,避免同时离线)

sudo kubeadm upgrade node

sudo yum install -y kubelet-1.27.5 --disableexcludes=kubernetes

sudo systemctl daemon-reload

sudo systemctl restart kubelet

5 拓展建议

5.1 信创环境适配技巧

  1. 组件选型:优先选择信创目录内的组件(如华为容器引擎、统信 containerd、麒麟 etcd),避免兼容性问题。
  2. 架构优化:中大型集群(≥100 节点)推荐 “外部 etcd 拓扑 + 独立负载均衡节点”,提升性能和稳定性。
  3. 国产化工具:使用 kt 工具(信创适配版)简化部署,支持一键初始化、离线部署、arm64 架构适配。

5.2 常见问题排查(初学者必看)

5.2.1 Master 节点 NotReady
  • 原因:Calico 网络插件未正常运行、kubelet 未启动。
  • 解决:

# 查看kubelet日志

sudo journalctl -u kubelet -f

# 重启Calico

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

5.2.2 etcd 集群健康检查失败
  • 原因:证书配置错误、节点网络不通。
  • 解决:

# 检查etcd日志

sudo journalctl -u etcd -f

# 验证etcd节点间网络(2379/2380端口)

telnet 192.168.1.31 2379

5.2.3 虚拟 IP(VIP)未绑定
  • 原因:Keepalived 配置错误、HAProxy 未启动。
  • 解决:

# 查看Keepalived日志

sudo journalctl -u keepalived -f

# 验证HAProxy状态

sudo systemctl status haproxy

5.3 学习资源推荐

  1. 官方文档:Kubernetes 中文文档(https://kubernetes.io/zh-cn/docs/home/)、etcd 官方文档(https://etcd.io/docs/)。
  2. 信创适配:华为云容器服务文档(https://support.huaweicloud.com/cce/)、麒麟软件知识库(https://www.kylinos.cn/support/)。
  3. 实战课程:51CTO 学堂《信创 K8s 高可用集群部署实战》、CSDN《K8s 多主架构从入门到精通》。

5.4 生产环境最佳实践

  1. 节点隔离:Master 节点不运行应用 Pod,仅承担控制平面功能;etcd 节点独立部署,避免资源竞争。
  2. 安全加固:开启 API Server 认证授权、加密 etcd 数据、定期更换证书(建议 1 年)。
  3. 容量规划:根据应用需求预留 20% CPU / 内存资源,避免集群过载;etcd 存储预留 50% 空闲空间。
  4. 灾备方案:跨可用区部署 Master 节点(如政务云多区域),etcd 备份数据异地存储。
Logo

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

更多推荐