Kustomize 如何只替换 Ingress 配置中的主机

Kustomize how to replace only the host in Ingress configuration

我有这个 ingress.yaml 基本配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  labels:
    sia: aza
    app: asap-ingress-internal
  name: asap-ingress-internal
  annotations:
    kubernetes.io/ingress.class: "nginx-external"
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    - host: the-host-value
      http:
        paths:
          - path: /asap-srv-template/(.*)
            backend:
              serviceName: asap-srv-template
              servicePort: 8080

并且只想替换 spoec.rules.host 值(并保持所有 http.paths 不变。

所以我创建了一个这样的 env-var.yaml :

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: asap-ingress-internal
spec:
  rules:
    - host: the.real.hostname

但结果如下:

$ kustomize build
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx-external
    nginx.ingress.kubernetes.io/use-regex: "true"
  labels:
    app: asap-ingress-internal
    env: dev
    sia: aza
  name: asap-ingress-internal
  namespace: aza-72461-dev
spec:
  rules:
  - host: the.real.hostname

我丢失了所有 http.paths 配置,我不知道该怎么做。

我尝试在 kustomization.yaml 中使用 patches: 或 patchesStrategicMerge,但结果始终相同。

如有任何帮助,我们将不胜感激

如果您使用的是最新版本的 kubernetes(我想从 18 开始),Ingres api 版本不再是测试版 apiVersion: extensions/v1beta1,现在是 apiVersion: networking.k8s.io/v1

我已经测试了下面的示例并且它有效:

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: asap-ingress-internal
  annotations:
    kubernetes.io/ingress.class: "nginx-external"
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    - host: the-host-value
      http:
        paths:
          - path: /asap-srv-template/(.*)
            backend:
              serviceName: asap-srv-template
              servicePort: 8080

ingress-patch.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: asap-ingress-internal
spec:
  rules:
    - host: the.real.hostname

kustomization.yaml

resources:
- ingress.yaml
patchesStrategicMerge:
- ingress-patch.yaml

测试了 kubectl kustomize(kubectl 版本为 v1.19.7)和 kustomize build(独立 kustomize 版本为 v3.5.4

您可以为此使用 json 补丁,下面是一个示例。

这是一个例子kustomization.yaml。它会在 patches 部分调出一个补丁:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- ../../base/app1

patches:
- target:
    kind: Ingress
    name: my-ingress
  path: ingress-patch.json  

这是一个例子ingress-patch.json:

[
    { 
        "op": "replace", 
        "path": "/spec/rules/0/host", 
        "value": "the.real.hostname"
    }
]

另一种选择是做内嵌补丁。这与 mroma 提供的方法相同,但没有文件。我觉得比较简单。

# kustomization.yaml

resources:
  - ingress.yaml
patches:
  - target:
      kind: Ingress
      name: asap-ingress-internal
    patch: |-
      - op: replace
        path: /spec/rules/0/host
        value: the.real.hostname