如何在Ingress配置中仅替换主机的Kustomize设置

22
我有这个 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

我只想替换 spec.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,但结果始终相同。
非常感谢任何帮助。
3个回答

23

你可以使用 JSON 补丁来实现这个功能,下面是一个示例。

这里是一个 kustomization.yaml 的例子。它将在 patches 部分中调用补丁:


这里是一个 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 我会尝试这个。 - jmcollin92
我已经使用补丁进行了测试,但结果仍然相同:整个规范被替换而不是被修补或合并。我将尝试您的示例(而不是我的)。 - jmcollin92
我认为在这种情况下,如果一个人只生成单独的入口yaml文件,那么就会更少出错并且更容易。 - Fabian Börner
这个解决方案对我很有效,我仍在使用api版本v1beta1。需要记住的一件事是,在kustomization.yml文件中,“patches”下的“name”指令需要与ingress资源的名称匹配;否则,kustomize构建不会失败,但补丁将不会被应用。 - yaach

17

另一个选项是进行内联修补。这是与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

-3

如果您正在使用较新版本的 Kubernetes(我认为从18开始),则 Ingress 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)进行测试。


9
最终结果是用rules.host属性替换了整个spec。所有其他属性,如http.paths等都消失了。使用kubectl v1.21.0 和 kustomize v4.1.2 进行了尝试。 - Rakib
@ovidiu-buligan 感谢您提供有关beta扩展的提示。正如Rakib上面所说,当我测试时,整个规范都被替换了。我将检查kubectl和kustomize发布情况。为确保,请您发布kustomization的结果。 - jmcollin92
这里有一个开放问题,可以通过patchesStrategicMerge进行更改。 (https://github.com/kubernetes-sigs/kustomize/issues/347) - iamolegga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接