前言
Kubernetes 已成为容器编排的事实标准,但在生产环境中部署和管理 K8s 集群需要考虑诸多因素。本文将从集群架构、网络配置、安全策略、资源管理等方面,分享生产环境部署 K8s 的最佳实践经验。
集群架构设计
节点规划
合理的节点规划是集群稳定运行的基础:
- Control Plane 节点:至少3个节点保证高可用,建议使用独立的高配机器
- Worker 节点:根据负载情况配置,通常比 Control Plane 资源配置更高
- Etcd 集群:生产环境建议使用独立的 etcd 集群,与 Control Plane 分离
高可用架构
# 多 Control Plane 高可用架构示例
┌─────────────────────────────────────────┐
│ 负载均衡器 │
│ (云厂商 CLB / Nginx) │
└────────────┬──────────────┬─────────────┘
│ │ │
┌───────┴───────┐ ┌────┴─────┐ ┌──────┴──────┐
│ Control-1 │ │Control-2 │ │ Control-3 │
└───────┬───────┘ └────┬─────┘ └──────┬──────┘
│ │ │
└──────────────┼──────────────┘
│
┌───────┴───────┐
│ Etcd Cluster │
└───────────────┘
网络配置
CNI 插件选择
生产环境推荐使用以下 CNI 插件:
- Calico - 功能丰富,支持网络策略和 BGP
- Cilium - 基于 eBPF,性能优秀
- Flannel - 简单易用,适合小规模集群
网络策略
# NetworkPolicy 示例:限制命名空间间访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-network-policy
namespace: production
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: frontend
ports:
- protocol: TCP
port: 8080
资源管理
Resource Requests 和 Limits
为每个容器设置合理的资源请求和限制:
apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
containers:
- name: web
image: nginx:latest
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
LimitRange 和 ResourceQuota
# 限制命名空间内的资源使用
apiVersion: v1
kind: ResourceQuota
metadata:
name: namespace-quota
spec:
hard:
requests.cpu: "10"
requests.memory: 20Gi
limits.cpu: "20"
limits.memory: 40Gi
pods: "100"
安全策略
RBAC 权限控制
# 创建只读 ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: readonly-user
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: readonly-role
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: readonly-binding
subjects:
- kind: ServiceAccount
name: readonly-user
roleRef:
kind: Role
name: readonly-role
Pod 安全策略
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: MustRunAsNonRoot
fsGroup:
rule: RunAsAny
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
- 'persistentVolumeClaim'
监控与日志
Prometheus + Grafana 监控
推荐使用 Prometheus Operator 进行集群监控:
- kube-state-metrics:采集 K8s 对象状态
- node-exporter:采集节点指标
- prometheus-adapter:自定义指标
- Grafana:可视化展示
日志收集
推荐使用 EFK 或 Loki 进行日志收集:
- Fluent Bit - 轻量级日志收集器
- Elasticsearch - 日志存储和搜索
- Kibana - 日志可视化
- Loki - Grafana 原生日志系统,更轻量
灾难恢复
生产环境必须做好以下备份:
- 定期备份 etcd 数据
- 备份 PersistentVolume 数据
- 备份 ConfigMap 和 Secret
- 定期进行灾难恢复演练
总结
Kubernetes 生产环境部署是一个系统工程,需要从架构、网络、安全、资源、监控等多个维度综合考虑。遵循这些最佳实践,可以构建一个稳定、安全、高效的 K8s 集群。