首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >K8s高可用集群部署:基于某银行电子商城实战全记录

K8s高可用集群部署:基于某银行电子商城实战全记录

原创
作者头像
97it-3
发布2026-05-21 17:29:52
发布2026-05-21 17:29:52
1190
举报

K8s高可用集群部署:基于某银行电子商城实战全记录

当银行核心交易系统遇上云原生浪潮,容不得半点闪失。一次大促洪峰、一秒服务中断,都可能是数千万的损失。某国有大行电子商城团队,用一套生产级K8s高可用集群,给出了答案。


一、为什么银行要上K8s高可用?

传统银行IT架构的痛,刻骨铭心:

痛点

传统模式

K8s高可用方案

资源利用率

每套业务独占3-6台物理机,利用率不足40%

容器化共享,利用率提升至75%+

故障恢复

物理机故障,业务中断以"小时"计

自动调度恢复,秒级切换

扩容速度

部署物理机,以"天"为单位

弹性扩缩容,分钟级完成

运维成本

依赖人工经验,标准化程度低

声明式API,自动化运维

该银行新一代业务金融云建设,以国有大行新一代业务解决方案为蓝本,选定上云应用系统超过100个,涉及核心交易、金融服务、渠道管理、个人贷款、对公贷款等多个重要业务领域。系统要求具备两地三中心部署、同城双活能力,RPO/RTO必须满足金融级高可用标准。


二、集群架构设计:三层高可用,一个都不能少

2.1 整体架构拓扑

代码语言:javascript
复制
                    ┌─────────────────────────┐
                    │    Keepalived + HAProxy  │  ← VIP: 192.168.1.100
                    │    (API Server 负载均衡)   │
                    └───────────┬─────────────┘
                                │
            ┌───────────────────┼───────────────────┐
            ▼                   ▼                   ▼
    ┌───────────────┐   ┌───────────────┐   ┌───────────────┐
    │  Master-01    │   │  Master-02    │   │  Master-03    │
    │  kube-apiserver│   │  kube-apiserver│   │  kube-apiserver│
    │  etcd          │   │  etcd          │   │  etcd          │
    │  scheduler     │   │  scheduler     │   │  scheduler     │
    │  controller-mgr│   │  controller-mgr│   │  controller-mgr│
    └───────────────┘   └───────────────┘   └───────────────┘
            │                   │                   │
            └───────────────────┼───────────────────┘
                                │
                    ┌───────────┴───────────┐
                    │    Calico CNI 网络     │  ← Pod跨节点通信
                    └───────────┬───────────┘
                                │
        ┌───────────┬───────────┼───────────┬───────────┐
        ▼           ▼           ▼           ▼           ▼
   ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
   │Worker-01│ │Worker-02│ │Worker-03│ │Worker-04│ │Worker-05│
   │ kubelet │ │ kubelet │ │ kubelet │ │ kubelet │ │ kubelet │
   │ kube-proxy│ │ kube-proxy│ │ kube-proxy│ │ kube-proxy│ │ kube-proxy│
   └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘

2.2 高可用三大支柱

组件

高可用策略

关键细节

kube-apiserver

3节点 + Keepalived虚拟IP + HAProxy负载均衡

健康检查用/healthz,HTTPS协议,ssl verify none(自签名证书)

etcd集群

3节点独立集群(与Master分离部署)

必须SSD硬盘,--initial-cluster用固定IP,配置反亲和性避免共故障域

controller-manager/scheduler

多实例 + 领导者选举

集群仅一个活跃实例,其余standby自动接管


三、环境初始化:万丈高楼平地起

3.1 节点规划

主机名

IP

角色

配置

k8s-master-01

192.168.1.11

Master + etcd

4核8G,50G SSD

k8s-master-02

192.168.1.12

Master + etcd

4核8G,50G SSD

k8s-master-03

192.168.1.13

Master + etcd

4核8G,50G SSD

k8s-node-01~05

192.168.1.21~25

Worker

4核16G,100G SSD

3.2 所有节点通用初始化(必须逐台执行)

代码语言:javascript
复制
bash# ====== 1. 修改主机名 ======
hostnamectl set-hostname k8s-master-01  # 按节点修改

# ====== 2. 配置hosts ======
cat >> /etc/hosts << EOF
192.168.1.11 k8s-master-01
192.168.1.12 k8s-master-02
192.168.1.13 k8s-master-03
192.168.1.21 k8s-node-01
192.168.1.22 k8s-node-02
192.168.1.23 k8s-node-03
192.168.1.24 k8s-node-04
192.168.1.25 k8s-node-05
EOF

# ====== 3. 关闭Swap(K8s强制要求) ======
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

# ====== 4. 关闭防火墙 ======
systemctl stop firewalld && systemctl disable firewalld

