Ayude a mejorar esta página
Para contribuir a esta guía del usuario, elija el enlace Edit this page on GitHub que se encuentra en el panel derecho de cada página.
Configuración de Kubernetes Ingress para nodos híbridos
En este tema se describe cómo configurar Kubernetes Ingress para las cargas de trabajo que se ejecutan en Nodos híbridos de Amazon EKS. Kubernetes Ingress
AWS es compatible con el Equilibrador de carga de aplicación (ALB) de AWS y Cilium for Kubernetes Ingress para cargas de trabajo que se ejecutan en Nodos híbridos de EKS. La decisión de utilizar ALB o Cilium para la entrada se basa en el origen del tráfico de aplicaciones. Si el tráfico de aplicaciones se origina en una región de AWS, AWS recomienda utilizar el ALB de AWS y el Controlador del equilibrador de carga de AWS. Si el tráfico de aplicaciones se origina en un entorno local en las instalaciones o en la periferia, AWS recomienda utilizar las funciones de entrada integradas de Cilium, que se pueden utilizar con o sin una infraestructura de equilibradores de carga en su entorno.

Equilibrador de carga de aplicación de AWS
Puede usar el Controlador del equilibrador de carga de AWS y el Equilibrador de carga de aplicación (ALB) con el tipo de destino ip
para cargas de trabajo que se ejecutan en nodos híbridos. Cuando se utiliza el tipo de destino ip
, el ALB reenvía el tráfico directamente a los pods, sin pasar por la ruta de red de la capa de servicio. Para que el ALB llegue a los destinos de IP de pods en nodos híbridos, el CIDR de pods en las instalaciones debe ser enrutable en la red en las instalaciones. Además, el Controlador del equilibrador de carga de AWS utiliza webhooks y requiere una comunicación directa desde el plano de control de EKS. Para obtener más información, consulte Configuración de webhooks para nodos híbridos.
Consideraciones
-
Consulte Redirección de tráfico de aplicaciones y HTTP con los equilibradores de carga de aplicaciones y Instalación del Controlador del equilibrador de carga de AWS con Helm para obtener más información sobre el Equilibrador de carga de aplicación de AWS y Controlador del equilibrador de carga de AWS.
-
Consulte Best Practices for Load Balancing para obtener información sobre cómo elegir entre el Equilibrador de carga de aplicación de AWS y el Equilibrador de carga de red de AWS.
-
Consulte AWS Load Balancer Controller Ingress annotations
para obtener la lista de anotaciones que se pueden configurar para los recursos de entrada con el Equilibrador de carga de aplicación de AWS.
Requisitos previos
-
Se instaló Cilium según las instrucciones de Configuración de una CNI para nodos híbridos.
-
Cilium BGP Control Plane está activado según las instrucciones de Configuración del BGP de Cilium para nodos híbridos. Si no desea usar el BGP, debe usar un método alternativo para que los CIDR de pods en las instalaciones sean enrutables dentro de la red en las instalaciones. Si no hace que los CIDR de sus pods en las instalaciones sean enrutables, el ALB no podrá registrar los destinos de IP de su pod ni contactar con ellos.
-
Si tiene Helm instalado en su entorno de línea de comandos, consulte las instrucciones de configuración de Helm para obtener más información.
-
Si tiene eksctl instalado en su entorno de línea de comandos, consulte las instrucciones de instalación de eksctl para obtener más información.
Procedimiento
-
Descargue una política de IAM para el Controlador del equilibrador de carga de AWS que le permita realizar llamadas a las API de AWS en su nombre.
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
-
Cree una política de IAM con la política descargada en el paso anterior.
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
-
Sustituya el valor del nombre del clúster (
CLUSTER_NAME
), la región de AWS (AWS_REGION
) y el ID de la cuenta de AWS (AWS_ACCOUNT_ID
) por su configuración y ejecute el siguiente comando.eksctl create iamserviceaccount \ --cluster=CLUSTER_NAME \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --region AWS_REGION \ --approve
-
Agregue el repositorio de gráficos de Helm y actualice el repositorio local para asegurarse de que cuenta con los gráficos más recientes.
helm repo add eks https://aws.github.io/eks-charts
helm repo update eks
-
Instale el Controlador del equilibrador de carga de AWS. Sustituya el valor del nombre del clúster (
CLUSTER_NAME
), la región de AWS (AWS_REGION
), el ID de VPC (VPC_ID
) y la versión del gráfico de Helm del Controlador del equilibrador de carga de AWS (AWS_LBC_HELM_VERSION
) por su configuración y ejecute el siguiente comando. Si ejecuta un clúster en modo mixto con nodos híbridos y nodos en la nube de AWS, puede ejecutar el Controlador del equilibrador de carga de AWS en los nodos en la nube según las instrucciones de Controlador del equilibrador de carga de AWS.-
Para encontrar la versión más reciente del gráfico de Helm, ejecute
helm search repo eks/aws-load-balancer-controller --versions
.helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --version
AWS_LBC_HELM_VERSION
\ --set clusterName=CLUSTER_NAME
\ --set region=AWS_REGION
\ --set vpcId=VPC_ID
\ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
-
-
Compruebe que el Controlador del equilibrador de carga de AWS se haya instalado correctamente.
kubectl get -n kube-system deployment aws-load-balancer-controller
NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s
-
Cree una aplicación de muestra. En el siguiente ejemplo, se utiliza la aplicación de microservicios de ejemplo Istio BookInfo
. kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
-
Cree un archivo denominado
my-ingress-alb.yaml
con el siguiente contenido.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: default annotations: alb.ingress.kubernetes.io/load-balancer-name: "my-ingress-alb" alb.ingress.kubernetes.io/target-type: "ip" alb.ingress.kubernetes.io/scheme: "internet-facing" alb.ingress.kubernetes.io/healthcheck-path: "/details/1" spec: ingressClassName: alb rules: - http: paths: - backend: service: name: details port: number: 9080 path: /details pathType: Prefix
-
Aplique la configuración de entrada al clúster.
kubectl apply -f my-ingress-alb.yaml
-
El aprovisionamiento del ALB para el recurso de entrada puede tardar unos minutos. Una vez aprovisionado el ALB, el recurso de entrada tendrá asignada una dirección que se corresponderá con el nombre de DNS de la implementación del ALB. La dirección tendrá el formato
<alb-name>-<random-string>.<region>.elb.amazonaws.com
.kubectl get ingress my-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress alb * my-ingress-alb-<random-string>.<region>.elb.amazonaws.com 80 23m
-
Acceda al servicio con la dirección del ALB.
curl -s http//my-ingress-alb-<random-string>.<region>.elb.amazonaws.com:80/details/1 | jq
{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" "details": "This is the details page" }
Información general sobre Cilium Ingress y Cilium Gateway
Las capacidades de entrada de Cilium están integradas en la arquitectura de Cilium y se pueden administrar con API de Gateway o la API de Kubernetes Ingress. Si no tiene recursos de entrada existentes, AWS recomienda que comience con la API de Gateway, ya que es una forma más expresiva y flexible de definir y administrar los recursos de red de Kubernetes. La API de Kubernetes Gateway
Al activar las características de entrada o puerta de enlace de Cilium, el operador de Cilium reconcilia los objetos de entrada y puerta de enlace del clúster y los proxies de Envoy de cada nodo procesan el tráfico de red de capa 7 (L7). Cilium no aprovisiona directamente la infraestructura de entrada y puerta de enlace, como los equilibradores de carga. Si planea usar Cilium Ingress o Gateway con un equilibrador de carga, debe usar las herramientas del equilibrador de carga, normalmente un controlador de entrada o puerta de enlace, para implementar y administrar la infraestructura del equilibrador de carga.
Para el tráfico de entrada o puerta de enlace, Cilium gestiona el tráfico de la red principal y el cumplimiento de las políticas de L3/L4, y los proxies de Envoy integrados procesan el tráfico de red de L7. Con Cilium Ingress o Gateway, Envoy es responsable de aplicar las reglas de enrutamiento de capa 7, las políticas y la manipulación de solicitudes, la administración avanzada del tráfico, como la división y duplicación del tráfico, y la terminación y el origen del TLS. Los proxies de Envoy de Cilium se implementan como un DaemonSet (cilium-envoy
) independiente de forma predeterminada, lo que permite a Envoy y el agente de Cilium actualizarse, escalarse y administrarse por separado.
Para obtener más información sobre cómo funcionan Cilium Ingress y Cilium Gateway, consulte las páginas Cilium Ingress
Comparación entre Cilium Ingress y Gateway
En la siguiente tabla se resumen las características de Cilium Ingress y Cilium Gateway de la versión 1.17.x de Cilium.
Característica | Ingress | Puerta de enlace |
---|---|---|
LoadBalancer del tipo de servicio |
Sí |
Sí |
NodePort del tipo de servicio |
Sí |
No1 |
Red del host |
Sí |
Sí |
Equilibrador de carga compartido |
Sí |
Sí |
Equilibrador de carga dedicado |
Sí |
No2 |
Políticas de red |
Sí |
Sí |
Protocolos |
Capa 7 (HTTP(S), gRPC) |
Capa 7 (HTTP(S), gRPC)3 |
Acceso directo de TLS |
Sí |
Sí |
Administración del tráfico |
Enrutamiento de rutas y hosts |
Enrutamiento de rutas y hosts, redirección y reescritura de URL, división de tráfico, modificación de encabezados |
1 Está prevista la compatibilidad de Cilium Gateway con servicios NodePort en la versión 1.18.x (#27273
2 Compatibilidad de Cilium Gateway con equilibradores de carga dedicados (#25567
3 Compatibilidad de Cilium Gateway con TCP/UDP (#21929
Instalación de Cilium Gateway
Consideraciones
-
Cilium debe configurarse con
nodePort.enabled
establecido entrue
, como se muestra en los ejemplos siguientes. Si utiliza la característica de reemplazo de kube-proxy de Cilium, no necesita configurarnodePort.enabled
entrue
. -
Cilium debe configurarse con
envoy.enabled
establecido entrue
, como se muestra en los ejemplos siguientes. -
Cilium Gateway se puede implementar en modo de equilibrador de carga (predeterminado) o en modo de red host.
-
Cuando se utiliza Cilium Gateway en modo de equilibrador de carga, la anotación
service.beta.kubernetes.io/aws-load-balancer-type: "external"
debe estar configurada en el recurso de puerta de enlace para evitar que el proveedor de nube de AWS heredado cree un Equilibrador de carga clásico para el servicio del tipo LoadBalancer que Cilium crea para el recurso de puerta de enlace. -
Cuando se utiliza Cilium Gateway en el modo de red host, el servicio del tipo LoadBalancer está desactivado. El modo de red host es útil para entornos que no tienen una infraestructura de equilibrador de carga. Consulte Red del host para obtener más información.
Requisitos previos
-
Si tiene Helm instalado en su entorno de línea de comandos, consulte las instrucciones de configuración de Helm.
-
Se instaló Cilium según las instrucciones de Configuración de una CNI para nodos híbridos.
Procedimiento
-
Instale las definiciones de recursos personalizados (CRD) de la API de Kubernetes Gateway.
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gateways.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_httproutes.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_referencegrants.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml
-
Cree un archivo denominado
cilium-gateway-values.yaml
con el siguiente contenido. En el siguiente ejemplo se configura Cilium Gateway para usar el modo de equilibrador de carga predeterminado y usar un DaemonSetcilium-envoy
independiente para los proxies de Envoy configurados para que se ejecuten solo en nodos híbridos.gatewayAPI: enabled: true # uncomment to use host network mode # hostNetwork: # enabled: true nodePort: enabled: true envoy: enabled: true affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: In values: - hybrid
-
Aplique el archivo de valores de Helm al clúster.
helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \ --namespace kube-system \ --reuse-values \ --set operator.rollOutPods=true \ --values cilium-gateway-values.yaml
-
Confirme que el operador, el agente y los pods de Envoy de Cilium estén en ejecución.
kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
NAME READY STATUS RESTARTS AGE cilium-envoy-5pgnd 1/1 Running 0 6m31s cilium-envoy-6fhg4 1/1 Running 0 6m30s cilium-envoy-jskrk 1/1 Running 0 6m30s cilium-envoy-k2xtb 1/1 Running 0 6m31s cilium-envoy-w5s9j 1/1 Running 0 6m31s cilium-grwlc 1/1 Running 0 4m12s cilium-operator-68f7766967-5nnbl 1/1 Running 0 4m20s cilium-operator-68f7766967-7spfz 1/1 Running 0 4m20s cilium-pnxcv 1/1 Running 0 6m29s cilium-r7qkj 1/1 Running 0 4m12s cilium-wxhfn 1/1 Running 0 4m1s cilium-z7hlb 1/1 Running 0 6m30s
Configuración de Cilium Gateway
Cilium Gateway se activa en objetos de puerta de enlace mediante la configuración de gatewayClassName
como cilium
. El servicio que Cilium crea para los recursos de puerta de enlace se puede configurar con los campos del objeto de puerta de enlace. Las anotaciones habituales que utilizan los controladores de puerta de enlace para configurar la infraestructura del equilibrador de carga se pueden configurar con el campo infrastructure
del objeto de puerta de enlace. Cuando se utiliza el IPAM LoadBalancer de Cilium (consulte el ejemplo de LoadBalancer del tipo de servicio), la dirección IP que se utilizará para el servicio del tipo LoadBalancer se puede configurar en el campo addresses
del objeto de puerta de enlace. Para obtener más información sobre la configuración de la puerta de enlace, consulte la especificación de la API de Kubernetes Gateway
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: my-gateway spec: gatewayClassName: cilium infrastructure: annotations: service.beta.kubernetes.io/... service.kuberentes.io/... addresses: - type: IPAddress value: <LoadBalancer IP address> listeners: ...
Cilium y la especificación de Kubernetes Gateway admiten los recursos GatewayClass, de puerta de enlace, HTTPRoute, GRPCRoute y ReferenceGrant.
-
Consulte las especificaciones de HTTPRoute
y GRPCRoute para ver la lista de campos disponibles. -
Consulte los ejemplos de la sección Implementación de Cilium Gateway a continuación y los ejemplos de la documentación de Cilium
para saber cómo utilizar y configurar estos recursos.
Implementación de Cilium Gateway
-
Cree una aplicación de muestra. En el siguiente ejemplo, se utiliza la aplicación de microservicios de ejemplo Istio BookInfo
. kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
-
Compruebe que la aplicación se esté ejecutando correctamente.
kubectl get pods
NAME READY STATUS RESTARTS AGE details-v1-766844796b-9965p 1/1 Running 0 81s productpage-v1-54bb874995-jmc8j 1/1 Running 0 80s ratings-v1-5dc79b6bcd-smzxz 1/1 Running 0 80s reviews-v1-598b896c9d-vj7gb 1/1 Running 0 80s reviews-v2-556d6457d-xbt8v 1/1 Running 0 80s reviews-v3-564544b4d6-cpmvq 1/1 Running 0 80s
-
Cree un archivo denominado
my-gateway.yaml
con el siguiente contenido. En el ejemplo siguiente se utiliza la anotaciónservice.beta.kubernetes.io/aws-load-balancer-type: "external"
para evitar que el proveedor de nube de AWS heredado cree un Equilibrador de carga clásico para el servicio del tipo LoadBalancer que Cilium crea para el recurso de puerta de enlace.--- apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: my-gateway spec: gatewayClassName: cilium infrastructure: annotations: service.beta.kubernetes.io/aws-load-balancer-type: "external" listeners: - protocol: HTTP port: 80 name: web-gw allowedRoutes: namespaces: from: Same --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: http-app-1 spec: parentRefs: - name: my-gateway namespace: default rules: - matches: - path: type: PathPrefix value: /details backendRefs: - name: details port: 9080
-
Aplique el recurso de puerta de enlace al clúster.
kubectl apply -f my-gateway.yaml
-
Confirme que se hayan creado el recurso de puerta de enlace y el servicio correspondiente. En esta fase, se espera que el campo
ADDRESS
del recurso de puerta de enlace no se complete con una dirección IP o un nombre de host y que el servicio del tipo LoadBalancer para el recurso de puerta de enlace tampoco tenga una dirección IP o un nombre de host asignados.kubectl get gateway my-gateway
NAME CLASS ADDRESS PROGRAMMED AGE my-gateway cilium True 10s
kubectl get svc cilium-gateway-my-gateway
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cilium-gateway-my-gateway LoadBalancer 172.16.227.247 <pending> 80:30912/TCP 24s
-
Continúe con LoadBalancer del tipo de servicio para configurar el recurso de puerta de enlace a fin de que utilice una dirección IP asignada por Cilium Load Balancer IPAM, y con NodePort del tipo de servicio o Red del host para configurar el recurso de puerta de enlace a fin de que utilice direcciones de red de NodePort o host.
Instalación de Cilium Ingress
Consideraciones
-
Cilium debe configurarse con
nodePort.enabled
establecido entrue
, como se muestra en los ejemplos siguientes. Si utiliza la característica de reemplazo de kube-proxy de Cilium, no necesita configurarnodePort.enabled
entrue
. -
Cilium debe configurarse con
envoy.enabled
establecido entrue
, como se muestra en los ejemplos siguientes. -
Si se establece
ingressController.loadbalancerMode
endedicated
, Cilium crea servicios dedicados para cada recurso de entrada. Si se estableceingressController.loadbalancerMode
enshared
, Cilium crea un servicio compartido del tipo LoadBalancer para todos los recursos de entrada del clúster. Cuando se utiliza el modo de equilibrador de cargashared
, la configuración del servicio compartido comolabels
,annotations
,type
yloadBalancerIP
se configura en la seccióningressController.service
de valores de Helm. Consulte la referencia de valores de Helm de Ciliumpara obtener más información. -
Si se establece
ingressController.default
entrue
, Cilium se configura como el controlador de entrada predeterminado para el clúster y creará entradas incluso cuando no se especifiqueingressClassName
en los recursos de entrada. -
Cilium Ingress se puede implementar en modo de equilibrador de carga (predeterminado), puerto de nodos o red host. Cuando Cilium se instala en el modo de red host, los modos de servicio del tipo LoadBalancer y NodePort están desactivados. Para obtener más información, consulte Red del host.
-
Establezca siempre
ingressController.service.annotations
comoservice.beta.kubernetes.io/aws-load-balancer-type: "external"
en los valores de Helm para evitar que el proveedor de nube de AWS heredado cree un Equilibrador de carga clásico para el servicio decilium-ingress
predeterminado creado por el gráfico de Helm de Cilium.
Requisitos previos
-
Si tiene Helm instalado en su entorno de línea de comandos, consulte las instrucciones de configuración de Helm.
-
Se instaló Cilium según las instrucciones de Configuración de una CNI para nodos híbridos.
Procedimiento
-
Cree un archivo denominado
cilium-ingress-values.yaml
con el siguiente contenido. En el siguiente ejemplo se configura Cilium Ingress para usar el mododedicated
del equilibrador de carga predeterminado y usar un DaemonSet decilium-envoy
independiente para los proxies de Envoy configurados para que se ejecuten solo en nodos híbridos.ingressController: enabled: true loadbalancerMode: dedicated service: annotations: service.beta.kubernetes.io/aws-load-balancer-type: "external" nodePort: enabled: true envoy: enabled: true affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: In values: - hybrid
-
Aplique el archivo de valores de Helm al clúster.
helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \ --namespace kube-system \ --reuse-values \ --set operator.rollOutPods=true \ --values cilium-ingress-values.yaml
-
Confirme que el operador, el agente y los pods de Envoy de Cilium estén en ejecución.
kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
NAME READY STATUS RESTARTS AGE cilium-envoy-5pgnd 1/1 Running 0 6m31s cilium-envoy-6fhg4 1/1 Running 0 6m30s cilium-envoy-jskrk 1/1 Running 0 6m30s cilium-envoy-k2xtb 1/1 Running 0 6m31s cilium-envoy-w5s9j 1/1 Running 0 6m31s cilium-grwlc 1/1 Running 0 4m12s cilium-operator-68f7766967-5nnbl 1/1 Running 0 4m20s cilium-operator-68f7766967-7spfz 1/1 Running 0 4m20s cilium-pnxcv 1/1 Running 0 6m29s cilium-r7qkj 1/1 Running 0 4m12s cilium-wxhfn 1/1 Running 0 4m1s cilium-z7hlb 1/1 Running 0 6m30s
Configuración de Cilium Ingress
Cilium Ingress se activa en objetos de entrada mediante la configuración de ingressClassName
como cilium
. Los servicios que Cilium crea para los recursos de entrada se pueden configurar con anotaciones en los objetos de entrada cuando se utiliza el modo dedicated
del equilibrador de carga y en la configuración de Cilium o Helm cuando se utiliza el modo shared
del equilibrador de carga. Los controladores de entrada suelen utilizar estas anotaciones para configurar la infraestructura del equilibrador de carga u otros atributos del servicio, como el tipo de servicio, el modo del equilibrador de carga, los puertos y los accesos directos a TLS. Las anotaciones clave se describen a continuación. Para obtener una lista completa de las anotaciones admitidas, consulte las anotaciones de Cilium Ingress
Anotación | Descripción |
---|---|
|
|
|
|
|
|
|
Lista de direcciones IP para asignar desde el IPAM LoadBalancer de Cilium |
La especificación de Cilium y Kubernetes Ingress admiten reglas de coincidencia exactas, de prefijo y específicas de implementación para las rutas de entrada. Cilium admite las expresiones regulares como regla de coincidencia específica de la implementación. Para obtener más información, consulte Ingress path types and precedence
A continuación, se muestra un ejemplo de objeto de Cilium Ingress.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: service.beta.kuberentes.io/... service.kuberentes.io/... spec: ingressClassName: cilium rules: ...
Implementación de Cilium Ingress
-
Cree una aplicación de muestra. En el siguiente ejemplo, se utiliza la aplicación de microservicios de ejemplo Istio BookInfo
. kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
-
Compruebe que la aplicación se esté ejecutando correctamente.
kubectl get pods
NAME READY STATUS RESTARTS AGE details-v1-766844796b-9965p 1/1 Running 0 81s productpage-v1-54bb874995-jmc8j 1/1 Running 0 80s ratings-v1-5dc79b6bcd-smzxz 1/1 Running 0 80s reviews-v1-598b896c9d-vj7gb 1/1 Running 0 80s reviews-v2-556d6457d-xbt8v 1/1 Running 0 80s reviews-v3-564544b4d6-cpmvq 1/1 Running 0 80s
-
Cree un archivo denominado
my-ingress.yaml
con el siguiente contenido. En el ejemplo siguiente se utiliza la anotaciónservice.beta.kubernetes.io/aws-load-balancer-type: "external"
para evitar que el proveedor de nube de AWS heredado cree un Equilibrador de carga clásico para el servicio del tipo LoadBalancer que Cilium crea para el recurso de entrada.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: default annotations: service.beta.kubernetes.io/aws-load-balancer-type: "external" spec: ingressClassName: cilium rules: - http: paths: - backend: service: name: details port: number: 9080 path: /details pathType: Prefix
-
Aplique el recurso de entrada al clúster.
kubectl apply -f my-ingress.yaml
-
Confirme que se hayan creado el recurso de entrada y el servicio correspondiente. En esta fase, se espera que el campo
ADDRESS
del recurso de entrada no se complete con una dirección IP o un nombre de host y que el servicio compartido o dedicado del tipo LoadBalancer para el recurso de entrada tampoco tenga una dirección IP o un nombre de host asignados.kubectl get ingress my-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium * 80 8s
Para el modo del equilibrador de carga
shared
kubectl -n kube-system get svc cilium-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cilium-ingress LoadBalancer 172.16.217.48 <pending> 80:32359/TCP,443:31090/TCP 10m
Para el modo del equilibrador de carga
dedicated
kubectl -n default get svc cilium-ingress-my-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cilium-ingress-my-ingress LoadBalancer 172.16.193.15 <pending> 80:32088/TCP,443:30332/TCP 25s
-
Continúe con LoadBalancer del tipo de servicio para configurar el recurso de entrada a fin de que utilice una dirección IP asignada por Cilium Load Balancer IPAM, y con NodePort del tipo de servicio o Red del host para configurar el recurso de entrada a fin de que utilice direcciones de red de NodePort o host.
LoadBalancer del tipo de servicio
Infraestructura del equilibrador de carga existente
De forma predeterminada, tanto para Cilium Ingress como para Cilium Gateway, Cilium crea los servicios de Kubernetes del tipo LoadBalancer para los recursos de entrada o puerta de enlace. Los atributos de los servicios que crea Cilium se pueden configurar mediante los recursos de entrada y puerta de enlace. Al crear recursos de entrada o puerta de enlace, la dirección IP expuesta externamente o los nombres de host de dicha entrada o puerta de enlace se asignan desde la infraestructura del equilibrador de carga, que se suele aprovisionar mediante un controlador de entrada o puerta de enlace.
Muchos controladores de entrada y puerta de enlace utilizan anotaciones para detectar y configurar la infraestructura del equilibrador de carga. Las anotaciones de estos controladores de entrada y puerta de enlace se configuran en los recursos de entrada o puerta de enlace, como se muestra en los ejemplos anteriores. Consulte la documentación del controlador de entrada o puerta de enlace para ver las anotaciones compatibles, así como la documentación de Kubernetes Ingress
importante
Cilium Ingress y Gateway no se pueden usar con el Controlador del equilibrador de carga de AWS y los Equilibradores de carga de red de AWS con Nodos híbridos de EKS. Al intentar usarlos juntos, los destinos no se registran, ya que el NLB intenta conectarse directamente a las IP del pod que respaldan el servicio del tipo LoadBalancer cuando el target-type
del NLB está configurado en ip
(requisito para usar el NLB con cargas de trabajo que se ejecutan en Nodos híbridos de EKS).
Sin infraestructura del equilibrador de carga
Si no tienen ninguna infraestructura del equilibrador de carga y el controlador de entrada o puerta de enlace correspondiente en su entorno, los recursos de entrada o puerta de enlace y los servicios correspondientes del tipo LoadBalancer se pueden configurar para utilizar las direcciones IP asignadas por Load Balancer IP address management
En el siguiente ejemplo se muestra cómo configurar LB IPAM de Cilium con una dirección IP para utilizarla en los recursos de entrada o puerta de enlace, y cómo configurar Cilium BGP Control Plane para anunciar la dirección IP del LoadBalancer en la red en las instalaciones. La característica LB IPAM de Cilium está activada de forma predeterminada, pero no se activa hasta que se crea un recurso CiliumLoadBalancerIPPool
.
Requisitos previos
-
Se ha instalado Cilium Ingress o Gateway según las instrucciones de Instalación de Cilium Ingress o Instalación de Cilium Gateway.
-
Se han implementado los recursos de Cilium Ingress o Gateway con una aplicación de ejemplo según las instrucciones de Implementación de Cilium Ingress o Implementación de Cilium Gateway.
-
Cilium BGP Control Plane está activado según las instrucciones de Configuración del BGP de Cilium para nodos híbridos. Si no desea utilizar el BGP, puede omitir este requisito previo, pero no podrá acceder a su recurso de entrada o puerta de enlace hasta que la dirección IP del LoadBalancer asignada por LB IPAM de Cilium se pueda enrutar en su red en las instalaciones.
Procedimiento
-
Opcionalmente, parchee el recurso de entrada o puerta de enlace para solicitar una dirección IP específica para usarla en el servicio del tipo LoadBalancer. Si no solicita ninguna dirección IP específica, Cilium asignará una dirección IP del rango de direcciones IP configurado en el recurso
CiliumLoadBalancerIPPool
en el paso siguiente. En los comandos siguientes, sustituyaLB_IP_ADDRESS
por la dirección IP para solicitar el servicio del tipo LoadBalancer.Puerta de enlace
kubectl patch gateway -n default my-gateway --type=merge -p '{ "spec": { "addresses": [{"type": "IPAddress", "value": "LB_IP_ADDRESS"}] } }'
Ingreso
kubectl patch ingress my-ingress --type=merge -p '{ "metadata": {"annotations": {"lbipam.cilium.io/ips": "LB_IP_ADDRESS"}} }'
-
Cree un archivo llamado
cilium-lbip-pool-ingress.yaml
con un recursoCiliumLoadBalancerIPPool
para configurar el rango de direcciones IP del equilibrador de carga para los recursos de entrada o puerta de enlace.-
Si utiliza Cilium Ingress, Cilium aplica automáticamente la etiqueta
cilium.io/ingress: "true"
a los servicios que crea para los recursos de entrada. Puede utilizar esta etiqueta en el camposerviceSelector
de la definición del recursoCiliumLoadBalancerIPPool
para seleccionar los servicios aptos para LB IPAM. -
Si utiliza Cilium Gateway, puede utilizar la etiqueta
gateway.networking.k8s.io/gateway-name
en los camposserviceSelector
de la definición del recursoCiliumLoadBalancerIPPool
para seleccionar los recursos de puerta de enlace aptos para LB IPAM. -
Reemplace
LB_IP_CIDR
por el rango de direcciones IP para utilizar las direcciones IP del equilibrador de carga. Para seleccionar una sola dirección IP, use un CIDR/32
. Para obtener más información, consulte LoadBalancer IP Address Managementen la documentación de Cilium. apiVersion: cilium.io/v2alpha1 kind: CiliumLoadBalancerIPPool metadata: name: bookinfo-pool spec: blocks: - cidr: "LB_IP_CIDR" serviceSelector: # if using Cilium Gateway matchExpressions: - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] } # if using Cilium Ingress matchLabels: cilium.io/ingress: "true"
-
-
Aplique el recurso
CiliumLoadBalancerIPPool
al clúster.kubectl apply -f cilium-lbip-pool-ingress.yaml
-
Confirme que se haya asignado una dirección IP desde LB IPAM de Cilium para el recurso de entrada o puerta de enlace.
Puerta de enlace
kubectl get gateway my-gateway
NAME CLASS ADDRESS PROGRAMMED AGE my-gateway cilium
LB_IP_ADDRESS
True 6m41sIngreso
kubectl get ingress my-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium *
LB_IP_ADDRESS
80 10m -
Cree un archivo llamado
cilium-bgp-advertisement-ingress.yaml
con un recursoCiliumBGPAdvertisement
para anunciar la dirección IP del LoadBalancer para los recursos de entrada o puerta de enlace. Si no utiliza el BGP de Cilium, puede saltarse este paso. La dirección IP del LoadBalancer utilizada para el recurso de entrada o puerta de enlace debe poder enrutarse en la red en las instalaciones para que pueda consultar el servicio en el siguiente paso.apiVersion: cilium.io/v2alpha1 kind: CiliumBGPAdvertisement metadata: name: bgp-advertisement-lb-ip labels: advertise: bgp spec: advertisements: - advertisementType: "Service" service: addresses: - LoadBalancerIP selector: # if using Cilium Gateway matchExpressions: - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] } # if using Cilium Ingress matchLabels: cilium.io/ingress: "true"
-
Aplique el recurso
CiliumBGPAdvertisement
al clúster.kubectl apply -f cilium-bgp-advertisement-ingress.yaml
-
Acceda al servicio mediante la dirección IP asignada desde LB IPAM de Cilium.
curl -s http://
LB_IP_ADDRESS
:80/details/1 | jq{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" }
NodePort del tipo de servicio
Si no tiene ninguna infraestructura del equilibrador de carga y el controlador de entrada correspondiente en su entorno, o si autoadministra su infraestructura del equilibrador de carga o utiliza un equilibrador de carga basado en DNS, puede configurar Cilium Ingress para crear servicios del tipo NodePort para los recursos de entrada. Cuando se utiliza NodePort con Cilium Ingress, el servicio del tipo NodePort se expone en un puerto de cada nodo en el rango de puertos 30000-32767. En este modo, cuando el tráfico llega a cualquier nodo del clúster de NodePort, se reenvía a un pod que respalda el servicio, que puede estar en el mismo nodo o en un nodo diferente.
nota
Está prevista la compatibilidad de Cilium Gateway con servicios NodePort en la versión 1.18.x (#27273
Requisitos previos
-
Se ha instalado Cilium Ingress según las instrucciones de Instalación de Cilium Ingress.
-
Se han implementado los recursos de Cilium Ingress con una aplicación de ejemplo según las instrucciones de Implementación de Cilium Ingress.
Procedimiento
-
Parchee el recurso
my-ingress
de entrada existente para cambiarlo del tipo de servicio LoadBalancer a NodePort.kubectl patch ingress my-ingress --type=merge -p '{ "metadata": {"annotations": {"ingress.cilium.io/service-type": "NodePort"}} }'
Si no ha creado el recurso de entrada, puede aplicar la siguiente definición de entrada al clúster para crearlo. Tenga en cuenta que la siguiente definición de entrada utiliza la aplicación de ejemplo Istio BookInfo descrita en Implementación de Cilium Ingress.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: default annotations: service.beta.kubernetes.io/aws-load-balancer-type: "external" "ingress.cilium.io/service-type": "NodePort" spec: ingressClassName: cilium rules: - http: paths: - backend: service: name: details port: number: 9080 path: /details pathType: Prefix
-
Confirme que el servicio del recurso de entrada se haya actualizado para usar el tipo de servicio NodePort. Anote el puerto del protocolo HTTP en la salida. En el siguiente ejemplo, el puerto HTTP es
32353
, que se utilizará en un paso posterior para consultar el servicio. La ventaja de utilizar Cilium Ingress con un servicio del tipo NodePort es que puede aplicar un enrutamiento basado en rutas y hosts, así como políticas de red para el tráfico de entrada, lo que no puede hacer con un servicio estándar del tipo NodePort sin entrada.kubectl -n default get svc cilium-ingress-my-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cilium-ingress-my-ingress NodePort 172.16.47.153 <none> 80:32353/TCP,443:30253/TCP 27m
-
Obtenga las direcciones IP de los nodos en el clúster.
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME mi-026d6a261e355fba7 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.150 <none> Ubuntu 22.04.5 LTS 5.15.0-142-generic containerd://1.7.27 mi-082f73826a163626e Ready <none> 23h v1.32.3-eks-473151a 10.80.146.32 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-09183e8a3d755abf6 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.33 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0d78d815980ed202d Ready <none> 23h v1.32.3-eks-473151a 10.80.146.97 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0daa253999fe92daa Ready <none> 23h v1.32.3-eks-473151a 10.80.146.100 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27
-
Acceda al servicio del tipo NodePort con las direcciones IP de sus nodos y el NodePort capturado anteriormente. En el siguiente ejemplo, la dirección IP del nodo utilizada es
10.80.146.32
, mientras que el NodePort es32353
. Sustitúyalos por los valores correspondientes al entorno.curl -s http://10.80.146.32:32353/details/1 | jq
{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" }
Red del host
Al igual que en el servicio del tipo NodePort, si no tiene ninguna infraestructura del equilibrador de carga ni un controlador de entrada o puerta de enlace, o si autoadministra el equilibrio de carga con un equilibrador de carga externo, puede configurar Cilium Ingress y Cilium Gateway para exponer los recursos de entrada y puerta de enlace directamente en la red host. Cuando el modo de red host está activado para un recurso de entrada o puerta de enlace, los modos de servicio del tipo LoadBalancer y NodePort se desactivan automáticamente, el modo de red host se excluye mutuamente con estos modos alternativos para cada recurso de entrada o puerta de enlace. En comparación con el modo del servicio del tipo NodePort, el modo de red host ofrece flexibilidad adicional para el rango de puertos que se pueden usar (no está restringido al rango NodePort 30000-32767) y puede configurar un subconjunto de nodos donde los proxies de Envoy se ejecutan en la red host.
Requisitos previos
-
Se ha instalado Cilium Ingress o Gateway según las instrucciones de Instalación de Cilium Ingress o Instalación de Cilium Gateway.
Procedimiento
Puerta de enlace
-
Cree un archivo llamado
cilium-gateway-host-network.yaml
con el siguiente contenido.gatewayAPI: enabled: true hostNetwork: enabled: true # uncomment to restrict nodes where Envoy proxies run on the host network # nodes: # matchLabels: # role: gateway
-
Aplique la configuración de Cilium Gateway de red host al clúster.
helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \ --namespace kube-system \ --reuse-values \ --set operator.rollOutPods=true \ -f cilium-gateway-host-network.yaml
Si no ha creado el recurso de puerta de enlace, puede aplicar la siguiente definición de puerta de enlace al clúster para crearlo. La siguiente definición de puerta de enlace utiliza la aplicación de ejemplo Istio BookInfo descrita en Implementación de Cilium Gateway. En el siguiente ejemplo, el recurso de puerta de enlace está configurado para usar el puerto
8111
del oyente HTTP, que es el puerto de oyente compartido para los proxies de Envoy que se ejecutan en la red host. Si utiliza un puerto privilegiado (inferior a 1023) para el recurso de puerta de enlace, consulte la documentación de Ciliumpara obtener instrucciones. --- apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: my-gateway spec: gatewayClassName: cilium listeners: - protocol: HTTP port: 8111 name: web-gw allowedRoutes: namespaces: from: Same --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: http-app-1 spec: parentRefs: - name: my-gateway namespace: default rules: - matches: - path: type: PathPrefix value: /details backendRefs: - name: details port: 9080
Puede observar la configuración de Envoy de Cilium aplicada con el siguiente comando.
kubectl get cec cilium-gateway-my-gateway -o yaml
Puede obtener el puerto de oyente de Envoy para el servicio
cilium-gateway-my-gateway
con el siguiente comando. En este ejemplo, el puerto de oyente compartido es8111
.kubectl get cec cilium-gateway-my-gateway -o jsonpath={.spec.services[0].ports[0]}
-
Obtenga las direcciones IP de los nodos en el clúster.
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME mi-026d6a261e355fba7 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.150 <none> Ubuntu 22.04.5 LTS 5.15.0-142-generic containerd://1.7.27 mi-082f73826a163626e Ready <none> 23h v1.32.3-eks-473151a 10.80.146.32 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-09183e8a3d755abf6 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.33 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0d78d815980ed202d Ready <none> 23h v1.32.3-eks-473151a 10.80.146.97 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0daa253999fe92daa Ready <none> 23h v1.32.3-eks-473151a 10.80.146.100 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27
-
Acceda al servicio mediante las direcciones IP de sus nodos y el puerto de oyente del recurso
cilium-gateway-my-gateway
. En el siguiente ejemplo, la dirección IP del nodo utilizada es10.80.146.32
, mientras que el puerto de oyente es8111
. Sustitúyalos por los valores correspondientes al entorno.curl -s http://10.80.146.32:8111/details/1 | jq
{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" }
Ingress
Debido a un problema de Cilium con el proceso ascendente (#34028loadbalancerMode: shared
, que crea un solo servicio del tipo ClusterIP para todos los recursos de entrada en el clúster. Si utiliza un puerto privilegiado (inferior a 1023) para el recurso de entrada, consulte la documentación de Cilium
-
Cree un archivo llamado
cilium-ingress-host-network.yaml
con el siguiente contenido.ingressController: enabled: true loadbalancerMode: shared # This is a workaround for the upstream Cilium issue service: externalTrafficPolicy: null type: ClusterIP hostNetwork: enabled: true # ensure the port does not conflict with other services on the node sharedListenerPort: 8111 # uncomment to restrict nodes where Envoy proxies run on the host network # nodes: # matchLabels: # role: ingress
-
Aplique la configuración de Cilium Ingress de red host al clúster.
helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \ --namespace kube-system \ --reuse-values \ --set operator.rollOutPods=true \ -f cilium-ingress-host-network.yaml
Si no ha creado el recurso de entrada, puede aplicar la siguiente definición de entrada al clúster para crearlo. La siguiente definición de entrada utiliza la aplicación de ejemplo Istio BookInfo descrita en Implementación de Cilium Ingress.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: default spec: ingressClassName: cilium rules: - http: paths: - backend: service: name: details port: number: 9080 path: /details pathType: Prefix
Puede observar la configuración de Envoy de Cilium aplicada con el siguiente comando.
kubectl get cec -n kube-system cilium-ingress -o yaml
Puede obtener el puerto de oyente de Envoy para el servicio
cilium-ingress
con el siguiente comando. En este ejemplo, el puerto de oyente compartido es8111
.kubectl get cec -n kube-system cilium-ingress -o jsonpath={.spec.services[0].ports[0]}
-
Obtenga las direcciones IP de los nodos en el clúster.
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME mi-026d6a261e355fba7 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.150 <none> Ubuntu 22.04.5 LTS 5.15.0-142-generic containerd://1.7.27 mi-082f73826a163626e Ready <none> 23h v1.32.3-eks-473151a 10.80.146.32 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-09183e8a3d755abf6 Ready <none> 23h v1.32.3-eks-473151a 10.80.146.33 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0d78d815980ed202d Ready <none> 23h v1.32.3-eks-473151a 10.80.146.97 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27 mi-0daa253999fe92daa Ready <none> 23h v1.32.3-eks-473151a 10.80.146.100 <none> Ubuntu 22.04.4 LTS 5.15.0-142-generic containerd://1.7.27
-
Acceda al servicio mediante las direcciones IP de sus nodos y el
sharedListenerPort
del recursocilium-ingress
. En el siguiente ejemplo, la dirección IP del nodo utilizada es10.80.146.32
, mientras que el puerto de oyente es8111
. Sustitúyalos por los valores correspondientes al entorno.curl -s http://10.80.146.32:8111/details/1 | jq
{ "id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890" }