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 在集群中的典型协作关系。箭头表示流量或数据流向。
2.2 Pod:最小的调度单元
Pod 是 Kubernetes 中可创建和部署的最小计算单元。一个 Pod 可以包含一个或多个容器(通常为一个),共享网络栈、存储卷和生命周期。
2.2.1 核心字段
| 字段 | 说明 | 是否必填 |
|---|---|---|
apiVersion | v1 | 是 |
kind | Pod | 是 |
metadata.name | Pod 名称,集群内唯一 | 是 |
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 核心区别
| 维度 | ConfigMap | Secret |
|---|---|---|
| 数据内容 | 明文配置(如配置文件、环境变量) | 敏感数据(密码、、证书) |
| 存储编码 | 明文 UTF-8 | Base64 编码 |
| 大小限制 | 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 流水线中“声明式基础设施”的原子单元。