【问题标题】:Kustomize how to replace only the host in Ingress configurationKustomize 如何只替换 Ingress 配置中的主机
【发布时间】:2021-06-08 14:23:17
【问题描述】:

我有这个 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 中使用 patch: 或 patchStrategicMerge,但结果始终相同。

任何帮助将不胜感激

【问题讨论】:

    标签: kubernetes nginx-ingress kustomize


    【解决方案1】:

    您可以为此使用 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 我会试试这个
    • 我已经用补丁测试了,但结果是一样的:整个规范被替换了,没有修补或合并。我会试试你的例子(而不是我的)
    • 我认为在这种情况下,如果只生成单独的入口 yaml 文件,那么它更不容易出错
    • 这个解决方案对我有用,我仍在使用 api 版本 v1beta1。要记住的一件事是,在 kustomization.yml 文件中,“补丁”下的“名称”指令需要与入口资源的名称相匹配;否则 kustomize 构建不会失败,但不会应用补丁。
    【解决方案2】:

    另一种选择是做内联补丁。这与 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 开始),Ingres api 版本不再是 beta 版本 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 )测试

      【讨论】:

      • 它最终用rules.host 属性替换了整个spechttp.paths 等所有其他属性都消失了。尝试使用 kubectl v1.21.0 和 kustomize v4.1.2
      • @ovidiu-buligan 感谢您提供有关 Beta 扩展的提示。就像上面 Rakib 在我测试时所说的那样,整个规范都被替换了。我会检查 kubectl 和 kustomize 版本。确定可以请您发布定制化的结果吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多