Kubernetes 作为企业级容器编排平台,提供了完善的安全和资源管理机制。本文将深入探讨 Secrets 敏感信息管理、资源配额限制以及基于 RBAC 的访问控制,帮助您构建更安全、稳定的 Kubernetes 环境。

一、Secrets:安全地管理敏感信息

Secrets 是 Kubernetes 中用于存储敏感信息的对象,如密码、OAuth 令牌、SSH 密钥等。与 ConfigMaps 不同,Secrets 内容默认以 Base64 编码存储,提供基本的安全保护。

创建 Secret

# 通过命令行创建 Secret
kubectl create secret generic mysql-secret \
  --from-literal=password=MyS3cr3tP@ssw0rd \
  --from-literal=username=admin

在 Pod 中使用 Secret

apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: mysql:8.0
    env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-secret
          key: password
    - name: MYSQL_USER
      valueFrom:
        secretKeyRef:
          name: mysql-secret
          key: username

最佳实践扩展

  1. 加密存储:考虑使用 Kubernetes 的 EncryptionConfiguration 对 Secret 进行静态加密

  2. 外部 Secret 管理:对于生产环境,可集成外部 Secret 管理方案如 HashiCorp Vault、AWS Secrets Manager

  3. 定期轮换:建立 Secret 定期轮换机制,增强安全性

二、资源配额:控制资源使用

资源配额(Resource Quotas)确保集群资源被公平使用,防止单个命名空间消耗过多资源而影响其他应用。

命名空间资源配额

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: production
spec:
  hard:
    requests.cpu: "2"
    requests.memory: 4Gi
    limits.cpu: "4"
    limits.memory: 8Gi
    pods: "10"
    services: "5"
    secrets: "10"
    configmaps: "10"
    persistentvolumeclaims: "4"

Pod 资源限制

apiVersion: v1
kind: Pod
metadata:
  name: limited-pod
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

资源管理扩展

  1. LimitRange:设置默认资源请求和限制,确保所有 Pod 都有适当的资源约束

  2. 监控与告警:结合 Prometheus 和 Grafana 监控资源使用情况,设置适当告警

  3. 自动扩缩:使用 HPA(Horizontal Pod Autoscaler)和 VPA(Vertical Pod Autoscaler)自动调整资源

三、访问控制:RBAC 实践

Kubernetes 使用基于角色的访问控制(RBAC)来管理对集群资源的访问权限。

创建 ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:
  name: ci-cd-serviceaccount
  namespace: production

定义角色和角色绑定

# 创建角色(限定在特定命名空间)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: production
  name: deployment-manager
rules:
- apiGroups: ["apps", ""]
  resources: ["deployments", "pods", "services"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
# 将角色绑定到ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: deployer-binding
  namespace: production
subjects:
- kind: ServiceAccount
  name: ci-cd-serviceaccount
  namespace: production
roleRef:
  kind: Role
  name: deployment-manager
  apiGroup: rbac.authorization.k8s.io

网络策略控制

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-policy
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: database
    ports:
    - protocol: TCP
      port: 5432

访问控制扩展

  1. 最小权限原则:只为用户和服务账户授予完成其任务所需的最小权限

  2. 定期审计:使用 kubectl auth can-i 命令或 OpenPolicyAgent 定期审计权限

  3. 命名空间隔离:使用命名空间隔离不同环境(开发、测试、生产)的资源

  4. Pod安全策略:使用 Pod Security Standards 或 PodSecurityPolicy(已弃用)/Pod Security Admission 控制Pod安全标准

总结

Kubernetes 提供了多层次的安全和资源管理机制:

  1. Secrets 帮助安全地管理敏感信息,但需要注意配合加密和轮换策略

  2. 资源配额 确保集群资源公平使用,防止资源饥饿

  3. RBAC 提供精细的访问控制,遵循最小权限原则

将这些功能结合使用,可以构建出既安全又高效的 Kubernetes 环境。在实际应用中,建议结合企业实际需求,制定适当的安全策略和资源管理规范,并定期进行审计和优化。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