Kubernetes容器编排实战:工作负载、服务发现与自动伸缩

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/

(0)
小编小编
上一篇 3小时前
下一篇 3小时前

相关推荐