# ====== 5. 禁用SELinux ======
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
setenforce 0

# ====== 6. 时间同步(精度到秒级,证书验证依赖) ======
yum install -y chrony
systemctl enable --now chronyd
# 配置阿里云NTP
cat > /etc/chrony.conf << EOF
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.0.0/16
local stratum 10
EOF
systemctl restart chronyd
chronyc sources -v  # 验证同步状态

# ====== 7. 内核参数优化(开启桥接转发) ======
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
fs.inotify.max_user_watches = 1048576
EOF
sysctl --system

# 加载网桥模块
modprobe br_netfilter
modprobe overlay

3.3 安装容器运行时 + K8s组件

代码语言:javascript
复制
bash# ====== 安装Docker(v20.10+) ======
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io

# 配置Docker(阿里云镜像加速 + systemd cgroup)
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {"max-size": "100m"}
}
EOF
systemctl enable --now docker

# ====== 配置K8s阿里云yum源 ======
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# ====== 安装kubeadm/kubelet/kubectl(固定版本,避免兼容问题) ======
yum install -y kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17
systemctl enable --now kubelet

四、Master节点部署:三步构建控制平面

4.1 初始化第一个Master(仅在master-01执行)

代码语言:javascript
复制
bashkubeadm init \
  --apiserver-advertise-address=192.168.1.11 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.17 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all

⚠️ 关键参数解读

  • --apiserver-advertise-address:集群通告地址,其他节点通过此IP访问API Server
  • --image-repository:国内无法访问k8s.gcr.io,必须替换为阿里云镜像源
  • --pod-network-cidr:必须与后续部署的CNI网络组件保持一致(Calico默认10.244.0.0/16)

初始化完成后,务必复制输出的join命令

代码语言:javascript
复制
bashmkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4.2 扩容为3Master高可用(在master-02、master-03执行)

代码语言:javascript
复制
bash# 在master-01上生成新的join命令(token有效期24小时,过期需重新生成)
kubeadm token create --print-join-command

# 输出类似:
# kubeadm join 192.168.1.11:6443 --token xxx.yyy \
#   --discovery-token-ca-cert-hash sha256:zzz \
#   --control-plane --certificate-key <新生成的key>

# 在master-02、master-03上执行上述命令,添加 --control-plane 标志

验证

代码语言:javascript
复制
bashkubectl get nodes
# NAME              STATUS   ROLES                  AGE     VERSION
# k8s-master-01     Ready    control-plane,master   5m      v1.23.17
# k8s-master-02     Ready    control-plane,master   2m      v1.23.17
# k8s-master-03     Ready    control-plane,master   1m      v1.23.17

4.3 部署Keepalived + HAProxy(API Server高可用)

在3台Master节点上安装:

代码语言:javascript
复制
bashyum install -y haproxy keepalived

HAProxy配置/etc/haproxy/haproxy.cfg):

代码语言:javascript
复制
conffrontend kube_apiserver_frontend
    bind *:6443
    mode tcp
    default_backend kube_apiserver_backend

backend kube_apiserver_backend
    mode tcp
    balance roundrobin
    option httpchk GET /healthz HTTP/1.1\r\nHost:\ kube-apiserver
    server k8s-master-01 192.168.1.11:6443 check ssl verify none
    server k8s-master-02 192.168.1.12:6443 check ssl verify none
    server k8s-master-03 192.168.1.13:6443 check ssl verify none

Keepalived配置/etc/keepalived/keepalived.conf):

代码语言:javascript
复制
confvrrp_instance VI_1
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass k8sHA
    }
    virtual_ipaddress {
        192.168.1.100/24    # VIP地址
    }

五、Worker节点加入 + CNI网络插件

5.1 Worker节点加入集群

代码语言:javascript
复制
bash# 在每个Worker节点上执行kubeadm join命令(从master-01输出的那条)
kubeadm join 192.168.1.11:6443 --token xxx.yyy \
  --discovery-token-ca-cert-hash sha256:zzz

# 验证
kubectl get nodes
# 5个Worker节点状态应为 Ready

5.2 部署Calico CNI(所有Master执行)

代码语言:javascript
复制
bashwget https://docs.projectcalico.org/manifests/calico.yaml
# 修改CALICO_IPV4POOL_CIDR为与--pod-network-cidr一致
sed -i 's|192.168.0.0/16|10.244.0.0/16|' calico.yaml

kubectl apply -f calico.yaml

# 验证
kubectl get pods -n kube-system | grep calico
# calico-node        Running   0/1     1    2m
# calico-kube-controllers   Running   0/1     1    2m

六、存储方案:Rook + Ceph(金融级持久化)

银行电子商城对数据持久化要求极高,采用Rook Operator + Ceph方案:

特性

方案

效果

存储类型

Ceph RBD(块存储)+ CephFS(文件存储)

同时满足数据库和文件服务需求

副本数

3副本

任意1节点故障不丢数据

性能

NVMe SSD缓存 + HDD容量层

IOPS达数万,容量PB级

代码语言:javascript
复制
bash# 部署Rook Operator
git clone --single-branch --branch v1.11.2 https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml

# 创建Ceph集群
kubectl create -f cluster.yaml

# 验证
kubectl get pods -n rook-ceph

七、运维体系:监控 + 日志 + 备份三位一体

维度

方案

关键配置

监控

Prometheus + Grafana

Node Exporter采集指标,自定义交易业务告警规则

日志

EFK(Elasticsearch + Fluentd + Kibana)

buffer_chunk_limit=32m,ES分片数=节点数×1.5

备份

Velero

每日全量备份etcd,支持灾难场景一键恢复

Dashboard

KubeSphere 3.2

可视化管理,降低运维门槛

证书有效期延长(生产必备):

代码语言:javascript
复制
bash# 查看证书过期时间
kubeadm certs check-expiration

# 手动更新核心证书(有效期延长至10年)
kubeadm certs renew all
systemctl restart kubelet

八、故障模拟与快速修复(实战验证)

该银行团队在上线前进行了严格的故障演练:

故障场景

模拟方式

恢复时间

结果

Master-01宕机

systemctl stop kubelet

< 30秒

VIP自动漂移至Master-02,业务无感知

etcd节点故障

docker stop etcd

< 15秒

剩余2节点自动选主,数据零丢失

Worker节点失联

iptables -A INPUT -j DROP

< 60秒

Pod自动迁移至健康节点

网络分区

tc qdisc add dev eth0 root netem loss 50%

< 20秒

Calico BGP路由自动收敛


九、核心成果数据

指标

部署前(传统架构)

部署后(K8s高可用)

提升幅度

资源利用率

~40%

~75%

+87.5%

故障恢复时间

小时级

秒级

提升3600倍

应用交付速度

天级

分钟级

提升1440倍

运维人力

15人

5人

降低67%

年度IT成本

节省超2000万


十、关键踩坑与避坑指南

现象

解决方案

⏰ 时间不同步

证书验证失败,Pod无法启动

所有节点必须配置chrony,精度<1秒

🔀 Swap未关闭

kubelet启动失败

swapoff -a + 注释/etc/fstab

🌐 镜像拉取失败

国内无法访问k8s.gcr.io

全部替换为registry.aliyuncs.com/google_containers

🔑 Token过期

Worker节点无法加入

kubeadm token create --print-join-command 重新生成

💾 etcd性能差

写入延迟>100ms

必须用SSD,禁止与其他高IO服务共享磁盘

🏗️ Master与etcd共节点

单点故障风险

生产环境强烈建议etcd独立部署,配置反亲和性


结语

K8s高可用不是一个命令,而是一套体系。 从3Master控制平面到Keepalived虚拟IP,从Calico网络到Rook存储,从Prometheus监控到Velero备份——每一层都是对"金融级可靠性"的庄严承诺。 某银行电子商城的实战证明:当容器云遇上金融核心,不是能不能的问题,而是必须的问题。 那些在双十一零点扛住百万级并发的系统,靠的从来不是更粗的水管,而是一座经过千锤百炼的"流量水库"。


本文基于某银行电子商城K8s高可用集群真实部署案例整理,涵盖架构设计、环境初始化、高可用配置、存储方案、运维体系及故障演练全流程,可作为金融行业K8s生产落地的实战参考。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • K8s高可用集群部署:基于某银行电子商城实战全记录
    • 一、为什么银行要上K8s高可用?
    • 二、集群架构设计:三层高可用,一个都不能少
      • 2.1 整体架构拓扑
      • 2.2 高可用三大支柱
    • 三、环境初始化:万丈高楼平地起
      • 3.1 节点规划
      • 3.2 所有节点通用初始化(必须逐台执行)
      • 3.3 安装容器运行时 + K8s组件
    • 四、Master节点部署:三步构建控制平面
      • 4.1 初始化第一个Master(仅在master-01执行)
      • 4.2 扩容为3Master高可用(在master-02、master-03执行)
      • 4.3 部署Keepalived + HAProxy(API Server高可用)
    • 五、Worker节点加入 + CNI网络插件
      • 5.1 Worker节点加入集群
      • 5.2 部署Calico CNI(所有Master执行)
    • 六、存储方案:Rook + Ceph(金融级持久化)
    • 七、运维体系:监控 + 日志 + 备份三位一体
    • 八、故障模拟与快速修复(实战验证)
    • 九、核心成果数据
    • 十、关键踩坑与避坑指南
    • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档