Skip to content

第十四部分:K8s 安全与运维实战深度解析

本章系统讲解 K8s 安全体系、Helm/GitOps 工程实践、可观测性设计、集群升级与灾备。


14.1 RBAC 权限模型

Role            → namespace 级别权限规则
ClusterRole     → 集群级别权限规则
RoleBinding     → 将 Role 绑定到用户/ServiceAccount
ClusterRoleBinding → 将 ClusterRole 绑定到用户/ServiceAccount

最小权限设计实例(CI/CD 流水线):

yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: cicd-deployer
  namespace: production
rules:
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch"]
- apiGroups: [""]
  resources: ["services", "configmaps"]
  verbs: ["get", "list", "create", "update", "patch"]
# 不授予 pods/exec、secrets、nodes 等危险权限
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cicd-deployer-binding
  namespace: production
subjects:
- kind: ServiceAccount
  name: cicd-pipeline
  namespace: cicd-system
roleRef:
  kind: Role
  name: cicd-deployer

ClusterRole 降维使用: ClusterRole + RoleBinding = 只在指定 namespace 生效。


14.2 NetworkPolicy

yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-only
spec:
  podSelector:
    matchLabels: { app: api }
  policyTypes: [Ingress, Egress]
  ingress:
  - from:
    - podSelector: { matchLabels: { app: frontend } }
    ports:
    - port: 8080
  egress:
  - to:
    - podSelector: { matchLabels: { app: database } }
    ports:
    - port: 3306

要点:

  • 默认策略是"允许所有",生产环境先创建 default-deny
  • 需要 CNI 支持(Calico/Cilium 支持,Flannel 不支持)
  • DNS 端口(53/UDP)需要显式放行

14.3 Pod Security Standards(PSA)

K8s 1.25+ 替代 PSP,通过 namespace label 生效:

级别限制适用场景
Privileged无限制系统组件
Baseline禁止已知危险配置一般工作负载
Restricted无 root、只读 rootfs、最小 capabilities安全敏感应用
yaml
apiVersion: v1
kind: Namespace
metadata:
  name: production
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/warn: restricted

安全加固清单:

  • 禁用匿名认证、启用审计日志
  • 加密 etcd 中的 Secret(EncryptionConfiguration)
  • 默认拒绝入站 NetworkPolicy
  • 使用 Trivy 扫描镜像、Kyverno 限制镜像来源

14.4 Helm 与 GitOps

Helm Chart 最佳实践

my-chart/
├── Chart.yaml / values.yaml / values-prod.yaml
├── templates/ (deployment/service/hpa/_helpers.tpl)
└── tests/test-connection.yaml

ArgoCD GitOps 工作流

Git 仓库(唯一真相来源)→ ArgoCD 检测变更 → Sync → K8s 调谐
  • Manual Sync:生产推荐,人工审批
  • Automatic + SelfHeal:自动修复配置漂移
  • Sync Wave:annotation 控制部署顺序

14.5 可观测性体系

四大黄金指标

  1. 延迟(Latency)— 区分成功/错误请求
  2. 流量(Traffic)— QPS/TPS
  3. 错误率(Errors)— 5xx/超时/异常
  4. 饱和度(Saturation)— CPU/Memory/磁盘使用率

日志架构推荐

Fluent Bit(DaemonSet,轻量采集)
  → Kafka(缓冲,应对突发)
  → Loki(标签化存储,Grafana 原生集成)

告警设计原则

  • 每个告警必须有明确的 Action(否则就是噪音)
  • 区分 Critical(需立即处理)、Warning(计划处理)、Info(记录观察)
  • 设置合理的 for 持续时间避免抖动误告

14.6 集群升级与灾备

升级流程

1. 备份 etcd
2. 升级控制平面(一次一个小版本,不跳版本)
3. 升级 kubelet(逐节点 cordon + drain + upgrade + uncordon)
4. 升级 CNI/CSI 插件
5. 验证集群功能

etcd 备份

bash
etcdctl snapshot save /backup/etcd-$(date +%Y%m%d).db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 验证
etcdctl snapshot status /backup/etcd.db -w table

Velero 全集群备份

bash
velero backup create full-backup --include-namespaces '*' --snapshot-volumes --ttl 720h
velero restore create --from-backup full-backup

14.7 本章小结

核心概念关键要点
RBAC最小权限,ClusterRole 可降维到 namespace
NetworkPolicydefault-deny + 白名单,需 CNI 支持
PSA1.25+ 三级别替代 PSP
GitOpsGit 唯一真相来源,ArgoCD 自动同步
可观测性四大黄金指标,Fluent Bit → Kafka → Loki
灾备etcd 定时快照 + Velero 全集群备份

练习

  1. 为 CI/CD ServiceAccount 创建最小权限 RBAC,验证无法访问 secrets。
  2. 部署 default-deny NetworkPolicy,逐步添加白名单。
  3. 使用 Velero 备份并恢复到新集群验证数据完整性。

上一章:第十三部分:存储、调度与资源管理深度解析 下一章:第十五部分:高可用、故障排查与高级进阶