Konfiguration von Kubernetes Ingress für Hybridknoten - Amazon EKS

Unterstützung für die Verbesserung dieser Seite beitragen

Um zu diesem Benutzerhandbuch beizutragen, klicken Sie auf den Link Diese Seite auf GitHub bearbeiten, der sich im rechten Bereich jeder Seite befindet.

Konfiguration von Kubernetes Ingress für Hybridknoten

In diesem Thema wird beschrieben, wie Sie Kubernetes Ingress für Workloads konfigurieren, die in Amazon EKS Hybrid Nodes ausgeführt werden. Kubernetes Ingress macht HTTP- und HTTPS-Routen von außerhalb des Clusters für Services innerhalb des Clusters verfügbar. Zur Nutzung von Ingress-Ressourcen ist ein Kubernetes-Ingress-Controller erforderlich, um die Netzwerkinfrastruktur und Komponenten für den Netzwerkverkehr einzurichten.

AWS unterstützt AWS Application Load Balancer (ALB) und Cilium für Kubernetes Ingress für Workloads, die in EKS-Hybridknoten ausgeführt werden. Die Entscheidung, ALB oder Cilium für Ingress zu verwenden, hängt von der Quelle des Anwendungs-Datenverkehrs ab. Wenn der Anwendungsdatenverkehr aus einer AWS-Region stammt, empfiehlt AWS die Verwendung von AWS ALB und AWS Load Balancer Controller. Wenn der Anwendungs-Datenverkehr aus der lokalen On-Premises- oder Edge-Umgebung stammt, empfiehlt AWS die Verwendung der integrierten Ingress-Funktionen von Cilium, die mit oder ohne Load-Balancer-Infrastruktur in Ihrer Umgebung verwendet werden können.

EKS-Hybridknoten-Eingang

AWS Application Load Balancer

Sie können den AWS Load Balancer Controller und den Application Load Balancer (ALB) mit dem Zieltyp ip für Workloads verwenden, die in Hybridknoten ausgeführt werden. Bei Verwendung des Zieltyps ip leitet ALB den Datenverkehr direkt an die Pods weiter und umgeht dabei den Netzwerkpfad der Service-Ebene. Damit ALB die Pod-IP-Ziele auf Hybridknoten erreichen kann, muss Ihr On-Premises-Pod-CIDR in Ihrem On-Premises-Netzwerk routingfähig sein. Darüber hinaus verwendet der AWS Load Balancer Controller Webhooks und erfordert eine direkte Kommunikation von der EKS-Steuerebene. Weitere Informationen finden Sie unter Konfiguration von Webhooks für Hybridknoten.

Überlegungen

Voraussetzungen

Verfahren

  1. Laden Sie eine IAM-Richtlinie für den AWS-Lastenverteilungs-Controller herunter, die es ihm ermöglicht, in Ihrem Namen Aufrufe an AWS-APIs zu tätigen.

    curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
  2. Erstellen Sie eine IAM-Richtlinie mit der im vorherigen Schritt heruntergeladenen Richtlinie.

    aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
  3. Ersetzen Sie die Werte für den Cluster-Namen (CLUSTER_NAME), die AWS-Region (AWS_REGION) und die AWS-Konto-ID (AWS_ACCOUNT_ID) durch Ihre Einstellungen und führen Sie den folgenden Befehl aus.

    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. Fügen Sie das Helm-Diagramm-Repository eks-charts hinzu und aktualisieren Sie Ihr lokales Helm-Repository, um sicherzustellen, dass Sie über die aktuellsten Diagramme verfügen.

    helm repo add eks https://aws.github.io/eks-charts
    helm repo update eks
  5. Installieren Sie den AWS-Lastenverteilungs-Controller. Ersetzen Sie die Werte für Cluster-Name (CLUSTER_NAME), AWS-Region (AWS_REGION), VPC-ID (VPC_ID) und Helm-Chart-Version für AWS Load Balancer Controller (AWS_LBC_HELM_VERSION) durch Ihre Einstellungen und führen Sie den folgenden Befehl aus. Wenn Sie einen Cluster im kombinierten Modus mit Hybridknoten und Knoten in der AWS Cloud betreiben, können Sie AWS Load Balancer Controller auf Cloud-Knoten ausführen, indem Sie die Anweisungen unter AWS-Lastenverteilungs-Controller befolgen.

    • Die neueste Version des Helm-Charts finden Sie, indem Sie helm search repo eks/aws-load-balancer-controller --versions ausführen.

      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. Überprüfen Sie, ob der AWS Load Balancer Controller erfolgreich installiert wurde.

    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. Erstellen Sie eine Beispielanwendung. Das folgende Beispiel verwendet die Beispielanwendung Istio Bookinfo für Microservices.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  8. Erstellen Sie eine Datei mit dem Namen my-ingress-alb.yaml und dem folgenden Inhalt.

    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. Wenden Sie die Ingress-Konfiguration auf Ihren Cluster an.

    kubectl apply -f my-ingress-alb.yaml
  10. Die Bereitstellung von ALB für Ihre Ingress-Ressource kann einige Minuten dauern. Sobald der ALB bereitgestellt ist, wird Ihrer Ingress-Ressource eine Adresse zugewiesen, die dem DNS-Namen der ALB-Bereitstellung entspricht. Die Adresse hat das Format <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. Zugriff auf den Service über die Adresse des 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" }

