使用 kustomize overlays 替换 gke ingress 的多个主机

Replace multiple hosts of gke ingress using kustomize overlays

我有一个 GKE/GCE 入口文件,其中有 2 个主机。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: myfirstdomain # <-------- override this via kustomize
    http:
      paths:
      - path: /abc
        backend:
          serviceName: abc
          servicePort: abc
      - path: /def
        backend:
          serviceName: def
          servicePort: def
      - path: /ghi
        backend:
          serviceName: ghi
          servicePort: ghi
  - host: myseconddomain # <-------- override this via kustomize
    http:
      paths:
      - backend:
          serviceName: xyz
          servicePort: xyz

我想通过 kustomize 声明 host 值,以便我可以为不同的环境指定不同的 host 值。

我的开发环境覆盖补丁文件如下所示:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: dev1.example.com
  - host: dev2.example.com

然而,运行 kustomize build overlays/dev 的输出如下所示:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: dev1.example.com
  - host: dev2.example.com

所有其他规格都丢失了。

它最终替换了 整个 host 块,而不是仅替换 host 行。

我该如何解决这个问题?我正在使用:

您不能使用 strategic merge since the spec.rules is an array of items. You have to use json merge 通过提供要受影响的确切路径来做到这一点。

您可以为 json 合并创建单独的补丁文件,如下所示:

# overlays/dev/ingress-json-patch.yaml

- op: replace
  path: /spec/rules/0/host
  value: dev1.example.com
- op: replace
  path: /spec/rules/1/host
  value: dev2.example.com

然后通过将以下内容添加到您的 kustomization.yaml 来引用该补丁文件:

# overlays/dev/kustomization.yaml

patchesJson6902:
- target:
    group: extensions
    version: v1beta1
    kind: Ingress
    name: my-ingress
  path: overlays/dev/ingress-json-patch.yaml