主题
第十四部分: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-deployerClusterRole 降维使用: 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.yamlArgoCD GitOps 工作流
Git 仓库(唯一真相来源)→ ArgoCD 检测变更 → Sync → K8s 调谐- Manual Sync:生产推荐,人工审批
- Automatic + SelfHeal:自动修复配置漂移
- Sync Wave:annotation 控制部署顺序
14.5 可观测性体系
四大黄金指标
- 延迟(Latency)— 区分成功/错误请求
- 流量(Traffic)— QPS/TPS
- 错误率(Errors)— 5xx/超时/异常
- 饱和度(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 tableVelero 全集群备份
bash
velero backup create full-backup --include-namespaces '*' --snapshot-volumes --ttl 720h
velero restore create --from-backup full-backup14.7 本章小结
| 核心概念 | 关键要点 |
|---|---|
| RBAC | 最小权限,ClusterRole 可降维到 namespace |
| NetworkPolicy | default-deny + 白名单,需 CNI 支持 |
| PSA | 1.25+ 三级别替代 PSP |
| GitOps | Git 唯一真相来源,ArgoCD 自动同步 |
| 可观测性 | 四大黄金指标,Fluent Bit → Kafka → Loki |
| 灾备 | etcd 定时快照 + Velero 全集群备份 |
练习
- 为 CI/CD ServiceAccount 创建最小权限 RBAC,验证无法访问 secrets。
- 部署 default-deny NetworkPolicy,逐步添加白名单。
- 使用 Velero 备份并恢复到新集群验证数据完整性。