返回博客

Kubernetes生产环境最佳实践

☸️

前言

Kubernetes 已成为容器编排的事实标准,但在生产环境中部署和管理 K8s 集群需要考虑诸多因素。本文将从集群架构、网络配置、安全策略、资源管理等方面,分享生产环境部署 K8s 的最佳实践经验。

集群架构设计

节点规划

合理的节点规划是集群稳定运行的基础:

高可用架构

# 多 Control Plane 高可用架构示例
┌─────────────────────────────────────────┐
│              负载均衡器                  │
│         (云厂商 CLB / Nginx)             │
└────────────┬──────────────┬─────────────┘
             │              │              │
     ┌───────┴───────┐ ┌────┴─────┐ ┌──────┴──────┐
     │  Control-1   │ │Control-2 │ │  Control-3  │
     └───────┬───────┘ └────┬─────┘ └──────┬──────┘
             │              │              │
             └──────────────┼──────────────┘
                            │
                    ┌───────┴───────┐
                    │  Etcd Cluster │
                    └───────────────┘

网络配置

CNI 插件选择

生产环境推荐使用以下 CNI 插件:

网络策略

# 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 进行集群监控:

日志收集

推荐使用 EFK 或 Loki 进行日志收集:

灾难恢复

生产环境必须做好以下备份:

总结

Kubernetes 生产环境部署是一个系统工程,需要从架构、网络、安全、资源、监控等多个维度综合考虑。遵循这些最佳实践,可以构建一个稳定、安全、高效的 K8s 集群。

DS

Jerry Dev

全栈开发工程师,专注于容器化和自动化运维领域

文章 42
阅读 28.5k
粉丝 1.2k

文章目录