skip to Main Content

I’ve got this ingress.yaml base configuration:

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

And want to replace the spoec.rules.host value only (and keep all http.paths as is.

So I create a env-var.yaml like this :

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

But the result is the following:

$ 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

I have lost all http.paths configuration and I can’t find out how to do.

I tried with patches: or patchesStrategicMerge in kustomization.yaml but the result is always the same.

Any help would be greatly appreciated

3

Answers


  1. If you are on a recent version of kubernetes (I think starting form 18) the Ingres api version is no longer the beta one apiVersion: extensions/v1beta1 it is now apiVersion: networking.k8s.io/v1.

    I have tested bellow sample and it works :

    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
    

    Tested with both kubectl kustomize (version of kubectl is v1.19.7) and kustomize build (version of standalone kustomize is v3.5.4 )

    Login or Signup to reply.
  2. You can use a json patch for this, below is an example.

    Here is an example kustomization.yaml. It will call out a patch in the patches section:

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    
    resources:
    - ../../base/app1
    
    patches:
    - target:
        kind: Ingress
        name: my-ingress
      path: ingress-patch.json  
    

    Here would be an example ingress-patch.json:

    [
        { 
            "op": "replace", 
            "path": "/spec/rules/0/host", 
            "value": "the.real.hostname"
        }
    ]
    
    Login or Signup to reply.
  3. Another option is to do inline patch. It’s the same approach mroma offered, but without the file. I find it simpler.

    # 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
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search