Kustomize 設計理念與使用說明
一、設計理念
Kustomize 的設計理念是基於"基礎配置 + 補丁"的模式,這裡解釋一下為什麼需要在 base 目錄下建立基礎配置:
-
基礎配置的重要性:
- base 目錄下的配置是所有環境共享的基礎配置
- 包含了服務最基本的定義和配置
- 確保了不同環境的配置一致性
-
環境差異管理:
- overlays 目錄只存放與基礎配置的差異部分
- 每個環境只需要關注自己特有的配置
- 避免了配置重複和維護困難
-
配置複用:
- 基礎配置可以被多個環境複用
- 減少了重複配置的維護成本
- 確保了配置的一致性
-
如果只在 overlays 下建立配置的問題:
- 每個環境都需要維護完整的配置
- 配置變更需要在多個環境中同步修改
- 容易造成環境間的配置不一致
- 難以追蹤配置的變化
base 中放置:
- 容器埠
- 資源限制
- 健康檢查
- 基礎標籤
overlays 中放置:
- 環境變數
- 映象版本
- 副本數量
- 特定註解
二、工作流
kustomization工作流方式
Kustomize 不是一個新工具,它自 2017 年以來一直在建設中,並在 1.14 版本中作為原生 kubectl 子命令引入。Kustomize 由 Google 和 Kubernetes 社群構建,符合 Kubernetes 使用 Kubernetes 物件定義配置檔案和以宣告方式管理這些配置的原則。Kustomize 配置物件稱為 Kustomization,用於描述如何生成或轉換其他 Kubernetes 物件。Kustomization 在名為 kustomization.yaml
的檔案中以宣告方式定義,此檔案可由 Kustomize 本身生成和修改。
在 kustomize 中,可以定義常見、可重複使用的 kustomization(稱為基礎)並使用多個其他 kustomization(稱為覆蓋層)對其進行修補,這些 kustomization 可以選擇性地覆蓋基礎中定義的設定以生成變體。然後,Kustomize 根據 kustomization 基礎和覆蓋層中定義的配置轉換和生成資源,此過程稱為融合或渲染。接下來,這些渲染資源會寫入標準輸出或檔案,並保持原始 YAML 檔案不變,以便許多不同的疊加層重複使用基礎。
這種無模板方法在 Kustomization 庫的易用性和可重用性方面非常強大。使用它你能夠以幾乎任何想要的方式自定義 Kubernetes 配置,而無需為每個單獨的用例提供大量值。
二、Kustomize 支援眾多的功能特性
欄位 | 型別 | 解釋 |
---|---|---|
namespace | string | 為所有資源新增名字空間 |
namePrefix | string | 此欄位的值將被新增到所有資源名稱前面 |
nameSuffix | string | 此欄位的值將被新增到所有資源名稱後面 |
labels | map[string]string | 要新增到所有資源和選擇算符的標籤 |
commonAnnotations | map[string]string | 要新增到所有資源的註解 |
resources | []string | 列表中的每個條目都必須能夠解析為現有的資源配置檔案 |
configMapGenerator | []configmapargs | 列表中的每個條目都會生成一個 ConfigMap |
secretGenerator | []secretargs | 列表中的每個條目都會生成一個 Secret |
generatorOptions | GeneratorOptions | 更改所有 ConfigMap 和 Secret 生成器的行為 |
bases | []string | 列表中每個條目都應能解析為一個包含 kustomization.yaml 檔案的目錄 |
patchesStrategicMerge | []string | 列表中每個條目都能解析為某 Kubernetes 物件的策略性合併補丁 |
patchesJson6902 | []patch | 列表中每個條目都能解析為一個 Kubernetes 物件和一個 JSON 補丁 |
vars | []var | 每個條目用來從某資源的欄位來析取文字 |
images | []image | 每個條目都用來更改映象的名稱、標記與/或摘要,不必生成補丁 |
configurations | []string | 列表中每個條目都應能解析為一個包含 Kustomize 轉換器配置 的檔案 |
crds | []string | 列表中每個條目都應能夠解析為 Kubernetes 類別的 OpenAPI 定義檔案 |
二、目錄結構說明
Kustomize-dc/
├── base/ # 基礎配置目錄
│ ├── backend/ # 後端服務基礎配置
│ │ └── accounting-service/
│ ├── frontend/ # 前端服務基礎配置
│ │ └── ybf-www-h5/
│ └── kustomization.yaml # 基礎配置的kustomization檔案
└── overlays/ # 環境特定配置目錄
├── prod/ # 生產環境配置
│ ├── backend/
│ ├── frontend/
│ └── kustomization.yaml
├── test/ # 測試環境配置
└── dev/ # 開發環境配置
三、常用命令示例
- 檢視生成的配置:
kubectl kustomize overlays/prod
- 應用配置到叢集:
kubectl apply -k overlays/prod
- 刪除已部署的資源:
kubectl delete -k overlays/prod
四、最佳實踐建議
-
標籤管理:
- 使用統一的標籤體系
- 在base中定義基礎標籤
- 在overlays中新增環境特定標籤
-
配置管理:
- 敏感配置使用Secret
- 環境變數使用ConfigMap
- 避免在base中包含環境特定的配置
-
補丁使用:
- 使用strategic merge patch進行配置覆蓋
- 只在必要時使用json patch
- 保持補丁檔案的簡潔性
五、常見問題解答
-
Q: 如何處理不同環境的域名配置?
A: 在overlays中使用patch-ingress.yaml進行覆蓋,如示例中的ybf-www-h5服務。 -
Q: 如何管理不同環境的標籤?
A: 在base中定義通用標籤,在overlays中使用labels欄位新增環境標籤。 -
Q: 如何處理配置檔案的優先順序?
A: Kustomize按照以下順序應用配置:- base配置
- overlays中的補丁
- overlays中的資源
-
Q: 如何維護大型專案的配置?
A: 建議按照服務型別(前端/後端)和業務模組進行目錄劃分,保持清晰的層次結構。
六、配置示例
1. 基礎服務配置示例
base/backend/accounting-service/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: accounting-service
spec:
replicas: 1
selector:
matchLabels:
app: accounting-service
template:
metadata:
labels:
app: accounting-service
spec:
containers:
- name: accounting-service
ports:
- containerPort: 8080
resources:
limits:
cpu: '1'
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
2. 環境特定配置示例
overlays/prod/backend/accounting-service/patch-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: accounting-service
spec:
replicas: 3
template:
spec:
containers:
- name: accounting-service
image: your-registry/accounting-service:prod
env:
- name: SPRING_PROFILES_ACTIVE
value: prod
3. ConfigMap配置示例
base/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
application.properties: |
server.port=8080
spring.application.name=my-app
overlays/prod/patch-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
apollo_namespace: prod
sw_agent_collector_backend_services: skywalking-oap.prod-ybf-mid:11800
apollo_cluster: prod
apollo_config_service: http://service-apollo-config-server.prod-ybf-mid:8080
4. Ingress配置示例
base/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: 'false'
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app
port:
number: 80
5. Kustomization檔案示例
base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- ingress.yaml
- configmap.yaml
labels:
- pairs:
app.kubernetes.io/component: backend
app.kubernetes.io/name: my-app
includeSelectors: true
overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namespace: prod
patches:
- path: patch-deployment.yaml
- path: patch-configmap.yaml
labels:
- pairs:
environment: prod
includeSelectors: true
這些示例展示了:
- 基礎部署配置
- 環境特定的補丁
- ConfigMap的基礎配置和環境特定配置
- Ingress配置
- Kustomization檔案的組織方式
五、使用說明
前端專案部署
- 進入專案目錄
- 執行 kustomize build overlays/prod/frontend/ybf-www-h5/ 生成 prod 環境服務的 yaml
- 執行 kustomize build overlays/prod/frontend/ 生成 prod 環境所有前端服務的 yaml
- 執行 kustomize build overlays/prod/ 生成 prod 環境所有服務的 yaml
後端專案部署
- 進入專案目錄
- 執行 kustomize build overlays/prod/backend/accounting-service/ 生成 prod 環境服務的 yaml
- 執行 kustomize build overlays/prod/backend/ 生成 prod 環境所有後端服務的 yaml
- 執行 kustomize build overlays/prod/ 生成 prod 環境所有服務的 yaml
六、除錯命令
使用 --load-restrictor 引數除錯
kustomize build --load-restrictor LoadRestrictionsNone ./Kustomize-dc/overlays/prod
驗證 yaml 語法
kustomize build ./Kustomize-dc/overlays/prod | kubectl apply --dry-run=client -f -
使用 --verbose 引數獲取詳細錯誤資訊
kustomize build --verbose ./Kustomize-dc/overlays/prod
七、新服務新增說明
後端服務新增:
- 複製 base/backend/accounting-service 目錄作為模板
- 複製 overlays/prod/backend/accounting-service 目錄作為模板
- 修改所有檔案中的服務名稱
- 更新 base/backend/kustomization.yaml 新增新服務
前端服務新增:
- 複製 base/frontend/ybf-www-h5 目錄作為模板
- 複製 overlays/prod/frontend/ybf-www-h5 目錄作為模板
- 修改所有檔案中的服務名稱
- 更新 base/frontend/kustomization.yaml 新增新服務
八、優勢
- 配置清晰可維護
- 環境差異一目瞭然
- 基礎配置變更容易同步到所有環境
- 降低配置錯誤的風險
- 便於版本控制和審計