Kubernetes

K8s 生产部署全套核心重点

·15 分钟阅读·5759 字
📋 目录

K8s 生产部署全套核心重点

核心概念 K8s 生产部署涵盖部署前规划、OS 内核优化、组件选型、网络存储、安全加固、业务规范、运维配套全流程。

整体分7大块:部署前规划、操作系统内核前置优化、集群组件选型与安装、网络存储核心部署、安全加固、业务Pod规范、集群运维配套、上线验收清单

1. 部署前期规划(决定集群稳定性,最容易忽略)

1.1. 节点角色划分(标准生产架构)

  1. 控制平面 Master
    推荐奇数台:3台(最小高可用)/5台;
    组件:etcd、kube-apiserver、kube-controller-manager、kube-scheduler;
    规范:Master不跑业务Pod(设置污点+容忍,隔离算力)。
  2. Worker 工作节点
    承载业务容器、GPU训练/推理、中间件;
    按业务拆分标签:workload=online在线业务、workload=train离线训练、workload=cache缓存。
  3. 特殊节点
    GPU节点、存储节点、Ingress专用节点、监控节点,通过节点亲和调度隔离。

1.2. 资源规划

  1. etcd 独立资源
    etcd性能瓶颈直接卡死集群,必须:独立SSD盘、CPU高主频、内存充足;
    禁止etcd和业务共用磁盘,etcd数据单独挂载。
  2. Master 资源
    apiserver是性能瓶颈,高并发集群给充足CPU内存;
  3. Worker 资源池
    在线业务:高主频CPU、SSD;
    AI训练:大内存、HBM GPU、IB高速网卡;
  4. 资源预留每台节点必须预留 kube-reservedsystem-reserved,防止业务打满节点导致组件崩溃。

1.3. 版本统一规范

  1. k8s 集群全节点小版本完全一致;
  2. 容器运行时、CNI、CSI、GPU DevicePlugin版本匹配k8s;
  3. 生产选用长期支持稳定版(1.24~1.30主流),规避废弃API。

1.4. 网段规划(提前规划不可修改)

  1. PodCIDR、ServiceCIDR、宿主机网段三层完全隔离,无重叠;
  2. 集群内部网段禁止和企业内网、云VPC冲突;
  3. StatefulSet、Headless Service预留域名解析容量;
  4. 大规模集群提前拆分子网,避免CNI路由爆炸。

2. 宿主机操作系统前置部署优化(集群稳定根基)

2.1. 内核参数(所有节点统一配置)

# /etc/sysctl.conf
# 开启内核转发,容器跨主机通信必备
net.ipv4.ip_forward = 1
# 允许iptables桥接流量转发
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# 缓解大量短连接TIME_WAIT堆积
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
# 调高连接跟踪上限,高并发集群必调
net.nf_conntrack_max = 1048576
# 关闭swap,k8s硬性要求
vm.swappiness = 0
# 关闭透明巨页,容器内存碎片
echo never > /sys/kernel/mm/transparent_hugepage/enabled

2.2. 关闭Swap(强制要求)

kubelet检测到swap开启会严重影响调度、OOM判断,部署前永久关闭:

swapoff -a
# 注释/etc/fstab内swap挂载项永久生效

2.3. 文件句柄与进程限制

# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535

2.4. 系统服务基础配置

  1. 关闭防火墙/按需放通集群端口;云主机配置安全组放行集群通信端口;
  2. 关闭SELinux;
  3. 时间同步chrony,全集群时区统一Asia/Shanghai;
  4. 主机名唯一,不使用localhost;
  5. 禁用无用系统服务,减少资源抢占。

3. 容器运行时部署重点(containerd为主,淘汰docker)

3.1. 选型标准

k8s 1.24+移除dockershim,生产统一使用 containerd

3.2. 核心配置关键点

  1. cgroup驱动统一 systemd,kubelet和containerd cgroup驱动必须一致;
  2. 镜像存储目录单独SSD磁盘,拆分系统盘;
  3. 配置镜像加速器(国内镜像仓库),解决拉取超时;
  4. 限制容器最大并发拉取镜像,避免带宽打满;
  5. 开启cgroup监控,支持metrics采集;
  6. 垃圾回收策略:镜像自动清理、停止容器定期删除,防止磁盘爆满。

