簡體   English   中英

使用目標命名空間自定義補丁

[英]Kustomize patch with target namespace

我正在嘗試根據 target:namespace 有選擇地應用補丁,但它不起作用。

# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
patches:
  - path: deployment-imagepullpolicy-prod.json
    target:
      kind: Deployment
      namespace: prod
# base/kustomization.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
        - name: app
          imagePullPolicy: Always
# base/deployment-imagepullpolicy-prod.json
[
  { 
    "op": "replace", 
    "path": "/spec/template/spec/containers/0/imagePullPolicy", 
    "value": "IfNotPresent"
  }
]
# app/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../base
namespace: prod

當我生成資源( kubectl kustomize app )時,補丁不存在。 如果刪除了 target:namespace 限制,那么它就可以工作。


根據@larks 的回答,我做了一些測試。

首先,我的用例:我有一堆應用程序覆蓋,里面有環境覆蓋,我們默認使用Always圖像拉取策略,但我們需要該產品環境使用ifNotPresent策略。 今天我們使用patchesStrategicMerge做到這一點,但是這種方法會受到人為失敗的影響,因此將選擇性補丁應用於創建的任何新應用程序,無需人工交互,會很棒。

現在,測試:

  1. 將補丁移動到定義命名空間(應用程序)的覆蓋層。
    它不起作用,而且它沒有用,因為命名空間是在我需要補丁的地方定義的。
    因此,只需無限制地應用補丁,使命名空間限制無用。
  2. 將命名空間移動到基礎覆蓋。
    它不起作用,同一覆蓋中定義的補丁和命名空間不應用補丁。
    因此,只需無限制地應用補丁,使命名空間限制無用。
  3. 將命名空間移動到基礎覆蓋層並將補丁移動到應用程序覆蓋層。
    它可以工作,但它的“無用”補丁將應用於繼承它的所有疊加層。 嘗試在應用程序覆蓋上重新定義命名空間不起作用。
    因此,只需無限制地應用補丁,使命名空間限制無用。

當您在base中運行kustomize時,您的base目錄中的任何補丁都需要正確運行。 因為您沒有在base中設置namespace: prod ,所以該補丁將永遠無法工作。

即使您將補丁移動到您的app覆蓋中,它也不會像您當前使用的那樣工作,因為補丁是在您的kustomization.yaml中的namespace指令之前應用的,因此namespace: prod條件永遠不會匹配。

但是,我認為這種安排沒有意義:只需為不同的命名空間使用不同的覆蓋。

在這種情況下,我認為解決方案是將補丁移動到app覆蓋並刪除namespace: prod條件,以便您擁有這樣的布局:

.
├── app
│   ├── deployment-imagepullpolicy-prod.json
│   └── kustomization.yaml
└── base
    ├── deployment.yaml
    └── kustomization.yaml

app/kustomization.yaml看起來像:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../base
namespace: prod

patches:
  - path: deployment-imagepullpolicy-prod.json
    target:
      kind: Deployment
      namespace: prod

更新

Kustomize 創建一個管道。 當你寫這樣的東西時:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../base
namespace: prod

這意味着,有效地:

  1. 首先,在../base中運行kustomize
  2. 應用當前疊加層中定義的任何轉換

因此,當您在base目錄中運行kustomize時,需要應用base目錄中的任何補丁。 正如您當前編寫的那樣,您的補丁不適用於base中的任何資源,因此它實際上是無操作的。

應用該補丁的唯一方法是將其移動到app覆蓋中並刪除namespace條件。 因為您要在app/kustomization.yaml中設置namespace: prod ,所以在補丁上使用namespace條件沒有任何意義:您的所有資源都將具有namespace: prod ,因此該條件沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM