Skip to content

Kubernetes ​

Kubernetes(简称 K8s)是业界主流的容器编排平台,负责自动化部署、伸缩、故障恢复与服务发现。本文体系化梳理核心对象与生产实践。

架构概览 ​

  • Control Plane(控制面):kube-apiserver(API 入口)、etcd(数据存储)、kube-scheduler(调度)、kube-controller-manager(控制器)。
  • Node(工作节点):kubelet(与 API 通信、管容器)、kube-proxy(网络规则)、容器运行时(containerd/CRI-O)。
bash
kubectl get nodes
kubectl cluster-info

核心概念 ​

  • Namespace:资源逻辑隔离(default / kube-system / 自定义)。
  • Pod:最小部署单元,可含一个或多个共享网络/存储的容器。
  • Label / Selector:键值对,用于对象选择与关联。
yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: myapp
spec:
  containers:
  - name: app
    image: myapp:latest
    ports:
    - containerPort: 3000

Workload(工作负载) ​

Deployment ​

声明式管理无状态应用,支持滚动更新与回滚。

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: app
        image: myapp:v1
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 256Mi
bash
kubectl apply -f deploy.yaml
kubectl rollout status deployment/my-deployment
kubectl rollout undo deployment/my-deployment   # 回滚

StatefulSet ​

有状态应用(数据库、中间件),提供稳定网络标识与持久存储。常用于 MySQL、Redis Cluster、Kafka。

DaemonSet ​

每个(或匹配的)节点运行一个 Pod,常用于日志采集(如 Filebeat)、监控代理(如 node_exporter)。

Job / CronJob ​

  • Job:一次性任务,运行完成即结束。
  • CronJob:定时任务,类似 Linux crontab(schedule: "0 2 * * *")。

Service 与 Ingress ​

Service(服务发现) ​

Pod IP 会变化,Service 提供稳定虚拟 IP 与负载均衡。

yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 3000
  type: ClusterIP   # ClusterIP / NodePort / LoadBalancer
类型访问范围
ClusterIP集群内部
NodePort节点 IP:随机端口
LoadBalancer云厂商外部负载均衡

Ingress(外部路由) ​

将外部 HTTP/HTTPS 流量路由到内部 Service,通常配合 Ingress Controller(NGINX / Traefik / APISIX)。

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

生产网关实践可参考 APISIX 生产落地实战。

配置与存储 ​

ConfigMap / Secret ​

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: production
---
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
stringData:
  DB_PASSWORD: changeme

在 Pod 中引用:

yaml
env:
- name: APP_ENV
  valueFrom:
    configMapKeyRef:
      name: app-config
      key: APP_ENV
- name: DB_PASSWORD
  valueFrom:
    secretKeyRef:
      name: app-secret
      key: DB_PASSWORD

持久化(PV / PVC / StorageClass) ​

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
yaml
# Pod 中挂载
volumes:
- name: data
  persistentVolumeClaim:
    claimName: data-pvc
volumeMounts:
- name: data
  mountPath: /var/lib/data

调度与弹性 ​

  • 节点亲和/反亲和:affinity 控制 Pod 落点。
  • 污点/容忍:taints + tolerations 隔离专用节点(如 GPU 节点)。
  • HPA(Horizontal Pod Autoscaler):基于 CPU/内存或自定义指标自动扩缩容。
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

探针(健康检查) ​

yaml
livenessProbe:      # 失败则重启容器
  httpGet:
    path: /healthz
    port: 3000
  initialDelaySeconds: 10
  periodSeconds: 10
readinessProbe:     # 失败则从 Service 摘除流量
  httpGet:
    path: /ready
    port: 3000

运维命令 ​

bash
kubectl get pods -n <ns>
kubectl describe pod <pod>          # 排查排程/启动失败
kubectl logs <pod> -f
kubectl exec -it <pod> -- /bin/bash
kubectl apply -f <file>
kubectl delete -f <file>
kubectl rollout restart deploy/<name>
kubectl top nodes / pods            # 资源占用(需 metrics-server)

生产实战要点 ​

  1. 资源 requests/limits 必设:防止资源抢占与节点雪崩。
  2. 探针必配:liveness 防僵死,readiness 防流量打到未就绪实例。
  3. HPA 自动伸缩:应对流量波动。
  4. 配置与密钥外置:ConfigMap/Secret,镜像不含环境配置。
  5. 可观测性:接入 Prometheus + Grafana,配合 Alertmanager 告警。
  6. 包管理 Helm:用 Chart 模板化部署,避免手写大量 YAML。
  7. 镜像固定 tag/digest:禁止 latest 进生产。

最佳实践 ​

  1. 一切皆声明式(kubectl apply),不用命令式 kubectl run 跑生产。
  2. 用 Namespace 隔离环境(prod/test)。
  3. 为关键服务配置 PDB(PodDisruptionBudget)防止驱逐导致不可用。
  4. 日志统一输出 stdout,由采集端(DaemonSet)收集。
  5. 定期升级集群版本,及时修补 CVE。