Reputation: 351
I have created an ingress controller using Helm with default configuration
default nginx-ingress-controller LoadBalancer 10.0.182.128 xx.xxx.xx.90 80:32485/TCP,443:31756/TCP 62m
default nginx-ingress-default-backend ClusterIP 10.0.12.39 <none> 80/TCP 62m
using Helm:
helm install nginx-ingress stable/nginx-ingress \
--set controller.replicaCount=2 \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set controller.service.loadBalancerIP="Created static IP" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="XXX-aks-ingress"
this ingress is running in the default namespace.
Now, I wanted to add a second ingress controller, from the official doc I have specific Ingress class
helm install nginx-ingress stable/nginx-ingress \
--namespace ingress-nginx-devices \ #I create this namespace first
--set controller.ingressClass="nginx-devices" \ # custom class to use for different ingress resources
--set controller.replicaCount=2 \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set controller.service.loadBalancerIP="A second static Ip address created before" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="serviceIot-aks-ingress-iot"
but I keep getting this error:
Error: rendered manifests contain a resource that already exists. Unable to continue with install: ClusterRole "nginx-ingress" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error: key "meta.helm.sh/release-namespace" must equal "ingress-nginx-devices": current value is "default"
What could be wrong here ? Any help is appreciated :)
Upvotes: 13
Views: 14122
Reputation: 30170
Update :
Controller-value of the controller that is processing this ingressClass
With recent update you might have to use the controller.ingressClassByName
Official doc : https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx#values
helm install nginx-ingress-devices stable/nginx-ingress \
--namespace ingress-nginx-devices \ #I create this namespace first
--set controller.ingressClass="nginx-devices" \ # custom class to use for different ingress resources
--set controller.ingressClassResource.name="nginx-devices" \
--set controller.replicaCount=2 \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set controller.service.loadBalancerIP="A second static Ip address created before" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="serviceIot-aks-ingress-iot"
Old answer
you can try, what we are changing is name : nginx-ingress-devices instead of nginx-ingress
helm install nginx-ingress-devices stable/nginx-ingress \
--namespace ingress-nginx-devices \ #I create this namespace first
--set controller.ingressClass="nginx-devices" \ # custom class to use for different ingress resources
--set controller.replicaCount=2 \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set controller.service.loadBalancerIP="A second static Ip address created before" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="serviceIot-aks-ingress-iot"
error you are getting is due to already there is cluster role with same name : nginx-ingress due to that you are getting the error.
ClusterRoleBindings grant a user, group, or service account a ClusterRole’s power across the entire cluster.
You can get the reference file here : https://github.com/helm/charts/blob/master/stable/nginx-ingress/templates/clusterrole.yaml
Upvotes: 3
Reputation: 131
With recent releases "controller.ingressClassResource.name" needs to get a different name when trying to deploy a second ingress.
As shown in the list of keys now there's a new value that you need to set:
Key | Type | Default | Description |
---|---|---|---|
... | ... | ||
controller.ingressClass | string | "nginx" |
For backwards compatibility with ingress.class annotation, use ingressClass. Algorithm is as follows, first ingressClassName is considered, if not present, controller looks for ingress.class annotation |
controller.ingressClassByName | bool | false |
Process IngressClass per name (additionally as per spec.controller). |
controller.ingressClassResource.controllerValue | string | "k8s.io/ingress-nginx" |
Controller-value of the controller that is processing this ingressClass |
controller.ingressClassResource.default | bool | false |
Is this the default ingressClass for the cluster |
controller.ingressClassResource.enabled | bool | true |
Is this ingressClass enabled or not |
controller.ingressClassResource.name | string | "nginx" |
Name of the ingressClass |
So, for example, for creating a secondary ingress for private access you can run this Helm command:
helm install nginx-ingress-private ingress-nginx/ingress-nginx \
--create-namespace \
--namespace ingress-private \
--set controller.ingressClass="nginx-private" \
--set controller.ingressClassResource.name="nginx-private" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"="true"
Upvotes: 0
Reputation: 1306
For my case the issue was with ingressclass existed already. I have simply deleted the ingresclass and it worked like a charm.
# kubectl get ingressclass --all-namespaces
This will return the name of already existing ingressclass. For my case, it was nginx. Delete that ingressclass.
# kubectl delete ingressclass nginx --all-namespaces
Verify that ingressclass is deleted
# kubectl get ingressclass --all-namespaces
No resources found
Rerun the helm update command should work.
You can also run multiple ingrss controller in parallel with new ingressClassName & ingressClassResourceName. First of all get list of all existing class name.
kubectl get ingressclass --all-namespaces
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 203d
Create a new ingress controller with unique className with this command.
helm install nginx-ingress stable/nginx-ingress \
--namespace ingress-nginx-devices \ #I create this namespace first
--set controller.ingressClass="nginx-devices" \ # custom class to use for different ingress resources
--set controller.ingressClassResource.name="nginx-devices" # custom classResourceName
--set controller.replicaCount=2 \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set controller.service.loadBalancerIP="A second static Ip address created before" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="serviceIot-aks-ingress-iot"
Upvotes: 15