Configuración de Kubernetes Ingress para nodos híbridos - Amazon EKS

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 expone las rutas HTTP y HTTPS desde fuera del clúster a los servicios del clúster. Para utilizar los recursos de Ingress, se necesita un controlador de Kubernetes Ingress a fin de configurar la infraestructura de red y los componentes que sirven al tráfico de la red.

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.

Entrada de Nodos híbridos de EKS

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

Requisitos previos

Procedimiento

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. Aplique la configuración de entrada al clúster.

    kubectl apply -f my-ingress-alb.yaml
  10. 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
  11. 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 tiene como objetivo estandarizar la forma en que se definen y administran los recursos de red de entrada, equilibrador de carga y malla de servicios en los clústeres de Kubernetes.

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 y Cilium Gateway en la documentación de Cilium.

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

NodePort del tipo de servicio

No1

Red del host

Equilibrador de carga compartido

Equilibrador de carga dedicado

No2

Políticas de red

Protocolos

Capa 7 (HTTP(S), gRPC)

Capa 7 (HTTP(S), gRPC)3

Acceso directo de TLS

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) de Cilium

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 en true, como se muestra en los ejemplos siguientes. Si utiliza la característica de reemplazo de kube-proxy de Cilium, no necesita configurar nodePort.enabled en true.

  • Cilium debe configurarse con envoy.enabled establecido en true, 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

  1. Si tiene Helm instalado en su entorno de línea de comandos, consulte las instrucciones de configuración de Helm.

  2. Se instaló Cilium según las instrucciones de Configuración de una CNI para nodos híbridos.

Procedimiento

  1. 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
  2. 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 DaemonSet cilium-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
  3. 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
  4. 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.

Implementación de Cilium Gateway

  1. 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
  2. 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
  3. Cree un archivo denominado my-gateway.yaml con el siguiente contenido. En el ejemplo siguiente se utiliza la anotación service.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
  4. Aplique el recurso de puerta de enlace al clúster.

    kubectl apply -f my-gateway.yaml
  5. 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
  6. 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 en true, como se muestra en los ejemplos siguientes. Si utiliza la característica de reemplazo de kube-proxy de Cilium, no necesita configurar nodePort.enabled en true.

  • Cilium debe configurarse con envoy.enabled establecido en true, como se muestra en los ejemplos siguientes.

  • Si se establece ingressController.loadbalancerMode en dedicated, Cilium crea servicios dedicados para cada recurso de entrada. Si se establece ingressController.loadbalancerMode en shared, 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 carga shared, la configuración del servicio compartido como labels, annotations, type y loadBalancerIP se configura en la sección ingressController.service de valores de Helm. Consulte la referencia de valores de Helm de Cilium para obtener más información.

  • Si se establece ingressController.default en true, Cilium se configura como el controlador de entrada predeterminado para el clúster y creará entradas incluso cuando no se especifique ingressClassName 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 como service.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 de cilium-ingress predeterminado creado por el gráfico de Helm de Cilium.

Requisitos previos

  1. Si tiene Helm instalado en su entorno de línea de comandos, consulte las instrucciones de configuración de Helm.

  2. Se instaló Cilium según las instrucciones de Configuración de una CNI para nodos híbridos.

Procedimiento

  1. Cree un archivo denominado cilium-ingress-values.yaml con el siguiente contenido. En el siguiente ejemplo se configura Cilium Ingress para usar el modo dedicated del equilibrador de carga predeterminado y usar un DaemonSet de cilium-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
  2. 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
  3. 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 en la documentación de Cilium.

Anotación Descripción

ingress.cilium.io/loadbalancer-mode

dedicated: servicio dedicado del tipo LoadBalancer para cada recurso de entrada (predeterminado).

shared: servicio único del tipo LoadBalancer para todos los recursos de entrada.

ingress.cilium.io/service-type

LoadBalancer: el servicio será del tipo LoadBalancer (predeterminado).

NodePort: el servicio será del tipo NodePort.

service.beta.kubernetes.io/aws-load-balancer-type

"external": evite que un proveedor de nube de AWS heredado aprovisione el Equilibrador de carga clásico para servicios del tipo LoadBalancer.

lbipam.cilium.io/ips

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 y Path types examples en la documentación de Cilium, así como los ejemplos de la sección Implementación de Cilium Ingress de esta página.

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

  1. 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
  2. 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
  3. Cree un archivo denominado my-ingress.yaml con el siguiente contenido. En el ejemplo siguiente se utiliza la anotación service.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
  4. Aplique el recurso de entrada al clúster.

    kubectl apply -f my-ingress.yaml
  5. 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
  6. 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 y la documentación de Kubernetes Gateway para ver una lista de controladores populares.

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 (LB IPAM) de Cilium. LB IPAM de Cilium se puede configurar con rangos de direcciones IP conocidos de su entorno en las instalaciones y puede utilizar la compatibilidad integrada con el protocolo de puerta de enlace fronteriza (BGP) de Cilium o los anuncios de L2 para anunciar las direcciones IP del LoadBalancer en su red en las instalaciones.

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

Procedimiento

  1. 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, sustituya LB_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"}} }'
  2. Cree un archivo llamado cilium-lbip-pool-ingress.yaml con un recurso CiliumLoadBalancerIPPool 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 campo serviceSelector de la definición del recurso CiliumLoadBalancerIPPool para seleccionar los servicios aptos para LB IPAM.

    • Si utiliza Cilium Gateway, puede utilizar la etiqueta gateway.networking.k8s.io/gateway-name en los campos serviceSelector de la definición del recurso CiliumLoadBalancerIPPool 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 Management en 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"
  3. Aplique el recurso CiliumLoadBalancerIPPool al clúster.

    kubectl apply -f cilium-lbip-pool-ingress.yaml
  4. 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 6m41s

    Ingreso

    kubectl get ingress my-ingress
    NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium * LB_IP_ADDRESS 80 10m
  5. Cree un archivo llamado cilium-bgp-advertisement-ingress.yaml con un recurso CiliumBGPAdvertisement 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"
  6. Aplique el recurso CiliumBGPAdvertisement al clúster.

    kubectl apply -f cilium-bgp-advertisement-ingress.yaml
  7. 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) de Cilium

Requisitos previos

Procedimiento

  1. 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
  2. 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
  3. 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
  4. 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 es 32353. 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

Procedimiento

Puerta de enlace

  1. 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
  2. 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 Cilium para 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 es 8111.

    kubectl get cec cilium-gateway-my-gateway -o jsonpath={.spec.services[0].ports[0]}
  3. 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
  4. 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 es 10.80.146.32, mientras que el puerto de oyente es 8111. 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 (#34028), Cilium Ingress en modo de red host requiere el uso de loadbalancerMode: 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 para obtener instrucciones.

  1. 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
  2. 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 es 8111.

    kubectl get cec -n kube-system cilium-ingress -o jsonpath={.spec.services[0].ports[0]}
  3. 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
  4. Acceda al servicio mediante las direcciones IP de sus nodos y el sharedListenerPort del recurso cilium-ingress. En el siguiente ejemplo, la dirección IP del nodo utilizada es 10.80.146.32, mientras que el puerto de oyente es 8111. 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" }