Soporte de clase Ingress
¿Qué es una clase Ingress?
En un clúster de Kubernetes, puede haber varios controladores de Ingress y es necesario tener una forma de asociar un recurso de Ingress particular con un controlador de Ingress.
Puede especificar el controlador de Ingress que debe manejar el recurso de Ingress utilizando
ingressClassName en la definición de su recurso de Ingress.
NetScaler Ingress Controller y clases Ingress
El NetScaler Ingress Controller admite la aceptación de múltiples recursos de Ingress, que tienen
spec.ingressClassName. Cada recurso de Ingress se puede asociar con una única ingress.class. Sin embargo, el Ingress Controller podría necesitar manejar varios recursos de Ingress de diferentes clases.
Puede asociar el Ingress Controller con varias clases de Ingress utilizando el argumento
--ingress-classes en la sección spec del archivo YAML.
Si no se especifica
ingress-classes para el Ingress Controller, entonces acepta todos los recursos de Ingress independientemente de la presencia de ingressClassName en el objeto Ingress.
Si se especifica
ingress-classes, el Ingress Controller solo acepta aquellos recursos de Ingress que coincidan con ingressClassName. En tal caso, el Ingress Controller no procesa un recurso de Ingress sin ingress.class.
Nota: Los nombres de las clases Ingress no distinguen entre mayúsculas y minúsculas.
Ejemplos de configuraciones YAML con clases Ingress
A continuación se muestra el fragmento de un archivo YAML de ejemplo para asociar
ingress-classes con el Ingress Controller. Esta configuración funciona en ambos casos: cuando el Ingress Controller se ejecuta como un pod independiente o como un sidecar con NetScaler CPX. En el fragmento YAML proporcionado, las siguientes clases de Ingress están asociadas con el Ingress Controller.
-
my-custom-class -
Citrix
spec:
serviceAccountName: cic-k8s-role
containers:
- name: cic-k8s-ingress-controller
image:"quay.io/citrix/citrix-k8s-ingress-controller:latest"
# specify the ingress classes names to be supportedbyIngress Controller in args section.
# First line should be --ingress-classes, andeverysubsequent line should be
# the name of allowed ingress class. In the givenexampletwo classes named
# "citrix" and "my-custom-class" are accepted. Thiswill be case-insensitive.
args:
- --ingress-classes
Citrix
my-custom-class
A continuación se muestra el fragmento de un archivo YAML de Ingress donde se representa la asociación de clases de Ingress. En el ejemplo dado, un recurso de Ingress llamado
web-ingress está asociado con la clase de Ingress my-custom-class. Si el NetScaler Ingress Controller está configurado para aceptar my-custom-class, procesa este recurso de Ingress.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
name: web-ingress
spec:
ingressClassName: my-custom-class
Soporte para Ingress V1 e IngressClass
Con la versión 1.19 de Kubernetes, el recurso Ingress está disponible de forma general. Como parte de este cambio, se añade un nuevo recurso llamado
IngressClass a la API de Ingress. Mediante este recurso, puede asociar controladores Ingress específicos a Ingresses. Para obtener más información sobre el recurso IngressClass, consulte la documentación de Kubernetes.
A continuación, se muestra un recurso
IngressClass de ejemplo.
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: citrix
spec:
controller: citrix.com/ingress-controller
Un recurso
IngressClass debe hacer referencia a la clase de Ingress asociada con el controlador que debe implementar las reglas de Ingress, como se muestra a continuación:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
spec:
ingressClassName: citrix
rules:
- host: abc.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: test
port:
number: 80
El NetScaler Ingress Controller utiliza las siguientes reglas para hacer coincidir los Ingresses.
-
Si el NetScaler Ingress Controller se inicia sin especificar el argumento
--ingress-classes:-
Si la versión de Kubernetes es inferior a 1.19 (se admite el recurso IngressClass V1)
-
Coincide con cualquier objeto Ingress
-
-
Si la versión de Kubernetes es superior o igual a 1.19 (se admite el recurso IngressClass V1)
-
Coincide con cualquier objeto Ingress en el que el campo
spec.ingressClassNameno esté establecido. -
Coincide con cualquier Ingress si el campo
spec.ingressClassNamedel objeto Ingress está establecido y existe un recursov1.IngressClasscon el mismo nombre y el campospec.controllerdel recurso escitrix.com/ingress-controller.
-
-
-
Si el NetScaler Ingress Controller se inicia con una o más clases de Ingress establecidas mediante el argumento
--ingress-classes.-
Si la versión de Kubernetes es inferior a 1.19 (se admite el recurso IngressClass V1)
-
Coincide con cualquier Ingress con la anotación de clase de Ingress
kubernetes.io/ingress.classque coincida con la de las clases de Ingress configuradas.
-
-
Si la versión de Kubernetes es superior o igual a 1.19 (se admite el recurso IngressClass V1).
-
Coincide con cualquier entrada en la que la anotación de clase de entrada
kubernetes.io/ingress.classcoincida con las clases de entrada configuradas. Esta anotación está en desuso, pero tiene mayor precedencia sobre el campospec.IngressClassNamepara admitir la compatibilidad con versiones anteriores. -
Coincide con cualquier objeto de entrada, si existe un recurso
v1.IngressClasscon los siguientes atributos:-
El nombre del recurso coincide con el valor del argumento
--ingress-classes. -
El campo
spec.controllerdel recurso se establece comocitrix.com/ingress-controller. -
El nombre del recurso coincide con el campo
spec.ingressClassNamedel objeto Ingress.
-
-
Coincide con cualquier objeto de entrada donde el campo
spec.ingressClassNameno está establecido y si existe un recursov1.IngressClasscon los siguientes atributos:-
El nombre de los recursos coincide con el valor del argumento
--ingress-classes. -
El campo
spec.controllerdel recurso se establece comocitrix.com/ingress-controller. -
El recurso se configura como la clase predeterminada utilizando la anotación
ingressclass.kubernetes.io/is-default-class. Para obtener más información, consulte la documentación de Kubernetes.
-
-
-
Nota:
-
Si se definen tanto la anotación como
spec.ingressClassName, la anotación se compara antes quespec.ingressClassName. Si la anotación no coincide, no se realiza la operación de coincidencia para el campospec.ingressClassName. -
Cuando se utilizan gráficos de Helm para instalar NetScaler Ingress Controller, si el recurso
IngressClasses compatible y NetScaler Ingress Controller se implementa con el argumento--ingress-classes, el recursov1.IngressClassse crea de forma predeterminada.
Actualización del estado de Ingress para los recursos de Ingress con la dirección IP especificada
Para actualizar el campo
Status.LoadBalancer.Ingress de los recursos de Ingress gestionados por NetScaler Ingress Controller con las direcciones IP asignadas, especifique el argumento de línea de comandos --update-ingress-status yes al iniciar NetScaler Ingress Controller.
Nota:
Para implementaciones de Helm, el parámetro equivalente del gráfico de Helm para
update-ingress-status es updateIngressStatus, que debe establecerse en true.
Esta característica es compatible tanto con implementaciones de NSIC independientes como con sidecar. Para un NSIC implementado como sidecar, esta característica es compatible a partir de la versión 2.2.10 de NSIC.
Actualización del estado de Ingress para implementaciones sidecar
En Kubernetes, Ingress se puede utilizar como un único punto de entrada para exponer múltiples aplicaciones al mundo exterior. El Ingress tendría un campo
Address (Status.LoadBalancer.IP) que se actualiza después de la creación exitosa del Ingress. Este campo se actualiza con una dirección IP pública o un nombre de host a través del cual se puede acceder a la aplicación de Kubernetes. En implementaciones en la nube, este campo también puede ser la dirección IP o el nombre de host de un balanceador de carga en la nube.
En implementaciones en la nube, NetScaler CPX junto con el controlador de Ingress se expone utilizando un servicio de
type LoadBalancer que, a su vez, crea un balanceador de carga en la nube. El balanceador de carga en la nube expone entonces el NetScaler CPX junto con el controlador de Ingress. Por lo tanto, los recursos de Ingress expuestos con NetScaler CPX deben actualizarse utilizando la dirección IP pública o el nombre de host del balanceador de carga en la nube.
Esta actualización también es aplicable a implementaciones locales.
-
En implementaciones de Ingress de dos niveles, en las que NetScaler CPX se expone utilizando un servicio de tipo
LoadBalanceral Ingress NetScaler VPX de nivel 1, el campoAddress(Status.LoadBalancer.IP) de los recursos de Ingress operados por NetScaler CPX se actualiza con la dirección VIP. -
En implementaciones de Ingress de dos niveles, en las que NetScaler CPX se expone utilizando un servicio de tipo
ClusterIPoNodePort, el campoAddress(Status.LoadBalancer.IP) de los recursos de Ingress operados por NetScaler CPX se actualiza con la dirección IP del clúster del servicio CPX.
Salida de Ingress de ejemplo después de una actualización de estado de Ingress
A continuación se muestra una salida de Ingress de ejemplo después de la actualización del estado de Ingress:
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
sample-ingress sample.citrix.com sample.abc.somexampledomain.com 80 1d