Configura Kubernetes Ingress per nodi ibridi - Amazon EKS

Aiutaci a migliorare questa pagina

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Per contribuire a questa guida per l'utente, scegli il GitHub link Modifica questa pagina nel riquadro destro di ogni pagina.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Configura Kubernetes Ingress per nodi ibridi

Questo argomento descrive come configurare Kubernetes Ingress per i carichi di lavoro in esecuzione su Amazon EKS Hybrid Nodes. Kubernetes Ingress espone i percorsi HTTP e HTTPS dall'esterno del cluster ai servizi all'interno del cluster. Per utilizzare le risorse Ingress, è necessario un controller Kubernetes Ingress per configurare l'infrastruttura di rete e i componenti che servono il traffico di rete.

AWS supporta AWS Application Load Balancer (ALB) e Cilium for Kubernetes Ingress per carichi di lavoro in esecuzione su nodi ibridi EKS. La decisione di utilizzare ALB o Cilium for Ingress si basa sulla fonte del traffico delle applicazioni. Se il traffico dell'applicazione proviene da una AWS regione, AWS consiglia di utilizzare AWS ALB e il Load AWS Balancer Controller. Se il traffico delle applicazioni proviene dall'ambiente locale locale locale o perimetrale, AWS consiglia di utilizzare le funzionalità Ingress integrate di Cilium, che possono essere utilizzate con o senza l'infrastruttura di bilanciamento del carico nell'ambiente.

Ingresso di nodi ibridi EKS

AWS Application Load Balancer

Puoi utilizzare AWS Load Balancer Controller e Application Load Balancer (ALB) con il ip tipo di destinazione per i carichi di lavoro in esecuzione su nodi ibridi. Quando si utilizza il tipo di destinazioneip, ALB inoltra il traffico direttamente ai pod, aggirando il percorso di rete del livello di servizio. Affinché ALB raggiunga gli obiettivi IP del pod sui nodi ibridi, il CIDR del pod locale deve essere instradabile sulla rete locale. Inoltre, il AWS Load Balancer Controller utilizza webhook e richiede una comunicazione diretta dal piano di controllo EKS. Per ulteriori informazioni, consulta Configurare webhook per nodi ibridi.

Considerazioni

Prerequisiti

Procedura

  1. Scarica una policy IAM per il AWS Load Balancer Controller che gli consenta di effettuare chiamate per tuo AWS APIs conto.

    curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
  2. Creare una policy IAM utilizzando le policy scaricate nel passaggio precedente.

    aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
  3. Sostituisci il valore per cluster name (CLUSTER_NAME), AWS Region (AWS_REGION) e AWS account ID (AWS_ACCOUNT_ID) con le tue impostazioni ed esegui il comando seguente.

    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. Aggiungi l'archivio di grafici Helm eks-charts e aggiorna il tuo repository Helm locale per assicurarti di avere i grafici più recenti.

    helm repo add eks https://aws.github.io/eks-charts
    helm repo update eks
  5. Installa il AWS Load Balancer Controller. Sostituisci il valore per cluster name (CLUSTER_NAME), AWS Region (AWS_REGION), VPC ID (VPC_ID) e Load AWS Balancer Controller Helm chart version AWS_LBC_HELM_VERSION () con le tue impostazioni ed esegui il comando seguente. Se stai eseguendo un cluster in modalità mista con nodi ibridi e nodi in AWS Cloud, puoi eseguire il AWS Load Balancer Controller sui nodi cloud seguendo le istruzioni riportate all'indirizzo. AWS Controller Load Balancer

    • Puoi trovare la versione più recente del grafico Helm eseguendo. 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. Verifica che il AWS Load Balancer Controller sia stato installato correttamente.

    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. Crea un'applicazione di esempio. L'esempio seguente utilizza l'applicazione di microservizi di esempio Istio Bookinfo.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  8. Crea un file denominato my-ingress-alb.yaml con i seguenti contenuti.

    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. Applica la configurazione Ingress al tuo cluster.

    kubectl apply -f my-ingress-alb.yaml
  10. Il provisioning dell'ALB per la risorsa Ingress potrebbe richiedere alcuni minuti. Una volta effettuato il provisioning dell'ALB, alla risorsa Ingress verrà assegnato un indirizzo che corrisponde al nome DNS della distribuzione ALB. L'indirizzo avrà il 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. Accedi al Servizio utilizzando l'indirizzo dell'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" }