Übersicht über Cilium Ingress und Cilium Gateway

Die Ingress-Funktionen von Cilium sind in die Architektur von Cilium integriert und können über die Kubernetes Ingress API oder Gateway API verwaltet werden. Wenn Sie noch nicht über vorhandene Ingress-Ressourcen verfügen, empfiehlt AWS den Einstieg mit der Gateway-API, da diese eine ausdrucksstärkere und flexiblere Möglichkeit zur Definition und Verwaltung von Kubernetes-Netzwerkressourcen bietet. Die Kubernetes-Gateway-API zielt darauf ab, die Definition und Verwaltung von Netzwerkressourcen für Ingress, Lastenausgleich und Service Mesh in Kubernetes-Clustern zu standardisieren.

Wenn Sie die Ingress- oder Gateway-Features von Cilium aktivieren, gleicht der Cilium-Operator Ingress-/Gateway-Objekte im Cluster ab und Envoy-Proxys auf jedem Knoten verarbeiten den Layer-7-Netzwerk-Datenverkehr (L7). Cilium stellt Ingress-/Gateway-Infrastruktur wie Load Balancer nicht direkt bereit. Wenn Sie Cilium Ingress/Gateway mit einem Load Balancer verwenden möchten, müssen Sie die Tools des Load Balancers, üblicherweise einen Ingress- oder Gateway-Controller, verwenden, um die Infrastruktur des Load Balancers bereitzustellen und zu verwalten.

Für den Ingress-/Gateway-Datenverkehr übernimmt Cilium den Kernnetzwerk-Datenverkehr und die Durchsetzung der L3/L4-Richtlinien, während integrierte Envoy-Proxys den L7-Netzwerk-Datenverkehr verarbeiten. Mit Cilium Ingress/Gateway ist Envoy für die Anwendung von L7-Routing-Regeln, Richtlinien und Anforderungsmanipulation, erweitertes Datenverkehrs-Management wie Datenverkehrsaufteilung und -spiegelung sowie TLS-Beendigung und -Initiierung verantwortlich. Die Envoy-Proxys von Cilium werden standardmäßig als separates DaemonSet (cilium-envoy) bereitgestellt, wodurch Envoy und der Cilium-Agent separat aktualisiert, skaliert und verwaltet werden können.

Weitere Informationen zur Funktionsweise von Cilium Ingress und Cilium Gateway finden Sie auf den Seiten Cilium Ingress und Cilium Gateway in der Cilium-Dokumentation.

Vergleich zwischen Cilium Ingress und Gateway

Die folgende Tabelle fasst die Features von Cilium Ingress und Cilium Gateway in Cilium-Version 1.17.x zusammen.

Funktion Ingress Gateway

Servicetyp LoadBalancer

Ja

Ja

Servicetyp NodePort

Ja

Keine1

Host-Netzwerk

Ja

Ja

Gemeinsam genutzter Load Balancer

Ja

Ja

Dedizierter Load Balancer

Ja

Nr.2

Netzwerkrichtlinien

Ja

Ja

Protokolle

Layer 7 (HTTP(S), gRPC)

Layer 7 (HTTP(S), gRPC)3

TLS Passthrough

Ja

Ja

Verwaltung des Datenverkehrs

Pfad- und Host-Routing

Pfad- und Host-Routing, URL-Weiterleitung und -Umschreibung, Datenverkehrsteilung, Header-Änderung

