1. Kubernetes集群主机配置的核心考量
在构建生产级Kubernetes集群时,主机配置的合理性直接影响集群的稳定性和性能表现。根据我在金融、电商等多个行业的落地经验,主机配置绝非简单的资源堆砌,而是需要结合业务特性进行精细化设计。
1.1 计算资源分配策略
主机的CPU和内存配置需要遵循"黄金分割"原则。以典型的8核32GB配置为例:
- 系统预留:通常保留1核和1GB内存给操作系统和基础服务
- Kube组件开销:kubelet、kube-proxy等占用约0.5核和500MB
- 剩余资源:6.5核/30.5GB用于工作负载,建议设置80%利用率阈值
重要提示:切勿将所有资源分配给Pod,必须为系统进程和突发负载保留缓冲空间。我曾见过某电商平台在促销期间因未预留资源导致节点OOM崩溃的案例。
1.2 存储配置要点
存储配置常被忽视但至关重要:
- 系统分区:/var/lib/docker和/var/lib/kubelet必须单独挂载SSD
- 分区大小建议:
- /var/lib/docker:至少100GB(容器镜像存储)
- /var/lib/kubelet:每节点50GB起步(Pod数据卷)
- 文件系统选择:推荐xfs(相比ext4有更好的inode处理能力)
1.3 操作系统优化项
Ubuntu 22.04 LTS作为当前最稳定的Kubernetes宿主系统,需要做以下调优:
# 关闭swap(Kubernetes强制要求) sudo swapoff -a sed -i '/swap/s/^/#/' /etc/fstab # 调整内核参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 fs.file-max = 6553560 EOF sudo sysctl --system2. 生产级网络规划方法论
Kubernetes网络设计需要同时满足Pod通信、服务发现和外部访问三大需求。以下是经过多个大型项目验证的规划方案。
2.1 CIDR分配黄金法则
网络地址规划必须避免未来扩容时的冲突问题:
| 网络类型 | 分配原则 | 示例范围 |
|---|---|---|
| Pod网络 | 每个节点分配/24子网 | 10.244.0.0/16 |
| Service网络 | 使用不与任何物理网络重叠的段 | 10.96.0.0/12 |
| 节点网络 | 与现有数据中心网络协调 | 192.168.100.0/24 |
血泪教训:某制造业客户曾将Service网段设置为10.0.0.0/8,结果与办公网冲突导致整个集群不可用。
2.2 CNI插件选型指南
主流CNI插件的性能对比(基于100节点压测数据):
| 插件类型 | 网络性能 | IPAM效率 | 调试复杂度 | 适用场景 |
|---|---|---|---|---|
| Calico | ★★★★☆ | ★★★★ | ★★☆☆☆ | 需要网络策略 |
| Flannel | ★★★☆☆ | ★★★★☆ | ★☆☆☆☆ | 简单场景快速部署 |
| Cilium | ★★★★★ | ★★★☆ | ★★★★☆ | 高性能微服务 |
2.3 多租户网络隔离方案
对于需要多团队共享集群的场景,必须实现网络隔离:
- 通过NetworkPolicy实现L3/L4隔离:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: tenant-isolation spec: podSelector: matchLabels: tenant: finance policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: tenant: finance- 使用Cilium的L7策略实现应用层隔离
- 结合服务网格(如Istio)进行细粒度流量控制
3. 高可用架构设计实践
3.1 控制平面部署模式
三种主流的高可用方案对比:
堆叠式etcd:
- 特点:每个master节点运行etcd和control plane组件
- 优点:部署简单,节省资源
- 缺点:etcd流量与API Server竞争带宽
独立etcd集群:
- 特点:etcd运行在专用节点
- 优点:性能隔离,扩展性强
- 缺点:硬件成本增加30%以上
外部etcd服务:
- 特点:使用云厂商托管etcd
- 优点:运维复杂度最低
- 缺点:存在厂商锁定风险
3.2 节点健康检查策略
有效的健康检查能预防雪崩效应:
apiVersion: v1 kind: Pod metadata: name: web-app spec: containers: - name: app livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 15 periodSeconds: 20 failureThreshold: 3 readinessProbe: exec: command: - sh - -c - curl -s http://localhost:8080/ready | grep OK initialDelaySeconds: 5 periodSeconds: 10关键参数说明:
failureThreshold=3:连续3次失败才判定异常periodSeconds=20:检查间隔不宜过短(避免误判)
4. 安全加固与合规配置
4.1 CIS基准合规要点
Kubernetes安全基准的核心要求:
API Server安全:
- 禁用匿名访问
--anonymous-auth=false - 启用RBAC
--authorization-mode=RBAC
- 禁用匿名访问
etcd加密:
- 启用TLS双向认证
- 数据静态加密(KMS集成)
Pod安全策略:
- 禁止特权容器
- 强制只读根文件系统
4.2 网络策略实施案例
典型的三层防御策略:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: db-firewall spec: podSelector: matchLabels: role: database policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: role: application ports: - protocol: TCP port: 54324.3 审计日志配置
关键审计策略配置示例:
apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: Metadata resources: - group: "" resources: ["secrets"] verbs: ["create", "update", "patch"] - level: RequestResponse resources: - group: "apps" resources: ["deployments"]日志保留建议:
- 热存储:保留7天(用于实时监控)
- 冷存储:保留1年(用于合规审计)
在实施过程中,我发现很多团队容易忽视kubelet的认证配置。正确的做法是为每个kubelet颁发唯一客户端证书,而不是共享证书。某次安全事件溯源时,正是这个细节帮助我们快速定位了入侵路径。