基础入门仅能部署简单无状态Web服务,进阶内容直接解决生产痛点:数据库/中间件有状态部署、集群资源管控、精细化调度、RBAC权限隔离、自动弹性伸缩、存储持久化、安全加固、监控告警、故障快速定位、Operator自定义控制器。全文所有配置均经过v1.24~v1.30多版本集群验证,无理论空谈,落地即用。
一、进阶工作负载控制器:StatefulSet、DaemonSet、Job/CronJob
入门只学Deployment只能跑无状态应用,生产80%复杂业务依赖三类进阶控制器。
1. StatefulSet 有状态应用核心(MySQL、Redis、Kafka、ES必备)
Deployment Pod名称随机、存储共享、并行启停,不适合数据库这类需要固定身份、独立数据盘的服务,StatefulSet补齐短板。
核心特性
- 有序稳定Pod标识:pod-0、pod-1、pod-2,重启迁移名称不变
- 独立持久存储:通过volumeClaimTemplate自动为每个Pod生成专属PVC,删除Pod不会自动删数据卷
- 顺序创建、逆序销毁:启动0→1→2,销毁2→1→0,满足主从依赖
- 搭配Headless Service,提供固定DNS域名服务发现,pod-0.svc-name.ns.svc.cluster.local
最简可运行示例(Nginx有状态演示)
yaml
# headless-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-headless
spec:
selector:
app: nginx-sts
clusterIP: None # Headless标识,无集群IP,直接解析Pod域名
ports:
- port: 80
targetPort: 80
---
# statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-sts
spec:
serviceName: nginx-headless # 必须绑定headless svc
replicas: 2
selector:
matchLabels:
app: nginx-sts
template:
metadata:
labels:
app: nginx-sts
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
# 自动批量创建PVC,每个Pod独立存储
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
实操命令与生产踩坑
bash
# 创建资源
kubectl apply -f headless-service.yaml -f statefulset.yaml
# 查看Pod有序名称
kubectl get pods
# 查看自动生成的PVC
kubectl get pvc
# 扩容副本(顺序新增pod-2)
kubectl scale statefulset nginx-sts --replicas=3
# 缩容只会删除高序号Pod,数据卷保留,需手动清理PVC
kubectl scale statefulset nginx-sts --replicas=1
常见坑:删除StatefulSet不会自动删除PVC,重复部署会复用旧数据;不配置Headless Service会导致服务发现异常;不使用StorageClass动态存储需提前手动创建PV。
2. DaemonSet 节点级常驻程序
场景:日志采集(Fluentd)、监控客户端(node-exporter)、网络插件、安全代理,每个节点仅运行一个Pod。
yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: exporter
image: prom/node-exporter:v1.6.0
ports:
- containerPort: 9100
volumeMounts:
- name: host-root
mountPath: /host
volumes:
- name: host-root
hostPath:
path: /
3. Job与CronJob 一次性定时任务
Job:一次性批处理、数据同步、数据库备份;CronJob定时执行,类似Linux crontab。
yaml
# cronjob每日凌晨2点备份数据库
apiVersion: batch/v1
kind: CronJob
metadata:
name: mysql-backup
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: mysql:8.0
command: ["sh","-c","mysqldump -h mysql-service -uroot -p${DB_PASS} testdb > /backup/test.sql"]
env:
- name: DB_PASS
valueFrom:
secretKeyRef:
name: mysql-secret
key: root-pass
restartPolicy: OnFailure
二、持久化存储进阶:PV、PVC、StorageClass动态供给
入门仅用emptyDir、hostPath临时存储,生产必须标准化PV/PVC体系,解决数据持久、存储自动创建问题。
1. PV/PVC静态绑定流程
PV是底层存储资源(云盘、NAS、本地磁盘),PVC是存储申请,控制器自动匹配符合条件的PV。
匹配规则:存储容量、访问模式、StorageClass标签一致。
2. StorageClass 动态存储(生产必备)
静态PV需要运维提前创建,上千业务极难维护,StorageClass对接存储驱动(云厂商CSI、本地LVM、Rook-Ceph),创建PVC时自动生成PV。
yaml
# storageclass.yaml 阿里云CSI示例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: aliyun-disk
provisioner: diskplugin.csi.alibabacloud.com
parameters:
type: cloud_ssd
reclaimPolicy: Retain # 删除PVC保留数据盘,防止误删
allowVolumeExpansion: true # 支持在线扩容
Pod使用时仅需声明storageClassName,无需提前创建PV:
yaml
volumeClaimTemplates:
- metadata:
name: data
spec:
storageClassName: aliyun-disk
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 20Gi
存储核心参数说明
- accessModes:ReadWriteOnce单节点读写、ReadOnly多节点只读、ReadWriteMany多节点共享(NAS适用)
- reclaimPolicy:Retain保留、Delete随PVC删除、Recycle回收清空数据
- allowVolumeExpansion:开启后可直接修改PVC存储容量扩容,无需重建Pod
三、集群调度进阶:亲和性、污点容忍、拓扑分布约束
默认调度器仅简单过滤资源,线上需要精细化控制Pod部署节点,实现负载均衡、业务隔离、硬件资源独占(GPU节点)。
1. NodeSelector 基础节点匹配
给节点打标签,Pod仅调度到带指定标签节点
bash
# 节点打标签
kubectl label node worker-01 node-type=ssd
Deployment配置:
yaml
spec:
template:
spec:
nodeSelector:
node-type: ssd
2. 节点亲和 NodeAffinity(软硬约束)
requiredDuringScheduling:强制匹配,不满足则Pod Pending
preferredDuringScheduling:优先匹配,无符合节点可调度其他机器
yaml
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-type
operator: In
values: ["ssd"]
3. Pod亲和/反亲和 PodAffinity、podAntiAffinity
- Pod亲和:关联服务部署同一节点(前端+缓存同机减少网络延迟)
- Pod反亲和:同类Pod分散不同节点,避免单节点故障全挂(多副本Web服务)
yaml
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values: ["web"]
topologyKey: kubernetes.io/hostname
4. 污点与容忍 Taints/Tolerations(隔离特殊节点)
场景:GPU节点、Master控制平面节点,禁止普通业务调度。
bash
# 给master节点打污点,拒绝所有Pod
kubectl taint node master-01 node-role.kubernetes.io/control-plane:NoSchedule
# Pod添加容忍,才能调度到污点节点
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
5. 拓扑分布约束 TopologySpreadConstraints
均衡Pod跨节点、跨机房、跨可用区部署,杜绝单可用区故障服务不可用。
四、自动弹性伸缩:HPA、Metrics Server、VPA
手动调整副本数无法应对流量波动,弹性伸缩是线上高并发业务刚需。
1. Metrics Server 前置依赖
HPA、kubectl top命令都依赖指标采集组件,集群默认未部署,必须先安装:
bash
# 官方yaml部署
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证指标是否正常输出
kubectl top nodes
kubectl top pods
2. HPA 水平自动扩缩(按CPU/内存/自定义指标)
根据负载增减Pod副本数,v2版本支持多指标混合判断:
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
namespace: prod
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70
# 冷却时间,避免频繁抖动扩缩
behavior:
scaleDown:
stabilizationWindowSeconds: 300
3. VPA垂直自动扩缩容
HPA增减副本,VPA自动调整Pod CPU/内存requests和limits,适合流量平稳但资源分配不合理的应用,生产配合监控谨慎使用。
五、RBAC精细化权限管控(生产安全核心)
入门常直接使用cluster-admin超级管理员,多人协作极易误删集群资源,RBAC实现最小权限分配。
核心对象区分
- Role:单个命名空间内权限
- ClusterRole:全集群权限(节点、PV、StorageClass等集群级资源)
- RoleBinding:绑定命名空间Role给用户/ServiceAccount
- ClusterRoleBinding:绑定集群角色全局生效
实战:开发仅允许查看prod命名空间Pod、Service,无删除权限
yaml
# role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: prod
name: dev-read
rules:
- apiGroups: [""]
resources: ["pods","services","configmaps"]
verbs: ["get","list","watch"]
---
# rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: prod
name: dev-read-bind
subjects:
- kind: User
name: dev01
roleRef:
kind: Role
name: dev-read
apiGroup: rbac.authorization.k8s.io
生产最佳实践
- 禁止普通开发分配cluster-admin
- 每个业务独立ServiceAccount,不使用默认default账号
- 定期审计ClusterRoleBinding清理闲置高权限账号
六、应用高级配置:探针、资源配额、配置管理、滚动更新优化
1. 存活/就绪探针(线上故障高发点)
livenessProbe:容器卡死无响应自动重启
readinessProbe:应用未初始化完成不接入Service流量
错误配置会导致频繁重启、流量切到未就绪Pod引发报错
yaml
containers:
- name: web
image: nginx
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 10 # 启动10秒后开始检测
periodSeconds: 5
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 3
2. ResourceQuota+LimitRange 命名空间资源隔离
防止单个业务耗尽集群CPU内存
yaml
# ResourceQuota限制命名空间总资源
apiVersion: v1
kind: ResourceQuota
metadata:
name: prod-quota
namespace: prod
spec:
hard:
pods: "50"
requests.cpu: "20"
requests.memory: 40Gi
limits.cpu: "40"
limits.memory: 80Gi
# LimitRange限制单个Pod资源上下限
apiVersion: v1
kind: LimitRange
metadata:
namespace: prod
spec:
limits:
- default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 200m
memory: 256Mi
max:
cpu: 4
memory: 8Gi
type: Container
3. ConfigMap与Secret进阶
普通配置放ConfigMap,密码、密钥放入Secret,支持挂载文件或环境变量;Secret默认Base64编码,敏感业务需加密存储。
yaml
# secret挂载只读,防止容器内篡改
volumes:
- name: secret-volume
secret:
secretName: mysql-secret
readOnly: true
4. Deployment滚动更新零停机配置
yaml
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 更新过程最多额外启动1个Pod
maxUnavailable: 0 # 更新时不允许任何Pod下线,保障高可用
回滚操作:
bash
# 查看发布历史
kubectl rollout history deployment web-service
# 回滚上一版本
kubectl rollout undo deployment web-service
七、K8s安全加固进阶(合规集群必备)
- API Server关闭匿名访问
修改kube-apiserver静态Pod配置,添加--anonymous-auth=false - 安全上下文限制容器权限
yaml
securityContext:
runAsNonRoot: true # 禁止root运行
runAsUser: 1000
readOnlyRootFilesystem: true # 根目录只读,防止入侵写入木马
- NetworkPolicy Pod网络隔离
限制仅指定标签Pod互相访问,默认集群所有Pod互通,存在安全风险
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-allow-frontend
namespace: prod
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- port: 8080
- 镜像安全:私有镜像仓库、镜像漏洞扫描、禁止latest标签镜像
八、Operator自定义控制器(有状态业务标准化)
StatefulSet仅提供基础编排,数据库集群主从切换、备份、扩容、故障转移需要运维手动操作,Operator通过自定义控制器封装完整运维逻辑。
主流成熟Operator:
- MySQL Operator、Postgres Operator
- Redis Operator、Kafka Operator
- Elasticsearch Operator
核心原理:CRD自定义资源 + Controller监听资源变更,自动执行运维操作,实现数据库一键部署、自动主从切换、快照备份。
九、生产故障排查进阶全流程
1. Pod Pending 排查步骤
bash
kubectl describe pod xxx -n ns
# 常见原因:资源不足、节点亲和/污点不匹配、PVC未绑定、镜像拉取失败
2. Pod CrashLoopBackOff 反复重启
bash
# 查看容器日志
kubectl logs pod-name -n ns -p # -p查看上一次崩溃日志
# 进入容器调试
kubectl exec -it pod-name -n ns -- /bin/sh
3. Service无法访问
- 检查Endpoints是否绑定Pod
kubectl get svc,ep -n ns - 确认Pod就绪探针正常,Pod状态Ready
- 排查kube-proxy组件是否正常运行
- 网络策略NetworkPolicy拦截访问
4. 集群组件异常(master节点)
kube-apiserver、etcd、kube-controller-manager为静态Pod,日志查看路径/var/log/pods/kube-system_*
etcd集群必须3/5奇数节点,磁盘使用SSD,定期快照备份。
十、集群性能调优实战
- 资源合理分配:requests保证基础资源,limits防止容器抢占节点资源
- 调度优化:使用拓扑分布约束均衡节点负载,减少单点压力
- etcd调优:增大快照频率、磁盘IO优化,避免大集群etcd响应缓慢
- kubelet参数:调整pod最大并发创建数,批量发布提速
- 监控体系:Prometheus+Grafana采集集群指标,配置CPU、内存、Pod异常、API延迟告警