1 Cilium-Gateway-Support für NodePort-Services ist für Cilium-Version 1.18.x geplant (#27273)

2 Cilium-Gateway-Support für dedizierte Load Balancer (#25567)

3 Cilium-Gateway-Support für TCP/UDP (#21929)

Cilium Gateway installieren

Überlegungen

  • Cilium muss mit nodePort.enabled auf true konfiguriert werden, wie in den folgenden Beispielen dargestellt. Wenn Sie das kube-proxy-Ersatz-Feature von Cilium verwenden, müssen Sie nodePort.enabled nicht auf true setzen.

  • Cilium muss mit envoy.enabled auf true konfiguriert werden, wie in den folgenden Beispielen dargestellt.

  • Cilium Gateway kann im Load-Balancer-Modus (Standard) oder im Host-Netzwerkmodus bereitgestellt werden.

  • Wenn Sie Cilium Gateway im Load Balancer-Modus verwenden, muss die service.beta.kubernetes.io/aws-load-balancer-type: "external"-Annotation auf der Gateway-Ressource festgelegt werden, um zu verhindern, dass der alte AWS-Cloud-Anbieter einen Classic Load Balancer für den Service vom Typ LoadBalancer erstellt, den Cilium für die Gateway-Ressource erstellt.

  • Bei Verwendung von Cilium Gateway im Host-Netzwerkmodus ist der Service vom Typ LoadBalancer-Modus deaktiviert. Der Host-Netzwerkmodus ist nützlich für Umgebungen ohne Load Balancer-Infrastruktur. Weitere Informationen finden Sie unter Host-Netzwerk.

Voraussetzungen

  1. Helm ist in Ihrer Befehlszeilenumgebung installiert. Weitere Informationen finden Sie unter Anweisungen zur Einrichtung von Helm.

  2. Cilium wurde gemäß den Anweisungen in CNI für Hybridknoten konfigurieren installiert.

Verfahren

  1. Installieren Sie die benutzerdefinierten Ressourcendefinitionen (CRDs) der Kubernetes-Gateway-API.

    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. Erstellen Sie eine Datei mit dem Namen cilium-gateway-values.yaml und den folgenden Inhalten. Das folgende Beispiel konfiguriert Cilium Gateway so, dass der Standard-Load-Balancer-Modus verwendet wird und ein separates cilium-envoy DaemonSet für Envoy-Proxys verwendet wird, das so konfiguriert ist, dass es nur auf Hybridknoten ausgeführt wird.

    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. Wenden Sie die Helm-Wertedatei auf Ihren Cluster an.

    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. Bestätigen Sie, dass der Cilium-Operator, der Agent und die Envoy-Pods ausgeführt werden.

    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

Cilium Gateway konfigurieren

Cilium Gateway wird für Gateway-Objekte aktiviert, indem gatewayClassName auf cilium gesetzt wird. Der Service, den Cilium für Gateway-Ressourcen erstellt, kann mit Feldern im Gateway-Objekt konfiguriert werden. Gängige Annotationen, die von Gateway-Controllern zur Konfiguration der Load-Balancer-Infrastruktur verwendet werden, können über das infrastructure-Feld des Gateway-Objekts konfiguriert werden. Bei Verwendung von Ciliums LoadBalancer IPAM (siehe Beispiel in Servicetyp LoadBalancer) kann die für den Service vom Typ LoadBalancer zu verwendende IP-Adresse über das addresses-Feld des Gateway-Objekts konfiguriert werden. Weitere Informationen zur Gateway-Konfiguration finden Sie in der Kubernetes-Gateway-API-Spezifikation.

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 und die Kubernetes Gateway-Spezifikation unterstützen die Ressourcen GatewayClass, Gateway, HTTPRoute, GRPCRoute und ReferenceGrant.

Cilium Gateway bereitstellen

  1. Erstellen Sie eine Beispielanwendung. Das folgende Beispiel verwendet die Beispielanwendung Istio Bookinfo für Microservices.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  2. Bestätigen Sie, dass die Anwendung erfolgreich ausgeführt wird.

    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. Erstellen Sie eine Datei mit dem Namen my-gateway.yaml und dem folgenden Inhalt. Das folgende Beispiel verwendet die service.beta.kubernetes.io/aws-load-balancer-type: "external"-Annotation, um zu verhindern, dass der alte AWS-Cloud-Anbieter einen Classic Load Balancer für den Service vom Typ LoadBalancer erstellt, den Cilium für die Gateway-Ressource erstellt.

    --- 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. Wenden Sie die Gateway-Ressource auf Ihren Cluster an.

    kubectl apply -f my-gateway.yaml
  5. Bestätigen Sie, dass die Gateway-Ressource und der entsprechende Service erstellt wurden. Zum gegenwärtigen Zeitpunkt wird davon ausgegangen, dass das ADDRESS-Feld der Gateway-Ressource keine IP-Adresse oder keinen Host-Namen enthält und dass dem Service vom Typ LoadBalancer für die Gateway-Ressource ebenfalls keine IP-Adresse oder kein Host-Name zugewiesen ist.

    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. Fahren Sie mit Servicetyp LoadBalancer fort, um die Gateway-Ressource für die Verwendung einer von Cilium Load Balancer IPAM zugewiesenen IP-Adresse zu konfigurieren, und mit Servicetyp NodePort oder Host-Netzwerk, um die Gateway-Ressource für die Verwendung von NodePort- oder Host-Netzwerkadressen zu konfigurieren.

Cilium Ingress installieren

Überlegungen

  • Cilium muss mit nodePort.enabled auf true konfiguriert werden, wie in den folgenden Beispielen dargestellt. Wenn Sie das kube-proxy-Ersatz-Feature von Cilium verwenden, müssen Sie nodePort.enabled nicht auf true setzen.

  • Cilium muss mit envoy.enabled auf true konfiguriert werden, wie in den folgenden Beispielen dargestellt.

  • Wenn ingressController.loadbalancerMode auf dedicated gesetzt ist, erstellt Cilium dedizierte Services für jede Ingress-Ressource. Wenn ingressController.loadbalancerMode auf shared gesetzt ist, erstellt Cilium einen gemeinsamen Service vom Typ LoadBalancer für alle Ingress-Ressourcen im Cluster. Bei Verwendung des shared-Load-Balancer-Modus werden die Einstellungen für den gemeinsam genutzten Service wie labels, annotations, type und loadBalancerIP im ingressController.service-Abschnitt der Helm-Werte konfiguriert. Weitere Informationen finden Sie in der Wertereferenz von Cilium Helm.

  • Wenn ingressController.default auf true gesetzt ist, wird Cilium als Standard-Ingress-Controller für den Cluster konfiguriert und erstellt Ingress-Einträge, auch wenn ingressClassName bei Ingress-Ressourcen nicht angegeben ist.

  • Cilium Ingress kann im Load Balancer- (Standard), Knoten-Port- oder Host-Netzwerkmodus bereitgestellt werden. Wenn Cilium im Host-Netzwerkmodus installiert ist, werden die Modi „Service vom Typ LoadBalancer“ und „Service vom Typ NodePort“ deaktiviert. Weitere Informationen finden Sie unter Host-Netzwerk.

  • Setzen Sie in den Helm-Werten ingressController.service.annotations immer auf service.beta.kubernetes.io/aws-load-balancer-type: "external", um zu verhindern, dass der alte AWS-Cloud-Anbieter einen Classic Load Balancer für den vom Helm-Chart-Diagramm erstellten Standard-cilium-ingress-Service erstellt.

Voraussetzungen

  1. Helm ist in Ihrer Befehlszeilenumgebung installiert. Weitere Informationen finden Sie unter Anweisungen zur Einrichtung von Helm.

  2. Cilium wurde gemäß den Anweisungen in CNI für Hybridknoten konfigurieren installiert.

Verfahren

  1. Erstellen Sie eine Datei mit dem Namen cilium-ingress-values.yaml und den folgenden Inhalten. Das folgende Beispiel konfiguriert Cilium Ingress so, dass der Standard-dedicated-Modus für Load-Balancer verwendet wird und ein separates cilium-envoy DaemonSet für Envoy-Proxys verwendet wird, das so konfiguriert ist, dass es nur auf Hybridknoten ausgeführt wird.

    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. Wenden Sie die Helm-Wertedatei auf Ihren Cluster an.

    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. Bestätigen Sie, dass der Cilium-Operator, der Agent und die Envoy-Pods ausgeführt werden.

    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

Cilium Ingress konfigurieren

Cilium Ingress wird für Ingress-Objekte aktiviert, indem ingressClassName auf cilium gesetzt wird. Der/die Service(s), den/die Cilium für Ingress-Ressourcen erstellt, kann/können mit Annotationen zu den Ingress-Objekten konfiguriert werden, wenn der dedicated-Load-Balancer-Modus verwendet wird, sowie in der Cilium-/Helm-Konfiguration, wenn der shared-Load-Balancer-Modus verwendet wird. Diese Annotationen werden oft von Ingress-Controllern verwendet, um die Load-Balancer-Infrastruktur oder andere Attribute des Service zu konfigurieren, wie z. B. den Servicetyp, den Load-Balancer-Modus, Ports und TLS Passthrough. Die wichtigsten Annotationen werden unten beschrieben. Eine vollständige Liste der unterstützten Annotationen finden Sie in den Cilium-Ingress-Annotationen in der Cilium-Dokumentation.

Anmerkung Beschreibung

ingress.cilium.io/loadbalancer-mode

dedicated: Dedizierter Service vom Typ LoadBalancer für jede Ingress-Ressource (Standard).

shared: Einzelner Service vom Typ LoadBalancer für alle Ingress-Ressourcen.

ingress.cilium.io/service-type

LoadBalancer: Der Service ist vom Typ LoadBalancer (Standard).

NodePort: Der Service ist vom Typ NodePort.

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

"external": Verhindern Sie, dass ältere AWS-Cloud-Anbieter Classic Load Balancer für Services vom Typ LoadBalancer bereitstellen.

lbipam.cilium.io/ips

Liste der IP-Adressen, die vom Cilium LoadBalancer IPAM zugewiesen werden sollen

Cilium und die Kubernetes-Ingress-Spezifikation unterstützen exakte, präfix- und implementierungsspezifische Übereinstimmungsregeln für Ingress-Pfade. Cilium unterstützt Regex als implementierungsspezifische Übereinstimmungsregel. Weitere Informationen finden Sie unter Ingress-Pfadtypen und -Priorität und Beispiele für Pfadtypen in der Cilium-Dokumentation sowie in den Beispielen im Cilium Ingress bereitstellen-Abschnitt dieser Seite.

Ein Beispiel für ein Cilium-Ingress-Objekt ist unten dargestellt.

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: service.beta.kuberentes.io/... service.kuberentes.io/... spec: ingressClassName: cilium rules: ...

Cilium Ingress bereitstellen

  1. Erstellen Sie eine Beispielanwendung. Das folgende Beispiel verwendet die Beispielanwendung Istio Bookinfo für Microservices.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  2. Bestätigen Sie, dass die Anwendung erfolgreich ausgeführt wird.

    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. Erstellen Sie eine Datei mit dem Namen my-ingress.yaml und dem folgenden Inhalt. Das folgende Beispiel verwendet die service.beta.kubernetes.io/aws-load-balancer-type: "external"-Annotation, um zu verhindern, dass der alte AWS-Cloud-Anbieter einen Classic Load Balancer für den Service vom Typ LoadBalancer erstellt, den Cilium für die Ingress-Ressource erstellt.

    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. Wenden Sie die Ingress-Ressource auf Ihren Cluster an.

    kubectl apply -f my-ingress.yaml
  5. Bestätigen Sie, dass die Ingress-Ressource und der entsprechende Service erstellt wurden. Zu diesem Zeitpunkt wird davon ausgegangen, dass das ADDRESS-Feld der Ingress-Ressource keine IP-Adresse oder keinen Host-Namen enthält und dass dem gemeinsam genutzten oder dedizierten Service vom Typ LoadBalancer für die Ingress-Ressource ebenfalls keine IP-Adresse oder kein Host-Name zugewiesen ist.

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

    Für Load-Balancer-Modus 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

    Für Load-Balancer-Modus 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. Fahren Sie mit Servicetyp LoadBalancer fort, um die Ingress-Ressource so zu konfigurieren, dass sie eine von Cilium Load Balancer IPAM zugewiesene IP-Adresse verwendet, und mit Servicetyp NodePort oder Host-Netzwerk, um die Ingress-Ressource so zu konfigurieren, dass sie NodePort- oder Host-Netzwerkadressen verwendet.

Servicetyp LoadBalancer

Vorhandene Load-Balancer-Infrastruktur

Standardmäßig erstellt Cilium sowohl für Cilium Ingress als auch für Cilium-Gateway-Kubernetes-Services vom Typ LoadBalancer für die Ingress-/Gateway-Ressourcen. Die Attribute der von Cilium erstellten Service(s) können über die Ingress- und Gateway-Ressourcen konfiguriert werden. Wenn Sie Ingress- oder Gateway-Ressourcen erstellen, werden die extern verfügbar gemachten IP-Adressen oder Host-Namen für Ingress oder Gateway von der Load Balancer-Infrastruktur zugewiesen, die normalerweise von einem Ingress- oder Gateway-Controller bereitgestellt wird.

Viele Ingress- und Gateway-Controller verwenden Annotationen, um die Load-Balancer-Infrastruktur zu erkennen und zu konfigurieren. Die Annotationen für diese Ingress- und Gateway-Controller werden auf den Ingress- oder Gateway-Ressourcen konfiguriert, wie in den vorherigen Beispielen oben gezeigt. Informationen zu den unterstützten Annotationen finden Sie in der Dokumentation Ihres Ingress- oder Gateway-Controllers. Eine Liste gängiger Controller finden Sie in der Kubernetes-Ingress-Dokumentation und der Kubernetes-Gateway-Dokumentation.

Wichtig

Cilium Ingress und Gateway können nicht mit dem AWS Load Balancer Controller und AWS Network Load Balancern (NLBs) mit EKS-Hybridknoten verwendet werden. Der Versuch, diese zusammen zu verwenden, führt zu nicht registrierten Zielen, da der NLB versucht, eine direkte Verbindung zu den Pod-IPs herzustellen, die den Service vom Typ LoadBalancer unterstützen, wenn der target-type des NLB auf ip eingestellt ist (Voraussetzung für die Verwendung von NLB mit Workloads, die auf EKS-Hybridknoten ausgeführt werden).

Keine Load-Balancer-Infrastruktur

Wenn Sie in Ihrer Umgebung keine Load Balancer-Infrastruktur und keinen entsprechenden Ingress-/Gateway-Controller haben, können Ingress-/Gateway-Ressourcen und entsprechende Services vom Typ LoadBalancer so konfiguriert werden, dass sie IP-Adressen verwenden, die von der Load-Balancer-IP-Adressverwaltung (LB IPAM) von Cilium zugewiesen werden. Cilium LB IPAM kann mit bekannten IP-Adressbereichen aus Ihrer lokalen Umgebung konfiguriert werden. Mit dem integrierten Border Gateway Protocol (BGP)-Support von Cilium oder L2-Ankündigungen können die LoadBalancer-IP-Adressen in Ihrem On-Premises-Netzwerk bekannt gegeben werden.

Das folgende Beispiel veranschaulicht, wie Sie Ciliums LB IPAM mit einer IP-Adresse für Ihre Ingress-/Gateway-Ressourcen konfigurieren und wie Sie die Cilium-BGP-Steuerebene konfigurieren, um die LoadBalancer-IP-Adresse im On-Premises-Netzwerk bekannt zu geben. Das LB-IPAM-Feature von Cilium ist standardmäßig aktiviert, wird jedoch erst nach der Erstellung einer CiliumLoadBalancerIPPool-Ressource aktiviert.

Voraussetzungen

Verfahren

  1. Patchen Sie optional die Ingress- oder Gateway-Ressource, um eine bestimmte IP-Adresse für den Service vom Typ LoadBalancer anzufordern. Wenn Sie keine bestimmte IP-Adresse anfordern, weist Cilium im nächsten Schritt eine IP-Adresse aus dem in der CiliumLoadBalancerIPPool-Ressource konfigurierten IP-Adressbereich zu. Ersetzen Sie in den folgenden Befehlen LB_IP_ADDRESS durch die anzufordernde IP-Adresse für den Service vom Typ LoadBalancer.

    Gateway

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

    Ingress

    kubectl patch ingress my-ingress --type=merge -p '{ "metadata": {"annotations": {"lbipam.cilium.io/ips": "LB_IP_ADDRESS"}} }'
  2. Erstellen Sie eine Datei mit dem Namen cilium-lbip-pool-ingress.yaml mit einer CiliumLoadBalancerIPPool-Ressource, um den IP-Adressbereich des Load Balancers für Ihre Ingress-/Gateway-Ressourcen zu konfigurieren.

    • Wenn Sie Cilium Ingress verwenden, wendet Cilium das cilium.io/ingress: "true"-Label automatisch auf die Services an, die es für Ingress-Ressourcen erstellt. Sie können dieses Label im Feld serviceSelector der CiliumLoadBalancerIPPool-Ressourcendefinition verwenden, um die für LB IPAM geeigneten Services auszuwählen.

    • Wenn Sie Cilium-Gateway verwenden, können Sie das gateway.networking.k8s.io/gateway-name-Label in den Feldern serviceSelector der CiliumLoadBalancerIPPool-Ressourcendefinition verwenden, um die für LB IPAM geeigneten Gateway-Ressourcen auszuwählen.

    • Ersetzen Sie LB_IP_CIDR durch den IP-Adressbereich, der für die IP-Adressen des Load Balancers verwendet werden soll. Um eine einzelne IP-Adresse auszuwählen, verwenden Sie ein /32 CIDR. Weitere Informationen finden Sie unter LoadBalancer-IP-Adressverwaltung in der Cilium-Dokumentation.

      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. Wenden Sie die CiliumLoadBalancerIPPool-Ressource auf Ihren Cluster an.

    kubectl apply -f cilium-lbip-pool-ingress.yaml
  4. Bestätigen Sie, dass von Cilium LB IPAM eine IP-Adresse für die Ingress-/Gateway-Ressource zugewiesen wurde.

    Gateway

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

    Ingress

    kubectl get ingress my-ingress
    NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium * LB_IP_ADDRESS 80 10m
  5. Erstellen Sie eine Datei mit dem Namen cilium-bgp-advertisement-ingress.yaml und einer CiliumBGPAdvertisement-Ressource, um die LoadBalancer-IP-Adresse für die Ingress-/Gateway-Ressourcen bekannt zu geben. Wenn Sie Cilium BGP nicht verwenden, können Sie diesen Schritt überspringen. Die für Ihre Ingress-/Gateway-Ressource verwendete LoadBalancer-IP-Adresse muss in Ihrem On-Premises-Netzwerk routingfähig sein, damit Sie den Service im nächsten Schritt abfragen können.

    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. Wenden Sie die CiliumBGPAdvertisement-Ressource auf Ihren Cluster an.

    kubectl apply -f cilium-bgp-advertisement-ingress.yaml
  7. Greifen Sie über die von Cilium LB IPAM zugewiesene IP-Adresse auf den Service zu.

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

Servicetyp NodePort

Wenn Sie in Ihrer Umgebung keine Load Balancer-Infrastruktur und keinen entsprechenden Ingress-Controller haben oder wenn Sie Ihre Load Balancer-Infrastruktur selbst verwalten oder DNS-basiertes Load Balancing verwenden, können Sie Cilium Ingress so konfigurieren, dass Service vom Typ NodePort für die Ingress-Ressourcen erstellt werden Bei Verwendung von NodePort mit Cilium Ingress wird der Service vom Typ NodePort auf einem Port auf jedem Knoten im Port-Bereich 30000-32767 verfügbar gemacht. In diesem Modus wird der Datenverkehr, sobald er einen beliebigen Knoten im Cluster auf dem NodePort erreicht, an einen Pod weitergeleitet, der den Service unterstützt. Dieser Pod kann sich auf demselben Knoten oder auf einem anderen Knoten befinden.

Anmerkung

Der Support für Cilium Gateway für NodePort-Services ist für Cilium Version 1.18.x geplant (#27273).

Voraussetzungen

Verfahren

  1. Patchen Sie die vorhandene Ingress-Ressource my-ingress, um sie vom Servicetyp LoadBalancer in NodePort zu ändern.

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

    Falls Sie die Ingress-Ressource noch nicht erstellt haben, können Sie sie erstellen, indem Sie die folgende Ingress-Definition auf Ihren Cluster anwenden. Beachten Sie, dass die folgende Ingress-Definition die in Cilium Ingress bereitstellen beschriebene Istio-Bookinfo-Beispielanwendung verwendet.

    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. Bestätigen Sie, dass der Service für die Ingress-Ressource aktualisiert wurde, um den Servicetyp NodePort zu verwenden. Notieren Sie sich den Port für das HTTP-Protokoll in der Ausgabe. Im folgenden Beispiel lautet dieser HTTP-Port 32353 und wird in einem späteren Schritt zur Abfrage des Services verwendet. Der Vorteil der Verwendung von Cilium Ingress mit einem Servic. vom Typ NodePort besteht darin, dass Sie pfad- und Host-basiertes Routing sowie Netzwerkrichtlinien für den Ingress-Datenverkehr anwenden können. Dies ist bei einem Standard-Service vom Typ NodePort ohne Ingress nicht möglich.

    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. Rufen Sie die IP-Adressen Ihrer Knoten in Ihrem Cluster ab.

    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. Greifen Sie mit den IP-Adressen Ihrer Knoten und dem oben erfassten NodePort auf den Service vom Typ NodePort zu. Im folgenden Beispiel ist die verwendete Knoten-IP-Adresse 10.80.146.32 und der Knoten-Port ist 32353. Ersetzen Sie diese durch die Werte für Ihre Umgebung.

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

Host-Netzwerk

Ähnlich wie beim Service vom Typ NodePort können Sie – wenn Sie nicht über eine Load-Balancer-Infrastruktur und einen Ingress- oder Gateway-Controller verfügen oder wenn Sie Ihren Load Balancing mit einem externen Load Balancer selbst verwalten – Cilium Ingress und Cilium Gateway so konfigurieren, dass Ingress- und Gateway-Ressourcen direkt im Host-Netzwerk verfügbar gemacht werden. Wenn der Host-Netzwerkmodus für eine Ingress- oder Gateway-Ressource aktiviert ist, werden die Modi „Service vom Typ LoadBalancer“ und „NodePort“ automatisch deaktiviert. Der Host-Netzwerkmodus und diese alternativen Modi schließen sich für jede Ingress- oder Gateway-Ressource gegenseitig aus. Im Vergleich zum Modus „Service vom Typ NodePort“ bietet der Host-Netzwerkmodus zusätzliche Flexibilität hinsichtlich des verwendbaren Portbereichs (er ist nicht auf den NodePort-Bereich 30000–32767 beschränkt). Außerdem können Sie eine Teilmenge von Knoten konfigurieren, auf denen die Envoy-Proxys im Host-Netzwerk ausgeführt werden.

Voraussetzungen

Verfahren

Gateway

  1. Erstellen Sie eine Datei mit dem Namen cilium-gateway-host-network.yaml und dem folgenden Inhalt.

    gatewayAPI: enabled: true hostNetwork: enabled: true # uncomment to restrict nodes where Envoy proxies run on the host network # nodes: # matchLabels: # role: gateway
  2. Wenden Sie die Cilium Gateway-Konfiguration des Host-Netzwerks auf Ihren Cluster an.

    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

    Wenn Sie die Gateway-Ressource noch nicht erstellt haben, können Sie sie erstellen, indem Sie die folgende Gateway-Definition auf Ihren Cluster anwenden. Die nachfolgende Gateway-Definition verwendet die in Cilium Gateway bereitstellen beschriebene Istio-Bookinfo-Beispielanwendung. Im folgenden Beispiel ist die Gateway-Ressource so konfiguriert, dass sie den 8111-Port für den HTTP-Listener verwendet, den gemeinsamen Listener-Port für die im Host-Netzwerk ausgeführten Envoy-Proxys. Wenn Sie einen bevorzugten Port (unter 1023) für die Gateway-Ressource verwenden, finden Sie Anweisungen dazu in der Cilium-Dokumentation.

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

    Mit dem folgenden Befehl können Sie die angewendete Cilium-Envoy-Konfiguration anzeigen.

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

    Mit dem folgenden Befehl können Sie den Envoy-Listener-Port für den cilium-gateway-my-gateway-Service abrufen. In diesem Beispiel lautet der gemeinsame Listener-Port 8111.

    kubectl get cec cilium-gateway-my-gateway -o jsonpath={.spec.services[0].ports[0]}
  3. Rufen Sie die IP-Adressen Ihrer Knoten in Ihrem Cluster ab.

    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. Greifen Sie über die IP-Adressen Ihrer Knoten und den Listener-Port für die cilium-gateway-my-gateway-Ressource auf den Service zu. Im nachfolgenden Beispiel lautet die verwendete Knoten-IP-Adresse 10.80.146.32 und der Listener-Port 8111. Ersetzen Sie diese durch die Werte für Ihre Umgebung.

    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

Aufgrund eines vorgelagerten Cilium-Problems (#34028) erfordert Cilium Ingress im Host-Netzwerkmodus die Verwendung von loadbalancerMode: shared, wodurch ein einzelner Service vom Typ ClusterIP für alle Ingress-Ressourcen im Cluster erstellt wird. Wenn Sie einen bevorzugten Port (unter 1023) für die Ingress-Ressource verwenden, finden Sie Anweisungen dazu in der Cilium-Dokumentation.

  1. Erstellen Sie eine Datei mit dem Namen cilium-ingress-host-network.yaml und dem folgenden Inhalt.

    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. Wenden Sie die Cilium Ingress-Konfiguration des Host-Netzwerks auf Ihren Cluster an.

    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

    Falls Sie die Ingress-Ressource noch nicht erstellt haben, können Sie sie erstellen, indem Sie die folgende Ingress-Definition auf Ihren Cluster anwenden. Die nachfolgende Ingress-Definition verwendet die in Cilium Ingress bereitstellen beschriebene Istio-Bookinfo-Beispielanwendung.

    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

    Mit dem folgenden Befehl können Sie die angewendete Cilium-Envoy-Konfiguration anzeigen.

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

    Mit dem folgenden Befehl können Sie den Envoy-Listener-Port für den cilium-ingress-Service abrufen. In diesem Beispiel lautet der gemeinsame Listener-Port 8111.

    kubectl get cec -n kube-system cilium-ingress -o jsonpath={.spec.services[0].ports[0]}
  3. Rufen Sie die IP-Adressen Ihrer Knoten in Ihrem Cluster ab.

    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. Greifen Sie über die IP-Adressen Ihrer Knoten und das sharedListenerPort für die cilium-ingress-Ressource auf den Service zu. Im nachfolgenden Beispiel lautet die verwendete Knoten-IP-Adresse 10.80.146.32 und der Listener-Port 8111. Ersetzen Sie diese durch die Werte für Ihre Umgebung.

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