3.3. 避坑点

  • cgroup驱动不一致会导致kubelet启动失败、Pod资源限制失效;
  • 镜像目录共用系统盘,批量拉镜像IO打满节点。

4. 集群控制平面部署核心(kubeadm/二进制两种方式通用重点)

4.1. etcd 重中之重

  1. 3节点独立部署,不内嵌master;
  2. 数据目录独立高速SSD;
  3. 开启定期快照备份,定时异地存储;
  4. 调整Raft心跳、选举超时,跨机房集群调大延迟参数;
  5. 限制单节点连接数,开启etcd监控告警。

4.2. kube-apiserver(集群唯一入口)

  1. 高可用负载均衡:内部VIP/云LB,所有节点统一访问;
  2. 核心配置:限流参数--max-requests-inflight,防止突发请求压垮API;
  3. 审计日志开启:记录资源增删改、删除Pod、变更权限,安全审计必备;
  4. 准入控制器:NodeRestriction、ResourceQuota、Mutating/Validating Webhook;
  5. TLS证书统一管理,定期轮换,禁止长期永久证书。

4.3. kube-controller-manager & kube-scheduler

  1. 开启领导者选举,防止多实例重复调谐;
  2. 控制器并发调参,大规模集群提升副本同步速度;
  3. 调度器开启Scheduling Framework,支持自定义调度扩展(GPU/Volcano);
  4. 多调度器隔离:在线推理、离线训练分开调度Profile。

4.4. kubelet 所有节点统一配置

  1. cgroup驱动=systemd;
  2. 配置节点资源预留 kube-reservedsystem-reserved
  3. 开启镜像垃圾回收、容器磁盘阈值;
  4. 保护节点关键进程,防止OOM杀死集群组件;
  5. 证书轮换自动更新;
  6. 开启pod metrics采集,供监控、HPA使用。

5. 网络组件部署重点(CNI)

5.1. 主流选型:Calico(生产首选)

  1. 模式选用IPIP/BGP,云主机优先BGP性能更高;
  2. 支持NetworkPolicy网络隔离,多业务集群必须开启;
  3. MTU统一适配宿主机网卡,防止大包丢包;
  4. 节点间防火墙放行CNI通信端口;
  5. 监控Calico节点状态、路由同步日志。

5.2. CoreDNS(集群DNS)

  1. 至少2副本高可用,禁止单实例;
  2. 配置缓存、ndots优化,解决长域名解析问题;
  3. 资源限制配置,防止DNS解析打满节点;
  4. 网络策略放行53端口UDP/TCP;
  5. 配置自定义上游DNS,支持外部云服务域名解析。

5.3. kube-proxy

  1. 生产推荐ipvs模式,性能远高于iptables;
  2. 调大ipvs连接跟踪上限;
  3. 开启metrics监控Service转发状态。

6. 存储体系部署重点(CSI PV/PVC)

6.1. 存储分层规划

  1. 本地SSD:高性能数据库、Redis、AI模型缓存(LocalPV);
  2. 云厂商CSI块存储:通用业务有状态服务StatefulSet;
  3. 对象存储:数据集、备份、日志归档;
  4. 禁止普通业务使用共享NAS,IO性能差易抖动。

6.2. CSI存储驱动部署规范

  1. 存储控制器单副本/多副本高可用;
  2. 节点DaemonSet每台节点部署代理;
  3. 配置StorageClass:区分高性能/普通存储,设置默认SC;
  4. 开启PV自动回收策略(Retain/Delete);
  5. 快照、克隆功能开启,支持数据备份恢复。

6.3. StatefulSet专属存储

使用volumeClaimTemplates,每Pod独立PVC,数据隔离;
生产数据库、向量库、分布式训练Worker强制使用StatefulSet+独立PVC。

7. GPU异构算力部署(AI集群核心重点)

  1. NVIDIA GPU Operator一键部署整套组件:
    nvidia-container-toolkit、DevicePlugin、dcgm-exporter;
  2. DevicePlugin上报GPU资源,调度器识别nvidia.com/gpu
  3. MIG切分配置:推理节点开启MIG,大模型训练节点关闭;
  4. DCGM监控GPU硬件指标、XID故障、NVLink带宽;
  5. 调度适配:Volcano/Koordinator Gang调度,分布式训练原子调度。

