2. Kubernetes 基础回顾:Pod、Service、Deployment、Ingress、ConfigMap、Secret 核心资源

在深入 GitOps 流水线之前,必须牢固掌握 Kubernetes 的六大核心资源。它们是所有工作负载和配置管理的基础,也是后续集成测试中频繁操作的对象。本章以“资源职责 + 交互关系”为主线,逐一拆解每个资源的定义、典型 YAML 结构、常见场景及避坑要点。

学习提示: 本章所有 YAML 示例均基于 Kubernetes v1.28+ API 版本。实际使用时请根据集群版本调整 apiVersion。

2.1 资源全景图:六大核心资源的关系

下图展示了 Pod、Service、Deployment、Ingress、ConfigMap、Secret 在集群中的典型协作关系。箭头表示流量或数据流向。

Kubernetes 六大核心资源关系图 Kubernetes 六大核心资源协作关系 配置层 ConfigMap Secret 工作负载层 Deployment Pod 网络层 Service Ingress ConfigMap/Secret 注入 Pod → Deployment 管理 Pod 副本 → Service 提供稳定入口 → Ingress 对外暴露 HTTP 路由

2.2 Pod:最小的调度单元

Pod 是 Kubernetes 中可创建和部署的最小计算单元。一个 Pod 可以包含一个或多个容器(通常为一个),共享网络栈、存储卷和生命周期。

2.2.1 核心字段

字段说明是否必填
apiVersionv1是
kindPod是
metadata.namePod 名称,集群内唯一是
spec.containers[].image容器镜像地址是
spec.containers[].ports容器暴露的端口列表否

2.2.2 典型 YAML

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.25-alpine
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
避坑提醒: 生产环境不要直接创建 Pod,应使用 Deployment 等控制器管理。直接创建的 Pod 在节点故障时不会被自动重建。

2.3 Deployment:声明式应用管理

Deployment 是管理 Pod 副本、滚动更新、回滚的核心控制器。它通过 ReplicaSet 间接管理 Pod,提供声明式更新能力。

2.3.1 关键特性

  • 副本管理: 通过 spec.replicas 控制 Pod 数量。
  • 滚动更新: 修改 Pod 模板后自动执行灰度替换,支持 maxSurge 和 maxUnavailable 策略。
  • 回滚: 保留历史版本,通过 kubectl rollout undo 快速回退。
  • 自愈: 当 Pod 因故障终止时,Deployment 自动创建新 Pod 维持期望副本数。

2.3.2 典型 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25-alpine
        ports:
        - containerPort: 80

2.4 Service:稳定的网络抽象

Pod 的 IP 是动态变化的,Service 提供了一组 Pod 的稳定访问入口(Cluster IP + DNS 名称),并实现请求负载均衡。

2.4.1 Service 类型对比

类型访问范围典型场景
ClusterIP集群内部微服务间调用
NodePort集群外部(节点 IP + 端口)开发调试、非生产环境
LoadBalancer集群外部(云负载均衡器)云原生生产环境
ExternalName集群外部(DNS CNAME)对接外部服务

2.4.2 典型 YAML

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP
关键点: spec.selector 必须与 Pod 的 metadata.labels 匹配,否则 Service 无法发现后端 Pod。

2.5 Ingress:七层流量入口

Ingress 将集群外部的 HTTP/HTTPS 请求路由到集群内部的 Service,支持基于主机名和路径的转发、TLS 终止、虚拟主机等高级功能。

2.5.1 典型 YAML

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

2.5.2 常见 Ingress Controller

  • nginx-ingress-controller: 社区最广泛使用,功能成熟。
  • traefik: 动态配置、自动发现,适合微服务架构。
  • istio-ingressgateway: 服务网格场景下的入口网关。

2.6 ConfigMap 与 Secret:配置与敏感数据

这两个资源将配置数据从 Pod 镜像中解耦,实现“镜像不变,配置可变”。

2.6.1 核心区别

维度ConfigMapSecret
数据内容明文配置(如配置文件、环境变量)敏感数据(密码、、证书)
存储编码明文 UTF-8Base64 编码
大小限制1 MiB(etcd 限制)1 MiB
使用方式环境变量 / 挂载卷环境变量 / 挂载卷

2.6.2 ConfigMap 示例

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  app.properties: |
    log.level=INFO
    max.connections=100
  APP_ENV: production

2.6.3 Secret 示例

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=        # admin
  password: cGFzc3dvcmQxMjM=  # password123

2.6.4 注入 Pod 的方式

apiVersion: v1
kind: Pod
metadata:
  name: config-pod
spec:
  containers:
  - name: app
    image: myapp:1.0
    env:
    - name: APP_ENV
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: APP_ENV
    - name: DB_USERNAME
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: username
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: app-config
安全提醒: Secret 仅对数据进行 Base64 编码,并非加密。生产环境应启用 etcd 加密或使用外部密钥管理服务(如 HashiCorp Vault、AWS Secrets Manager)。

2.7 资源操作速查表

操作命令说明
创建kubectl apply -f resource.yaml声明式创建/更新
查看kubectl get <resource>列出资源列表
详情kubectl describe <resource> <name>查看资源详细信息
日志kubectl logs <pod-name>仅 Pod 支持
删除kubectl delete -f resource.yaml按文件删除
端口转发kubectl port-forward <pod> 8080:80本地调试

2.8 本章小结

  • Pod 是原子调度单元,但应通过 Deployment 管理。
  • Deployment 提供声明式更新、回滚和自愈能力。
  • Service 为 Pod 提供稳定的网络入口和负载均衡。
  • Ingress 实现七层 HTTP 路由和 TLS 终止。
  • ConfigMap 和 Secret 将配置与镜像分离,Secret 需额外加密保护。
  • 六大资源共同构成 GitOps 流水线中“声明式基础设施”的原子单元。