Panoramica di Cilium Ingress e Cilium Gateway

Le funzionalità Ingress di Cilium sono integrate nell'architettura di Cilium e possono essere gestite con l'API Kubernetes Ingress o l'API Gateway. Se non disponi di risorse Ingress esistenti, ti consigliamo di iniziare con l'API Gateway, AWS poiché è un modo più espressivo e flessibile per definire e gestire le risorse di rete Kubernetes. L'API Kubernetes Gateway mira a standardizzare il modo in cui le risorse di rete per Ingress, Load Balancing e Service Mesh vengono definite e gestite nei cluster Kubernetes.

Quando abiliti le funzionalità Ingress o Gateway di Cilium, l'operatore Cilium riconcilia gli oggetti Ingress/Gateway nel cluster e i proxy Envoy su ciascun nodo elaborano il traffico di rete di livello 7 (L7). Cilium non fornisce direttamente l'infrastruttura Ingress/Gateway come i sistemi di bilanciamento del carico. Se si prevede di utilizzare Cilium Ingress/Gateway con un sistema di bilanciamento del carico, è necessario utilizzare gli strumenti del sistema di bilanciamento del carico, in genere un controller Ingress o Gateway, per distribuire e gestire l'infrastruttura del sistema di bilanciamento del carico.

Per il traffico Ingress/Gateway, Cilium gestisce il traffico di rete principale e l'applicazione delle policy L3/L4, mentre i proxy Envoy integrati elaborano il traffico di rete L7. Con Cilium Ingress/Gateway, Envoy è responsabile dell'applicazione delle regole di routing L7, delle politiche e della manipolazione delle richieste, della gestione avanzata del traffico come la suddivisione e il mirroring del traffico e della terminazione e origine del TLS. I proxy Envoy di Cilium vengono distribuiti come proxy separati DaemonSet (cilium-envoy) per impostazione predefinita, il che consente a Envoy e all'agente Cilium di essere aggiornati, scalati e gestiti separatamente.

Per ulteriori informazioni su come funzionano Cilium Ingress e Cilium Gateway, consultate le pagine Cilium Ingress e Cilium Gateway nella documentazione di Cilium.

Confronto tra Cilium Ingress e Gateway

La tabella seguente riassume le funzionalità di Cilium Ingress e Cilium Gateway a partire dalla versione 1.17.x di Cilium.

Funzionalità Ingress Gateway

Tipo di servizio LoadBalancer

Tipo di servizio NodePort

No1

Rete host

Sistema di bilanciamento del carico condiviso

Sistema di bilanciamento del carico dedicato

N. 2

Policy di rete

Protocolli

Livello 7 (HTTP (S), gRPC)

Livello 7 (HTTP (S), gRPC) 3

Passthrough TLS

Gestione del traffico

Routing del percorso e dell'host

Routing del percorso e dell'host, reindirizzamento e riscrittura degli URL, suddivisione del traffico, modifica dell'intestazione

