环境管理
GitOps 仓库结构
fleet-repo/
├── apps/
│ ├── my-app/
│ │ ├── base/ # 基础清单
│ │ │ ├── deployment.yaml
│ │ │ ├── service.yaml
│ │ │ └── kustomization.yaml
│ │ └── overlays/ # 环境差异
│ │ ├── dev/
│ │ │ ├── kustomization.yaml
│ │ │ └── patch-replicas.yaml
│ │ ├── staging/
│ │ │ └── kustomization.yaml
│ │ └── production/
│ │ ├── kustomization.yaml
│ │ └── patch-resources.yaml
│ └── another-app/
├── infrastructure/ # 基础设施组件
│ ├── nginx-ingress/
│ ├── cert-manager/
│ └── monitoring/
└── clusters/ # 集群级别配置
├── dev/
├── staging/
└── production/
Kustomize 多环境管理
apps/my-app/base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
template:
spec:
containers:
- name: app
image: my-app:latest
resources:
requests:
cpu: 100m
memory: 128Mi
apps/my-app/overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: production
resources:
- ../../base
patches:
- path: patch-resources.yaml
images:
- name: my-app
newTag: v1.2.3 # 生产环境固定版本
apps/my-app/overlays/production/patch-resources.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3 # 生产 3 副本
template:
spec:
containers:
- name: app
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: "1"
memory: 1Gi
密钥管理
危险
永远不要将明文密钥提交到 Git 仓库,即使是私有仓库。
Sealed Secrets
# 安装 Sealed Secrets Controller
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/controller.yaml
# 加密 Secret(可安全提交到 Git)
kubeseal --format yaml < secret.yaml > sealed-secret.yaml
SOPS + Age
# 使用 SOPS 加密
sops --encrypt --age age1xxx... secret.yaml > secret.enc.yaml
# Flux 集成 SOPS 解密
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
spec:
decryption:
provider: sops
secretRef:
name: sops-age
| 方案 | 优点 | 缺点 |
|---|---|---|
| Sealed Secrets | K8s 原生,简单 | 依赖控制器 |
| SOPS + Age | 通用,支持多种格式 | 密钥轮转复杂 |
| External Secrets | 对接 Vault/AWS SM | 需要额外组件 |
| Vault Agent | 功能最强 | 架构最复杂 |
常见面试问题
Q1: GitOps 多环境管理的最佳实践?
答案:
- 单仓库 + Kustomize Overlay:所有环境在同一仓库,用
overlays/管理差异(推荐) - 分支策略:避免用 branch 区分环境(合并冲突多),用目录区分
- 镜像版本:dev 用
latest,staging/production 用固定 tag - 密钥管理:使用 Sealed Secrets 或 SOPS,密钥加密后才能提交
- 推进流程:dev → staging → production,通过 PR 推进版本