Kubernetes容器编排是网站运维与DevOps的核心能力,负责容器调度、服务发现和弹性伸缩。理解Kubernetes,先抓三块:工作负载怎么跑、流量怎么进、容量怎么伸缩。本文用完整可运行的YAML示例,覆盖从Deployment到HPA的链路,并给出故障排查顺序。
Kubernetes核心组件与资源对象
一个集群分两层:控制面(kube-apiserver、scheduler、controller-manager、etcd)和数据面(kubelet、kube-proxy、容器运行时)。用户通过kubectl操作API Server,声明期望状态,控制器负责收敛。资源对象按职责分:工作负载、网络、存储、配置、权限。
Deployment与StatefulSet:无状态与有状态
无状态应用用Deployment,有状态应用(数据库、消息队列)用StatefulSet:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels: {app: web}
spec:
containers:
- name: web
image: registry.example.com/web:v1.2
ports: [{containerPort: 8080}]
resources:
requests: {cpu: 500m, memory: 512Mi}
limits: {cpu: "1", memory: 1Gi}
StatefulSet在模板基础上多了serviceName和volumeClaimTemplates,保证Pod有序、持久的身份标识。有状态应用无脑用Deployment会丢数据。
Service与Service发现:内部流量入口
Pod IP不稳定,Service提供稳定访问入口。ClusterIP类型供集群内访问,DNS名直接可用:
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector: {app: web}
ports:
- port: 80
targetPort: 8080
protocol: TCP
Pod内访问就用 http://web-svc:80。StatefulSet则用headless service + Pod DNS(web-0.web-svc.namespace.svc)做实例级访问。
Ingress:外部流量与HTTPS
对外暴露域名与HTTPS由Ingress负责,生产环境一般配nginx-ingress或traefik:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ing
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service: {name: web-svc, port: {number: 80}}
证书管理用cert-manager签发,Ingress注解自动挂载,不需要手工管理集群里的证书文件。
ConfigMap与Secret:配置与密钥分离
apiVersion: v1
kind: ConfigMap
metadata: {name: app-config}
data:
APP_ENV: production
LOG_LEVEL: info
Secret与ConfigMap结构相同,value必须base64编码。优先挂载为环境变量还是volume?密钥量大选volume,避免环境变量被进程dump出来。
HPA自动伸缩:按CPU与QPS扩容
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target: {type: Utilization, averageUtilization: 60}
HPA配合request设置才有意义,因为采集的是request占用的比例。要按QPS扩容,装Prometheus Adapter自定义指标,更贴合业务。
常见故障排查顺序
Pod启动失败,先看Events;调度失败,看节点污点和资源;镜像拉取失败,看registry认证;网络不通,按 Pod→Service→Ingress 逐层验证。常用命令:
kubectl get pods -o wide
kubectl describe pod <pod>
kubectl logs -f <pod> --tail=100
kubectl exec -it <pod> -- curl http://web-svc
kubectl get events --sort-by=.lastTimestamp
记住”先describe后logs”,事件里往往直接写着原因,比翻日志快得多。把发布、扩缩容、回滚都做成流水线,人肉操作越少,事故越少。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-rong-qi-bian-pai-shi-zhan-gong-zuo-fu-zai-fu-wu/