← Lesson 0015 讲了 Ingress、ConfigMap、Volume。最后一课把 K8s 技能提升到生产可用的水平。
没有 Helm:每次部署要 kubectl apply 一堆 YAML 文件,环境不同值不同。
有了 Helm:一个 Chart 包好所有资源,values.yaml 区分环境。
# 安装 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 搜索和安装现成的 Chart
helm repo add bitnami https://charts.bitnami.com/bitnami
helm search repo bitnami/nginx
helm install my-nginx bitnami/nginx --set service.type=NodePort
# 创建自己的 Chart
helm create my-app
# 目录结构:
# my-app/
# Chart.yaml # Chart 元信息(名字、版本)
# values.yaml # 默认配置值
# templates/ # K8s YAML 模板(带 {{ .Values.xxx }} 变量)
# deployment.yaml
# service.yaml
# ingress.yaml
# 不同环境用不同的 values 文件
helm install my-app-staging ./my-app -f values-staging.yaml
helm install my-app-prod ./my-app -f values-prod.yaml
# 升级/回滚
helm upgrade my-app-staging ./my-app -f values-staging.yaml
helm rollback my-app-staging 1
HPA (Horizontal Pod Autoscaler) 根据 CPU/内存/自定义指标自动增减 Pod 数量。
# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-deploy
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # 平均 CPU 70% 时扩容
# 前提:Deployment 里必须设了 resources.requests
kubectl apply -f hpa.yaml
kubectl get hpa
# NAME REFERENCE TARGETS MIN MAX REPLICAS
# web-hpa Deployment/web-deploy 45%/70% 2 10 3
不是所有人都应该有集群管理员权限。RBAC 控制谁(Subject)能对什么(Resource)做什么(Verb)。
# rbac.yaml —— 给 CI/CD pipeline 只读权限
apiVersion: v1
kind: ServiceAccount
metadata:
name: deployer
namespace: production
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "update", "patch"] # 可以更新 Deployment
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: production
name: deployer-pod-reader
subjects:
- kind: ServiceAccount
name: deployer
namespace: production
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
权限三要素:
Lesson 0009 的 Prometheus + Grafana 可以直接接入 K8s:
# 用 Helm 一键装 Prometheus Stack(含 Grafana)
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace
# 自动发现并监控:
# - 所有 Node 的系统指标
# - 所有 Pod 的 CPU/内存
# - K8s 组件(API Server、etcd、scheduler)
# - 你的应用(加 ServiceMonitor CRD)
# 访问 Grafana
kubectl port-forward -n monitoring svc/monitoring-grafana 3000:80
# 默认密码:admin / prom-operator
| 措施 | 为什么 |
|---|---|
| 不用 root 跑容器 | 减少攻击面。securityContext.runAsNonRoot: true |
| 镜像扫描 | Trivy / Clair 扫已知漏洞 |
| NetworkPolicy | 限制 Pod 之间能访问什么(最小权限) |
| PodSecurityStandards | 禁止 privileged 容器、hostNetwork 等危险配置 |
| Secret 加密 | etcd 里的 Secret 应该加密存储 |
| RBAC 最小权限 | 每个 ServiceAccount 只给必需的权限 |
| 审计日志 | 记录谁什么时候做了什么 |
0014 — 核心概念
Pod → Deployment → Service → Namespace → kubectl
↓
0015 — 网络与配置
Ingress → ConfigMap → Secret → Volume/PVC → Probes → 资源限制
↓
0016 — 生产实践(本课)
Helm → HPA → RBAC → 监控 → 安全清单
如果你有 minikube/kind,试试完成这些任务:
helm install test bitnami/nginxkubectl get allhelm uninstall test