1 Il supporto per i NodePort servizi di Cilium Gateway è previsto per la versione 1.18.x di Cilium (#27273)

2 Supporto Cilium Gateway per sistemi di bilanciamento del carico dedicati (#25567)

3 Supporto Cilium Gateway per (#21929) TCP/UDP

Installa Cilium Gateway

Considerazioni

  • Cilium deve essere configurato con nodePort.enabled set to true come mostrato negli esempi seguenti. Se si utilizza la funzione di sostituzione kube-proxy di Cilium, non è necessario impostarla su. nodePort.enabled true

  • Cilium deve essere configurato con envoy.enabled set to true come mostrato negli esempi seguenti.

  • Cilium Gateway può essere distribuito in modalità di bilanciamento del carico (impostazione predefinita) o in modalità rete host.

  • Quando si utilizza Cilium Gateway in modalità load balancer, l'service.beta.kubernetes.io/aws-load-balancer-type: "external"annotazione deve essere impostata sulla risorsa Gateway per impedire al provider AWS cloud legacy di creare un Classic Load Balancer for the Service del LoadBalancer tipo che Cilium crea per la risorsa Gateway.

  • Quando si utilizza Cilium Gateway in modalità rete host, la modalità Service of type è disabilitata. LoadBalancer La modalità di rete host è utile per gli ambienti che non dispongono di un'infrastruttura di bilanciamento del carico, vedi Rete host per ulteriori informazioni.

Prerequisiti

Procedura

  1. Installa le definizioni delle risorse personalizzate dell'API Kubernetes Gateway (). CRDs

    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. Crea un file denominato cilium-gateway-values.yaml con i seguenti contenuti. L'esempio seguente configura Cilium Gateway per utilizzare la modalità di bilanciamento del carico predefinita e per utilizzare un proxy separato cilium-envoy DaemonSet per Envoy configurato per l'esecuzione solo su nodi ibridi.

    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. Applica il file dei valori Helm al tuo cluster.

    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. Conferma che l'operatore, l'agente e i pod Envoy Cilium siano in funzione.

    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

Configura Cilium Gateway

Cilium Gateway è abilitato sugli oggetti Gateway impostando su. gatewayClassName cilium Il servizio creato da Cilium per le risorse Gateway può essere configurato con campi sull'oggetto Gateway. Le annotazioni comuni utilizzate dai controller Gateway per configurare l'infrastruttura di bilanciamento del carico possono essere configurate con il campo dell'oggetto Gateway. infrastructure Quando si utilizza l' LoadBalancer IPAM di Cilium (vedere l'esempio inTipo di servizio LoadBalancer), l'indirizzo IP da utilizzare per il Service of type LoadBalancer può essere configurato nel campo dell'oggetto Gateway. addresses Per ulteriori informazioni sulla configurazione del gateway, consulta la specifica dell'API 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 e le specifiche Kubernetes Gateway supportano le risorse, Gateway GatewayClass,, e. HTTPRoute GRPCRoute ReferenceGrant

Implementa Cilium Gateway

  1. Crea un'applicazione di esempio. L'esempio seguente utilizza l'applicazione di microservizi di esempio Istio Bookinfo.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  2. Conferma che l'applicazione funzioni correttamente.

    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. Crea un file denominato my-gateway.yaml con i seguenti contenuti. L'esempio seguente utilizza l'service.beta.kubernetes.io/aws-load-balancer-type: "external"annotazione per impedire al provider AWS cloud legacy di creare un Classic Load Balancer per il servizio del LoadBalancer tipo creato da Cilium per la risorsa Gateway.

    --- 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. Applica la risorsa Gateway al tuo cluster.

    kubectl apply -f my-gateway.yaml
  5. Conferma che la risorsa Gateway e il servizio corrispondente sono stati creati. In questa fase, si prevede che il ADDRESS campo della risorsa Gateway non sia popolato con un indirizzo IP o un nome host e che al servizio di tipo LoadBalancer relativo alla risorsa Gateway non sia assegnato un indirizzo IP o un nome host.

    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. Procedi Tipo di servizio LoadBalancer alla configurazione della risorsa Gateway per utilizzare un indirizzo IP allocato da Cilium Load Balancer IPAM Rete host e/o alla configurazione della risorsa Gateway per NodePort utilizzare o ospitare indirizzi di rete. Tipo di servizio NodePort

Installa Cilium Ingress

Considerazioni

  • Cilium deve essere configurato con nodePort.enabled set to true come mostrato negli esempi seguenti. Se si utilizza la funzione di sostituzione kube-proxy di Cilium, non è necessario impostarla su. nodePort.enabled true

  • Cilium deve essere configurato con envoy.enabled set to true come mostrato negli esempi seguenti.

  • Con ingressController.loadbalancerMode set todedicated, Cilium crea servizi dedicati per ogni risorsa Ingress. Con ingressController.loadbalancerMode set toshared, Cilium crea un servizio condiviso di tipo LoadBalancer per tutte le risorse Ingress nel cluster. Quando si utilizza la modalità di bilanciamento del shared carico, le impostazioni per il servizio condiviso comelabels, annotationstype, e loadBalancerIP sono configurate nella ingressController.service sezione dei valori Helm. Per ulteriori informazioni, consulta il riferimento ai valori di Cilium Helm.

  • Con ingressController.default set totrue, Cilium è configurato come controller Ingress predefinito per il cluster e creerà voci Ingress anche quando non ingressClassName è specificato nelle risorse Ingress.

  • Cilium Ingress può essere distribuito in modalità di bilanciamento del carico (impostazione predefinita), porta nodo o rete host. Quando Cilium è installato in modalità rete host, le modalità Servizio di tipo LoadBalancer e Servizio di tipo sono disabilitate. NodePort Per ulteriori informazioni, consulta Rete host.

  • Imposta sempre su ingressController.service.annotations service.beta.kubernetes.io/aws-load-balancer-type: "external" nei valori Helm per impedire al provider AWS cloud legacy di creare un Classic Load Balancer per il servizio cilium-ingress predefinito creato dal grafico Cilium Helm.

Prerequisiti

Procedura

  1. Crea un file denominato cilium-ingress-values.yaml con i seguenti contenuti. L'esempio seguente configura Cilium Ingress per utilizzare la dedicated modalità di bilanciamento del carico predefinita e per utilizzare un proxy Envoy separato configurato cilium-envoy DaemonSet per l'esecuzione solo su nodi ibridi.

    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. Applica il file dei valori Helm al tuo cluster.

    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. Conferma che l'operatore, l'agente e i pod Envoy Cilium siano in funzione.

    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

Configura Cilium Ingress

Cilium Ingress è abilitato sugli oggetti Ingress impostando su. ingressClassName cilium I servizi che Cilium crea per le risorse Ingress possono essere configurati con annotazioni sugli oggetti Ingress quando si utilizza la modalità di bilanciamento del dedicated carico e nella configurazione Cilium/Helm quando si utilizza la modalità di bilanciamento del carico. shared Queste annotazioni vengono comunemente utilizzate dai controller Ingress per configurare l'infrastruttura del bilanciamento del carico o altri attributi del Servizio come il tipo di servizio, la modalità di bilanciamento del carico, le porte e il passthrough TLS. Le annotazioni chiave sono descritte di seguito. Per un elenco completo delle annotazioni supportate, consulta le annotazioni Cilium Ingress nella documentazione di Cilium.

Annotazione Descrizione

ingress.cilium.io/loadbalancer-mode

dedicated: Servizio dedicato di tipo LoadBalancer per ogni risorsa Ingress (impostazione predefinita).

shared: Servizio unico di tipo LoadBalancer per tutte le risorse Ingress.

ingress.cilium.io/service-type

LoadBalancer: Il servizio sarà di tipo LoadBalancer (impostazione predefinita)

NodePort: Il servizio sarà di tipo NodePort.

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

"external": Impedisci ai provider di AWS cloud legacy di effettuare il provisioning di Classic Load Balancer for Services di tipo Classic Load Balancer for Services. LoadBalancer

lbipam.cilium.io/ips

Elenco di indirizzi IP da allocare da Cilium IPAM LoadBalancer

Cilium e le specifiche Kubernetes Ingress supportano regole di corrispondenza specifiche per Exact, Prefix e Implementation per i percorsi Ingress. Cilium supporta regex come regola di corrispondenza specifica per l'implementazione. Per ulteriori informazioni, consulta gli esempi di tipi e priorità dei percorsi di Ingress e dei tipi di percorso nella documentazione di Cilium e gli esempi nella sezione di questa pagina. Implementa Cilium Ingress

Di seguito è riportato un esempio di oggetto 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: ...

Implementa Cilium Ingress

  1. Crea un'applicazione di esempio. L'esempio seguente utilizza l'applicazione di microservizi di esempio Istio Bookinfo.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  2. Conferma che l'applicazione funzioni correttamente.

    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. Crea un file denominato my-ingress.yaml con i seguenti contenuti. L'esempio seguente utilizza l'service.beta.kubernetes.io/aws-load-balancer-type: "external"annotazione per impedire al provider AWS cloud legacy di creare un Classic Load Balancer per il servizio del LoadBalancer tipo creato da Cilium per la risorsa Ingress.

    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. Applica la risorsa Ingress al tuo cluster.

    kubectl apply -f my-ingress.yaml
  5. Conferma che la risorsa Ingress e il servizio corrispondente sono stati creati. In questa fase, si prevede che il ADDRESS campo della risorsa Ingress non sia popolato con un indirizzo IP o un nome host e che al servizio condiviso o dedicato, tipo LoadBalancer per la risorsa Ingress, non sia assegnato un indirizzo IP o un nome host.

    kubectl get ingress my-ingress
    NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium * 80 8s

    Per la modalità di bilanciamento del carico 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

    Per la modalità di bilanciamento del carico 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. Procedi Tipo di servizio LoadBalancer alla configurazione della risorsa Ingress per utilizzare un indirizzo IP allocato da Cilium Load Balancer IPAM Tipo di servizio NodePort e/o Rete host alla configurazione della risorsa Ingress per utilizzare o ospitare gli indirizzi di rete. NodePort

Tipo di servizio LoadBalancer

Infrastruttura di bilanciamento del carico esistente

Per impostazione predefinita, sia per Cilium Ingress che per Cilium Gateway, Cilium crea uno o più servizi Kubernetes di tipo per le risorse Ingress/Gateway. LoadBalancer Gli attributi dei servizi creati da Cilium possono essere configurati tramite le risorse Ingress e Gateway. Quando si creano risorse Ingress o Gateway, l'indirizzo IP o i nomi host esposti esternamente per Ingress o Gateway vengono allocati dall'infrastruttura di bilanciamento del carico, che in genere viene fornita da un controller Ingress o Gateway.

Molti controller Ingress e Gateway utilizzano le annotazioni per rilevare e configurare l'infrastruttura di bilanciamento del carico. Le annotazioni per questi controller Ingress e Gateway sono configurate sulle risorse Ingress o Gateway, come mostrato negli esempi precedenti precedenti. Fai riferimento alla documentazione del controller Ingress o Gateway per le annotazioni che supporta e consulta la documentazione di Kubernetes Ingress e la documentazione di Kubernetes Gateway per un elenco dei controller più diffusi.

Importante

Cilium Ingress and Gateway non possono essere utilizzati con Load AWS Balancer Controller AWS e Network Load Balancer NLBs () con EKS Hybrid Nodes. Il tentativo di utilizzarli insieme porta a obiettivi non registrati, poiché l'NLB tenta di connettersi direttamente al Pod IPs che supporta il tipo di servizio LoadBalancer quando l'NLB target-type è impostato su ip (requisito per l'utilizzo di NLB con carichi di lavoro in esecuzione su nodi ibridi EKS).

Nessuna infrastruttura di bilanciamento del carico

Se non si dispone di un'infrastruttura di bilanciamento del carico e del corrispondente controller Ingress/Gateway nel proprio ambiente, è LoadBalancer possibile configurare le risorse Ingress/Gateway e i servizi di tipo corrispondente per utilizzare gli indirizzi IP allocati dalla gestione degli indirizzi IP Load Balancer (LB IPAM) di Cilium. Cilium LB IPAM può essere configurato con intervalli di indirizzi IP noti dall'ambiente locale e può utilizzare il supporto Border Gateway Protocol (BGP) integrato di Cilium o gli annunci L2 per pubblicizzare gli indirizzi LoadBalancer IP sulla rete locale.

L'esempio seguente mostra come configurare l'IPAM LB di Cilium con un indirizzo IP da utilizzare per le risorse Ingress/Gateway e come configurare Cilium BGP Control Plane per pubblicizzare l'indirizzo LoadBalancer IP con la rete locale. La funzionalità LB IPAM di Cilium è abilitata per impostazione predefinita, ma non viene attivata finché non viene creata una risorsa. CiliumLoadBalancerIPPool

Prerequisiti

Procedura

  1. Facoltativamente, applica una patch alla risorsa Ingress o Gateway per richiedere un indirizzo IP specifico da utilizzare per il tipo di servizio. LoadBalancer Se non richiedi un indirizzo IP specifico, Cilium assegnerà un indirizzo IP dall'intervallo di indirizzi IP configurato nella CiliumLoadBalancerIPPool risorsa nel passaggio successivo. Nei comandi seguenti, sostituiscilo LB_IP_ADDRESS con l'indirizzo IP per richiedere il servizio di tipo. LoadBalancer

    Gateway

    kubectl patch gateway -n default my-gateway --type=merge -p '{ "spec": { "addresses": [{"type": "IPAddress", "value": "LB_IP_ADDRESS"}] } }'

    Ingresso

    kubectl patch ingress my-ingress --type=merge -p '{ "metadata": {"annotations": {"lbipam.cilium.io/ips": "LB_IP_ADDRESS"}} }'
  2. Crea un file denominato cilium-lbip-pool-ingress.yaml con una CiliumLoadBalancerIPPool risorsa per configurare l'intervallo di indirizzi IP Load Balancer per le tue risorse Ingress/Gateway.

    • Se utilizzi Cilium Ingress, Cilium applica automaticamente l'cilium.io/ingress: "true"etichetta ai Servizi che crea per le risorse Ingress. È possibile utilizzare questa etichetta nel serviceSelector campo della definizione delle CiliumLoadBalancerIPPool risorse per selezionare i Servizi idonei per LB IPAM.

    • Se si utilizza Cilium Gateway, è possibile utilizzare l'gateway.networking.k8s.io/gateway-nameetichetta nei serviceSelector campi della definizione delle risorse per selezionare le CiliumLoadBalancerIPPool risorse Gateway idonee per LB IPAM.

    • Sostituire LB_IP_CIDR con l'intervallo di indirizzi IP da utilizzare per gli indirizzi IP di Load Balancer. Per selezionare un singolo indirizzo IP, utilizza un /32 CIDR. Per ulteriori informazioni, consulta Gestione degli indirizzi LoadBalancer IP nella documentazione di 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. Applica la CiliumLoadBalancerIPPool risorsa al tuo cluster.

    kubectl apply -f cilium-lbip-pool-ingress.yaml
  4. Conferma che un indirizzo IP è stato allocato da Cilium LB IPAM per la risorsa Ingress/Gateway.

    Gateway

    kubectl get gateway my-gateway
    NAME CLASS ADDRESS PROGRAMMED AGE my-gateway cilium LB_IP_ADDRESS True 6m41s

    Ingresso

    kubectl get ingress my-ingress
    NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium * LB_IP_ADDRESS 80 10m
  5. Crea un file denominato cilium-bgp-advertisement-ingress.yaml con una CiliumBGPAdvertisement risorsa per pubblicizzare l'indirizzo LoadBalancer IP per le risorse Ingress/Gateway. Se non utilizzi Cilium BGP, puoi saltare questo passaggio. L'indirizzo LoadBalancer IP utilizzato per la risorsa Ingress/Gateway deve essere instradabile sulla rete locale per poter interrogare il servizio nel passaggio successivo.

    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. Applica la CiliumBGPAdvertisement risorsa al tuo cluster.

    kubectl apply -f cilium-bgp-advertisement-ingress.yaml
  7. Accedi al servizio utilizzando l'indirizzo IP assegnato da Cilium LB IPAM.

    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" }

Tipo di servizio NodePort

Se non disponi di un'infrastruttura di bilanciamento del carico e del corrispondente controller Ingress nel tuo ambiente, o se gestisci autonomamente l'infrastruttura di bilanciamento del carico o utilizzi il bilanciamento del carico basato su DNS, puoi configurare Cilium Ingress per creare servizi di tipo per le risorse Ingress. NodePort Quando si utilizza NodePort con Cilium Ingress, il tipo di servizio è esposto su una porta su ciascun nodo nell'intervallo di porte NodePort 30000-32767. In questa modalità, quando il traffico raggiunge qualsiasi nodo del cluster sul NodePort, viene quindi inoltrato a un pod che supporta il servizio, che può trovarsi sullo stesso nodo o su un nodo diverso.

Prerequisiti

Procedura

  1. Aggiorna la risorsa Ingress esistente my-ingress per cambiarla da Tipo di servizio a. LoadBalancer NodePort

    kubectl patch ingress my-ingress --type=merge -p '{ "metadata": {"annotations": {"ingress.cilium.io/service-type": "NodePort"}} }'

    Se non hai creato la risorsa Ingress, puoi crearla applicando la seguente definizione di Ingress al tuo cluster. Nota, la definizione Ingress riportata di seguito utilizza l'applicazione di esempio Istio Bookinfo descritta in. Implementa 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. Conferma che il servizio per la risorsa Ingress è stato aggiornato per utilizzare il tipo di servizio. NodePort Nota la porta per il protocollo HTTP nell'output. Nell'esempio seguente, questa è la porta HTTP32353, che verrà utilizzata in un passaggio successivo per interrogare il servizio. Il vantaggio dell'utilizzo di Cilium Ingress with Service of type NodePort è che è possibile applicare il routing basato su percorsi e host, nonché politiche di rete per il traffico in ingresso, cosa che non è possibile eseguire per un servizio standard di tipo senza Ingress. NodePort

    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. Ottieni gli indirizzi IP dei tuoi nodi nel tuo cluster.

    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. Accedi al tipo di servizio NodePort utilizzando gli indirizzi IP dei tuoi nodi e quelli NodePort acquisiti sopra. Nell'esempio seguente l'indirizzo IP del nodo utilizzato è 10.80.146.32 e lo NodePort è32353. Sostituiscili con i valori del tuo ambiente.

    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" }

Rete host

Analogamente al tipo di servizio NodePort, se non disponi di un'infrastruttura di bilanciamento del carico e di un controller Ingress o Gateway o se gestisci automaticamente il bilanciamento del carico con un bilanciamento del carico esterno, puoi configurare Cilium Ingress e Cilium Gateway per esporre le risorse Ingress e Gateway direttamente sulla rete host. Quando la modalità di rete host è abilitata per una risorsa Ingress o Gateway, il tipo LoadBalancer e le NodePort modalità del Servizio vengono automaticamente disabilitati, la modalità di rete host si esclude a vicenda con queste modalità alternative per ogni risorsa Ingress o Gateway. Rispetto alla NodePort modalità Service of type, la modalità di rete host offre una flessibilità aggiuntiva per la gamma di porte che possono essere utilizzate (non è limitata alla NodePort gamma 30000-32767) ed è possibile configurare un sottoinsieme di nodi in cui i proxy Envoy vengono eseguiti sulla rete host.

Prerequisiti

Procedura

Gateway

  1. Creare un archivio denominato cilium-gateway-host-network.yaml con i seguenti contenuti.

    gatewayAPI: enabled: true hostNetwork: enabled: true # uncomment to restrict nodes where Envoy proxies run on the host network # nodes: # matchLabels: # role: gateway
  2. Applica la configurazione Cilium Gateway della rete host al cluster.

    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

    Se non hai creato la risorsa Gateway, puoi crearla applicando la seguente definizione di Gateway al tuo cluster. La definizione di Gateway riportata di seguito utilizza l'applicazione di esempio Istio Bookinfo descritta in. Implementa Cilium Gateway Nell'esempio seguente, la risorsa Gateway è configurata per utilizzare la 8111 porta per il listener HTTP, che è la porta listener condivisa per i proxy Envoy in esecuzione sulla rete host. Se stai utilizzando una porta privilegiata (inferiore a 1023) per la risorsa Gateway, fai riferimento alla documentazione di Cilium per le istruzioni.

    --- 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

    È possibile osservare la configurazione Cilium Envoy applicata con il seguente comando.

    kubectl get cec cilium-gateway-my-gateway -o yaml

    È possibile ottenere la porta del listener Envoy per il servizio con il cilium-gateway-my-gateway seguente comando. In questo esempio, la porta del listener condiviso è. 8111

    kubectl get cec cilium-gateway-my-gateway -o jsonpath={.spec.services[0].ports[0]}
  3. Ottieni gli indirizzi IP dei tuoi nodi nel cluster.

    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. Accedi al servizio utilizzando gli indirizzi IP dei tuoi nodi e la porta del listener per la cilium-gateway-my-gateway risorsa. Nell'esempio seguente l'indirizzo IP del nodo utilizzato è 10.80.146.32 e la porta del listener è. 8111 Sostituiscili con i valori del tuo ambiente.

    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

A causa di un problema con Cilium upstream (#34028), è necessario utilizzare Cilium Ingress in modalità rete hostloadbalancerMode: shared, che crea un unico servizio di tipo ClusterIP per tutte le risorse Ingress nel cluster. Se stai utilizzando una porta privilegiata (inferiore a 1023) per la risorsa Ingress, consulta la documentazione di Cilium per le istruzioni.

  1. Creare un archivio denominato cilium-ingress-host-network.yaml con i seguenti contenuti.

    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. Applica la configurazione Cilium Ingress della rete host al tuo cluster.

    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

    Se non hai creato la risorsa Ingress, puoi crearla applicando la seguente definizione di Ingress al tuo cluster. La definizione Ingress riportata di seguito utilizza l'applicazione di esempio Istio Bookinfo descritta in. Implementa 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

    È possibile osservare la configurazione Cilium Envoy applicata con il seguente comando.

    kubectl get cec -n kube-system cilium-ingress -o yaml

    È possibile ottenere la porta del listener Envoy per il servizio con il cilium-ingress seguente comando. In questo esempio, la porta del listener condiviso è. 8111

    kubectl get cec -n kube-system cilium-ingress -o jsonpath={.spec.services[0].ports[0]}
  3. Ottieni gli indirizzi IP dei tuoi nodi nel cluster.

    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. Accedi al servizio utilizzando gli indirizzi IP dei tuoi nodi e il comando sharedListenerPort per la cilium-ingress risorsa. Nell'esempio seguente l'indirizzo IP del nodo utilizzato è 10.80.146.32 e la porta del listener è8111. Sostituiscili con i valori del tuo ambiente.

    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" }