8. 集群安全部署重点(上线必做加固)

  1. RBAC权限最小化
    禁止default服务账号高权限;各业务Namespace独立ServiceAccount,仅分配所需资源操作权限;
  2. 网络隔离 NetworkPolicy
    不同业务Namespace隔离入站出站流量,禁止全通访问;
  3. 容器安全限制
    Pod安全上下文:禁止root运行、降低capabilities、只读根文件系统、限制进程PID;
    镜像策略:准入Webhook拦截高危镜像、私有镜像仓库认证;
  4. Secret安全
    数据库密码、AK密钥统一存Secret,禁止明文写YAML、ConfigMap;
  5. API审计
    apiserver审计日志持久化存储,留存90天以上;
  6. 节点安全
    仅内网访问集群端口,云安全组限制来源IP;定期节点漏洞扫描。

9. 业务标准部署规范(Deployment/StatefulSet通用)

9.1. 资源配额与限制(强制)

每个Pod必须配置 requests(调度依据)+ limits(熔断保护节点);
Namespace配置ResourceQuota,防止单业务耗尽集群资源。

9.2. 健康探针三探针完整配置

startupProbe、livenessProbe、readinessProbe,避免流量打到未就绪容器、异常容器长期占用资源。

9.3. 污点、亲和调度隔离

  • 节点污点:GPU节点、在线业务节点打污点;
  • 节点亲和、Pod反亲和:打散副本,避免单节点故障全部宕机;

9.4. 更新策略规范

  1. Deployment:滚动更新maxSurge/maxUnavailable,灰度发布;
  2. StatefulSet:数据库选用OnDelete,普通存储服务RollingUpdate+partition灰度。

9.5. 持久化规范

无状态服务用临时存储EmptyDir;有状态必须绑定PVC,禁止容器本地盘存核心数据。

9.6. 日志规范

容器日志输出stdout/stderr,配置日志轮转,防止节点磁盘打满;统一对接EFK日志收集。

10. 集群配套运维组件部署(上线同步搭建)

  1. 监控体系 Prometheus
  • metrics-server:提供CPU内存指标,支撑HPA自动扩缩容;
  • 采集指标:节点、容器、apiserver、etcd、GPU、中间件;
  • 告警规则:节点宕机、Pod重启、CPU/内存过高、PVC满、GPU故障。
  1. Ingress 七层网关
    Nginx-Ingress,统一入口,SSL证书管理、限流、黑白名单;
  2. 备份组件
    etcd定时快照备份、PVC定时快照、容器业务数据定时导出;
  3. 自动扩缩容 HPA
    基于CPU/内存/自定义QPS指标弹性伸缩;
  4. 集群日志 EFK
    统一收集容器、节点、组件日志,故障检索。

11. 上线前验收部署检查清单

  1. 系统层面:swap关闭、内核参数全部生效、cgroup驱动统一systemd;
  2. 控制平面:etcd独立SSD、apiserver高可用LB、审计日志开启;
  3. 网络:Calico正常、CoreDNS双副本、pod/service网段无冲突、nslookup解析正常;
  4. 存储:CSI StorageClass就绪、PV可正常挂载删除;
  5. 算力:GPU节点DevicePlugin正常,可调度nvidia.com/gpu资源;
  6. 安全:RBAC最小权限、NetworkPolicy隔离、Pod非root运行;
  7. 业务规范:所有Pod配置requests/limits、健康探针、日志标准输出;
  8. 运维配套:监控告警打通、etcd自动备份、日志收集正常;
  9. 高可用验证:单Master/单Worker节点宕机,集群调度、业务不受影响。

12. 部署高频致命坑总结

  1. 未关闭swap,kubelet OOM逻辑错乱,容器随机被杀;
  2. containerd与kubelet cgroup驱动不一致,资源限制失效;
  3. etcd共用系统盘,写入IO阻塞整个集群API;
  4. 未配置节点资源预留,业务打满内存导致kubelet/apiserver崩溃;
  5. CoreDNS单副本,DNS故障所有业务无法解析域名;
  6. Pod不配置limits,单个容器耗尽节点资源引发连锁故障;
  7. 容器使用root权限运行,存在逃逸安全风险;
  8. 不做NetworkPolicy,多业务完全互通,故障扩散、数据泄露;
  9. StatefulSet使用普通EmptyDir,节点重建丢失业务持久数据;
  10. 云主机安全组放开集群端口给全网,存在入侵风险。