設定混合節點的 Kubernetes 輸入 - Amazon EKS

協助改善此頁面

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

若要提供此使用者指南,請選擇位於每個頁面右窗格中的在 GitHub 上編輯此頁面連結。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定混合節點的 Kubernetes 輸入

本主題說明如何為在 Amazon EKS 混合節點上執行的工作負載設定 Kubernetes Ingress。Kubernetes Ingress 公開從叢集外部到叢集內服務的 HTTP 和 HTTPS 路由。若要使用輸入資源,需要 Kubernetes 輸入控制器來設定提供網路流量的網路基礎設施和元件。

AWS 對於在 EKS 混合節點上執行的工作負載,support AWS Application Load Balancer (ALB) 和適用於 Kubernetes Ingress 的 Cilium。使用 ALB 或 Cilium for Ingress 的決定取決於應用程式流量的來源。如果應用程式流量來自 AWS 區域, AWS 建議使用 AWS ALB 和 AWS Load Balancer控制器。如果應用程式流量來自本機內部部署或邊緣環境, AWS 建議使用 Cilium 的內建輸入功能,可在您的環境中搭配或不搭配負載平衡器基礎設施使用。

EKS 混合節點傳入

AWS Application Load Balancer

對於在混合節點上執行ip的工作負載,您可以使用AWS Load Balancer控制器和 Application Load Balancer (ALB) 搭配目標類型。使用目標類型 時ip,ALB 會將流量直接轉送至 Pod,繞過服務層網路路徑。若要讓 ALB 達到混合節點上的 Pod IP 目標,您的內部部署 Pod CIDR 必須可在內部部署網路上路由。此外, AWS Load Balancer控制器使用 Webhook,並且需要從 EKS 控制平面直接通訊。如需詳細資訊,請參閱設定混合節點的 Webhook

考量事項

先決條件

  • 按照 中的指示安裝 Cilium設定混合節點的 CNI

  • 按照 中的指示啟用 Cilium BGP 控制平面為混合節點設定 Cilium BGP。如果您不想使用 BGP,則必須使用替代方法,讓您的內部部署 Pod CIDRs 可在內部部署網路上路由。如果您不讓內部部署 Pod CIDRs 可路由,ALB 將無法註冊或聯絡您的 Pod IP 目標。

  • 安裝在命令列環境中的 Helm,如需詳細資訊,請參閱設定 Helm 說明

  • 安裝在命令列環境中的 eksctl,如需詳細資訊,請參閱 eksctl 安裝說明

程序

  1. 下載 AWS Load Balancer控制器的 IAM 政策,允許其代表您呼叫 AWS APIs。

    curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
  2. 使用上一個步驟中下載的政策,建立 IAM 政策。

    aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
  3. 將叢集名稱 (CLUSTER_NAME)、 AWS 區域 (AWS_REGION) 和 AWS 帳戶 ID (AWS_ACCOUNT_ID) 的值取代為您的設定,然後執行下列命令。

    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. 新增 eks-charts Helm Chart 儲存庫並更新本機 Helm 儲存庫,以確保您有最新的圖表。

    helm repo add eks https://aws.github.io/eks-charts
    helm repo update eks
  5. 安裝 AWS Load Balancer控制器。將叢集名稱 (CLUSTER_NAME)、 AWS 區域 (AWS_REGION)、VPC ID (VPC_ID) 和 AWS Load Balancer控制器 Helm Chart 版本 (AWS_LBC_HELM_VERSION) 的值取代為您的設定,並執行下列命令。如果您在 AWS 雲端中同時執行混合模式叢集與混合節點和節點,您可以遵循 中的指示,在雲端節點上執行 AWS Load Balancer控制器AWS Load Balancer控制器

    • 您可以執行 尋找最新版本的 Helm Charthelm 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. 確認已成功安裝 AWS Load Balancer控制器。

    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. 建立範例應用程式。以下範例使用 Istio Bookinfo 範例微服務應用程式。

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  8. 使用下列內容建立名為 my-ingress-alb.yaml 的檔案。

    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. 將輸入組態套用至您的叢集。

    kubectl apply -f my-ingress-alb.yaml
  10. 為您的傳入資源佈建 ALB 可能需要幾分鐘的時間。佈建 ALB 後,您的傳入資源將指派一個與 ALB 部署的 DNS 名稱對應的地址。地址的格式為 <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. 使用 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" }

Cilium 傳入和 Cilium Gateway 概觀

Cilium 的輸入功能內建於 Cilium 的架構中,並且可以使用 Kubernetes Ingress API 或 Gateway API 進行管理。如果您沒有現有的輸入資源, AWS 建議您從閘道 API 開始,因為它是定義和管理 Kubernetes 網路資源更明確且靈活的方法。Kubernetes Gateway API 旨在標準化如何在 Kubernetes 叢集中定義和管理輸入、負載平衡和 Service Mesh 的網路資源。

當您啟用 Cilium 的輸入或閘道功能時,Cilium 運算子會協調叢集中的輸入/閘道物件,而每個節點上的 Envoy 代理程式會處理 Layer 7 (L7) 網路流量。Cilium 不會直接佈建輸入/閘道基礎設施,例如負載平衡器。如果您打算搭配負載平衡器使用 Cilium Ingress/Gateway,則必須使用負載平衡器的工具,通常是輸入或閘道控制器,來部署和管理負載平衡器的基礎設施。

對於輸入/閘道流量,Cilium 會處理核心網路流量和 L3/L4 政策強制執行,而整合式 Envoy 代理會處理 L7 網路流量。透過 Cilium 傳入/閘道,Envoy 負責套用 L7 路由規則、政策和請求操作、進階流量管理,例如流量分割和鏡像,以及 TLS 終止和起始。根據預設,Cilium 的 Envoy 代理程式會部署為單獨的 DaemonSet (cilium-envoy),這可讓 Envoy 和 Cilium 代理程式分別更新、擴展和管理。

如需 Cilium Ingress 和 Cilium Gateway 運作方式的詳細資訊,請參閱 Cilium 文件中的 Cilium IngressCilium Gateway 頁面。

Cilium 輸入和閘道比較

下表摘要說明截至 Cilium 1.17.x 版的 Cilium Ingress 和 Cilium Gateway 功能。

功能 Ingress 閘道

服務類型 LoadBalancer

服務類型 NodePort

1

主機網路

共用負載平衡器

專用負載平衡器

No2

網路政策

通訊協定

Layer 7 (HTTP(S)、gRPC)

Layer 7 (HTTP(S)、gRPC)3

TLS 傳遞

流量管理

路徑和主機路由

路徑和主機路由、URL 重新導向和重寫、流量分割、標頭修改

1 Cilium Gateway 對 NodePort 服務的支援計劃用於 Cilium 1.18.x 版 (#27273)

2 Cilium Gateway 支援專用負載平衡器 (#25567)

3 Cilium Gateway 支援 TCP/UDP (#21929)

安裝 Cilium Gateway

考量事項

  • Cilium 必須設定為 nodePort.enabled true,如以下範例所示。如果您使用的是 Cilium 的 kube-proxy 取代功能,則不需要nodePort.enabled將 設定為 true

  • Cilium 必須設定為 envoy.enabledtrue如以下範例所示。

  • Cilium Gateway 可以部署在負載平衡器 (預設) 或主機網路模式中。

  • 在負載平衡器模式下使用 Cilium Gateway 時,必須在閘道資源上設定service.beta.kubernetes.io/aws-load-balancer-type: "external"註釋,以防止舊版 AWS 雲端提供者為 Cilium 為閘道資源建立的 LoadBalancer 類型的服務建立 Classic Load Balancer。 LoadBalancer

  • 在主機網路模式中使用 Cilium Gateway 時,會停用 LoadBalancer 模式類型的服務。主機網路模式適用於沒有負載平衡器基礎設施的環境,主機網路如需詳細資訊,請參閱 。

先決條件

  1. 安裝在命令列環境中的 Helm,請參閱設定 Helm 說明

  2. 按照 中的指示安裝 Cilium設定混合節點的 CNI

程序

  1. 安裝 Kubernetes Gateway API 自訂資源定義 (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. 建立稱為 cilium-gateway-values.yaml 的檔案,其中具有以下內容。以下範例會將 Cilium Gateway 設定為使用預設負載平衡器模式,並使用設定為僅在混合節點上執行的個別 cilium-envoy DaemonSet for Envoy 代理。

    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. 將 Helm 值檔案套用至您的叢集。

    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. 確認 Cilium 運算子、代理程式和 Envoy Pod 正在執行。

    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

將 設定為 gatewayClassName ,即可在閘道物件上啟用 Cilium Gatewaycilium。Cilium 為閘道資源建立的服務可以使用閘道物件上的欄位進行設定。Gateway 控制器用來設定負載平衡器基礎設施的常見註釋可以使用 Gateway 物件的 infrastructure 欄位進行設定。使用 Cilium 的 LoadBalancer IPAM 時 (請參閱 中的範例服務類型 LoadBalancer),可在閘道物件的 addresses欄位中設定用於類型 LoadBalancer 服務的 IP 地址。如需閘道組態的詳細資訊,請參閱 Kubernetes Gateway API 規格

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 和 Kubernetes Gateway 規格支援 GatewayClass、Gateway、HTTPRoute、GRPCRoute 和 ReferenceGrant 資源。

部署 Cilium Gateway

  1. 建立範例應用程式。以下範例使用 Istio Bookinfo 範例微服務應用程式。

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  2. 確認應用程式已成功執行。

    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. 使用下列內容建立名為 my-gateway.yaml 的檔案。以下範例使用 service.beta.kubernetes.io/aws-load-balancer-type: "external"註釋,以防止舊版 AWS 雲端提供者為 Cilium 為閘道資源建立的 LoadBalancer 類型服務建立 Classic Load Balancer。 LoadBalancer

    --- 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. 將閘道資源套用至您的叢集。

    kubectl apply -f my-gateway.yaml
  5. 確認閘道資源和對應的服務已建立。在此階段,閘道資源的 ADDRESS 欄位預期不會填入 IP 地址或主機名稱,而且閘道資源的 LoadBalancer 類型服務同樣不會指派 IP 地址或主機名稱。

    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. 繼續服務類型 LoadBalancer設定閘道資源以使用 Cilium Load Balancer IPAM 配置的 IP 地址,服務類型 NodePort以及主機網路設定閘道資源以使用 NodePort 或主機網路地址。

安裝 Cilium Ingress

考量事項

  • Cilium 必須設定為 nodePort.enabled true,如以下範例所示。如果您使用的是 Cilium 的 kube-proxy 取代功能,則不需要nodePort.enabled將 設定為 true

  • Cilium 必須設定為 envoy.enabled true,如以下範例所示。

  • ingressController.loadbalancerMode設為 時dedicated,Cilium 會為每個傳入資源建立專用服務。將 ingressController.loadbalancerMode設為 時shared,Cilium 會為叢集中的所有輸入資源建立類型 LoadBalancer 的共用服務。使用shared負載平衡器模式時,共享服務的設定,例如 labelstypeannotationsloadBalancerIP 在 Helm 值的 ingressController.service區段中設定。如需詳細資訊,請參閱 Cilium Helm 值參考

  • ingressController.default設為 時true,Cilium 會設定為叢集的預設輸入控制器,即使ingressClassName未在輸入資源上指定 ,也會建立輸入項目。

  • Cilium Ingress 可以部署在負載平衡器 (預設)、節點連接埠或主機網路模式中。在主機網路模式下安裝 Cilium 時,會停用 LoadBalancer 類型的服務,以及 NodePort 模式類型的服務。如需詳細資訊,請參閱主機網路

  • 一律在 Helm 值service.beta.kubernetes.io/aws-load-balancer-type: "external"ingressController.service.annotations將 設定為 ,以防止舊版 AWS 雲端提供者為 Cilium Helm Chart 建立的預設cilium-ingress服務建立 Classic Load Balancer。

先決條件

  1. 安裝在命令列環境中的 Helm,請參閱設定 Helm 說明

  2. 按照 中的指示安裝 Cilium設定混合節點的 CNI

程序

  1. 建立稱為 cilium-ingress-values.yaml 的檔案,其中具有以下內容。以下範例會將 Cilium Ingress 設定為使用預設負載平衡器dedicated模式,並使用設定為僅在混合節點上執行的個別 cilium-envoy DaemonSet for Envoy 代理。

    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. 將 Helm 值檔案套用至您的叢集。

    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. 確認 Cilium 運算子、代理程式和 Envoy Pod 正在執行。

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

將 設定為 ingressClassName ,即可在輸入物件上啟用 Cilium Ingresscilium。Cilium 為輸入資源建立的 Service (Cilium) 可在使用dedicated負載平衡器模式時,在輸入物件上設定註釋,並在使用shared負載平衡器模式時在 Cilium/Helm 組態中設定註釋。輸入控制器通常會使用這些註釋來設定負載平衡器基礎設施或服務的其他屬性,例如服務類型、負載平衡器模式、連接埠和 TLS 傳遞。關鍵註釋如下所述。如需支援註釋的完整清單,請參閱 Cilium 文件中的 Cilium Ingress 註釋

註釋 描述

ingress.cilium.io/loadbalancer-mode

dedicated:每個輸入資源的 LoadBalancer 類型的專用服務 (預設)。

shared:所有輸入資源的 LoadBalancer 類型單一服務。

ingress.cilium.io/service-type

LoadBalancer:服務類型為 LoadBalancer (預設)

NodePort:服務類型為 NodePort。

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

"external":防止舊版 AWS 雲端提供者為 LoadBalancer 類型的服務佈建 Classic Load Balancer。 LoadBalancer

lbipam.cilium.io/ips

從 Cilium LoadBalancer IPAM 配置的 IP 地址清單

Cilium 和 Kubernetes Ingress 規格支援輸入路徑的精確、字首和實作特定比對規則。Cilium 支援 regex 作為其實作特定的比對規則。如需詳細資訊,請參閱 Cilium 文件中的輸入路徑類型和優先順序路徑類型範例,以及此頁面 部署 Cilium Ingress區段中的範例。

範例 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: ...

部署 Cilium Ingress

  1. 建立範例應用程式。以下範例使用 Istio Bookinfo 範例微服務應用程式。

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  2. 確認應用程式已成功執行。

    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. 使用下列內容建立名為 my-ingress.yaml 的檔案。以下範例使用 service.beta.kubernetes.io/aws-load-balancer-type: "external"註釋,以防止舊版 AWS 雲端提供者為 Cilium 為輸入資源建立的 LoadBalancer 類型的服務建立 Classic Load Balancer。 LoadBalancer

    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. 將輸入資源套用至您的叢集。

    kubectl apply -f my-ingress.yaml
  5. 確認已建立輸入資源和對應的服務。在此階段,預期輸入資源ADDRESS的欄位不會填入 IP 地址或主機名稱,而且輸入資源的共用或專用 LoadBalancer 類型服務同樣不會指派 IP 地址或主機名稱。

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

    對於負載平衡器模式 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

    對於負載平衡器模式 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. 繼續服務類型 LoadBalancer設定傳入資源以使用 Cilium Load Balancer IPAM 配置的 IP 地址,服務類型 NodePort以及主機網路設定傳入資源以使用 NodePort 或主機網路地址。

服務類型 LoadBalancer

現有的負載平衡器基礎設施

根據預設,對於 Cilium Ingress 和 Cilium Gateway,Cilium 會為輸入/閘道資源建立 LoadBalancer 類型 (Kubernetes Service)。Cilium 建立的 Service(服務) 屬性可以透過輸入和閘道資源進行設定。當您建立輸入或閘道資源時,輸入或閘道的外部公開 IP 地址或主機名稱會從負載平衡器基礎設施配置,通常由輸入或閘道控制器佈建。

許多輸入和閘道控制器使用註釋來偵測和設定負載平衡器基礎設施。這些輸入和閘道控制器的註釋是在輸入或閘道資源上設定,如上述範例所示。如需其支援的註釋,請參閱輸入或閘道控制器的文件,並參閱 Kubernetes 輸入文件Kubernetes Gateway 文件,以取得熱門控制器的清單。

重要

Cilium Ingress 和 Gateway 不能與 EKS AWS Load Balancer控制器和 AWS 網路負載平衡器 (NLBs) 搭配使用。嘗試將這些結合使用會導致未註冊的目標,因為當 NLB 的 target-type設定為 時,NLB 會嘗試直接連線至支援 LoadBalancer 類型的服務的 Pod IPs ip(將 NLB 與在 EKS 混合節點上執行的工作負載搭配使用的必要條件)。

無負載平衡器基礎設施

如果您的環境中沒有負載平衡器基礎設施和對應的輸入/閘道控制器,則可以將輸入/閘道資源和類型的對應服務LoadBalancer使用 Cilium Load Balancer IP 地址管理 (LB IPAM) 配置的 IP 地址。Cilium LB IPAM 可以使用來自您內部部署環境的已知 IP 地址範圍進行設定,並且可以使用 Cilium 的內建邊界閘道協定 (BGP) 支援或 L2 公告,將 LoadBalancer IP 地址公告至您的內部部署網路。

以下範例說明如何使用 IP 地址設定 Cilium 的 LB IPAM 以用於傳入/閘道資源,以及如何設定 Cilium BGP 控制平面以使用內部部署網路公告 LoadBalancer IP 地址。Cilium 的 LB IPAM 功能預設為啟用,但在建立CiliumLoadBalancerIPPool資源之前不會啟用。

先決條件

程序

  1. 選擇性地修補輸入或閘道資源,以請求用於 LoadBalancer 類型的服務的特定 IP 地址。如果您未請求特定 IP 地址,Cilium 將從後續步驟中CiliumLoadBalancerIPPool資源中設定的 IP 地址範圍配置 IP 地址。在下列命令中,將 取代LB_IP_ADDRESS為 IP 地址,以請求類型 LoadBalancer 的 Service。

    閘道

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

    傳入

    kubectl patch ingress my-ingress --type=merge -p '{ "metadata": {"annotations": {"lbipam.cilium.io/ips": "LB_IP_ADDRESS"}} }'
  2. 使用 CiliumLoadBalancerIPPool 資源建立名為 cilium-lbip-pool-ingress.yaml 的檔案,以設定傳入/閘道資源的Load Balancer IP 地址範圍。

    • 如果您使用的是 Cilium Ingress,Cilium 會自動將cilium.io/ingress: "true"標籤套用至其為輸入資源建立的服務。您可以在CiliumLoadBalancerIPPool資源定義的 serviceSelector 欄位中使用此標籤,以選取符合 LB IPAM 資格的服務。

    • 如果您使用的是 Cilium Gateway,您可以使用CiliumLoadBalancerIPPool資源定義serviceSelector欄位中的 gateway.networking.k8s.io/gateway-name 標籤來選取符合 LB IPAM 資格的閘道資源。

    • LB_IP_CIDR 將 取代為用於Load Balancer IP 地址的 IP 地址範圍。若要選取單一 IP 地址,請使用 /32 CIDR。如需詳細資訊,請參閱 Cilium 文件中的 LoadBalancer IP 地址管理

      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. CiliumLoadBalancerIPPool 資源套用至您的叢集。

    kubectl apply -f cilium-lbip-pool-ingress.yaml
  4. 確認已從 Cilium LB IPAM 為傳入/閘道資源配置 IP 地址。

    閘道

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

    傳入

    kubectl get ingress my-ingress
    NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium * LB_IP_ADDRESS 80 10m
  5. 使用 CiliumBGPAdvertisement 資源建立名為 cilium-bgp-advertisement-ingress.yaml 的檔案,以公告輸入/閘道資源的 LoadBalancer IP 地址。如果您不是使用 Cilium BGP,則可以略過此步驟。用於輸入/閘道資源的 LoadBalancer IP 地址必須可在內部部署網路上路由,您才能在下一個步驟中查詢服務。

    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. CiliumBGPAdvertisement 資源套用至您的叢集。

    kubectl apply -f cilium-bgp-advertisement-ingress.yaml
  7. 使用從 Cilium LB IPAM 配置的 IP 地址存取服務。

    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

如果您在環境中沒有負載平衡器基礎設施和對應的輸入控制器,或者您是自我管理負載平衡器基礎設施或使用 DNS 型負載平衡,則可以設定 Cilium Ingress 為輸入資源建立 NodePort 類型的服務。搭配 Cilium Ingress 使用 NodePort 時,NodePort 類型的服務會在連接埠範圍 30000-32767 中每個節點上的連接埠上公開。在此模式中,當流量到達 NodePort 上叢集中的任何節點時,就會轉送到可傳回服務的 Pod,其可能位於相同的節點或不同的節點。

注意

Cilium Gateway 對 NodePort 服務的支援計劃適用於 Cilium 1.18.x 版 (#27273)

先決條件

程序

  1. 修補現有的輸入資源my-ingress,將其從服務類型 LoadBalancer 變更為 NodePort。

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

    如果您尚未建立傳入資源,您可以透過將下列傳入定義套用至叢集來建立資源。請注意,下面的輸入定義使用中所述的 Istio Bookinfo 範例應用程式部署 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. 確認輸入資源的服務已更新為使用服務類型 NodePort。請注意輸出中 HTTP 通訊協定的連接埠。在下面的範例中,此 HTTP 連接埠是 32353,將在後續步驟中用於查詢服務。搭配 NodePort 類型的服務使用 Cilium 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. 取得叢集中節點的 IP 地址。

    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. 使用節點的 IP 地址和上述擷取的 NodePort 存取類型 NodePort 的服務。在下面的範例中,使用的節點 IP 地址是 10.80.146.32,而 NodePort 是 32353。以您環境的值取代這些值。

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

主機網路

與 NodePort 類型的服務類似,如果您沒有負載平衡器基礎設施和輸入或閘道控制器,或者如果您使用外部負載平衡器自我管理負載平衡,則可以設定 Cilium Ingress 和 Cilium Gateway 直接在主機網路上公開輸入和閘道資源。為輸入或閘道資源啟用主機網路模式時,會自動停用 LoadBalancer 和 NodePort 類型的服務模式,主機網路模式與每個輸入或閘道資源的這些替代模式互斥。相較於 NodePort 模式類型的服務,主機網路模式為可使用的連接埠範圍提供額外的彈性 (不限於 30000-32767 NodePort 範圍),而且您可以設定 Envoy 代理在主機網路上執行的節點子集。

先決條件

程序

閘道

  1. 建立名為 cilium-gateway-host-network.yaml 且具有下列內容的檔案。

    gatewayAPI: enabled: true hostNetwork: enabled: true # uncomment to restrict nodes where Envoy proxies run on the host network # nodes: # matchLabels: # role: gateway
  2. 將主機網路 Cilium Gateway 組態套用至您的叢集。

    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

    如果您尚未建立閘道資源,可以透過將下列閘道定義套用至叢集來建立閘道資源。下面的閘道定義使用中所述的 Istio Bookinfo 範例應用程式部署 Cilium Gateway。在下面的範例中,閘道資源設定為使用 HTTP 接聽程式的8111連接埠,這是主機網路上執行之 Envoy 代理程式的共用接聽程式連接埠。如果您使用閘道資源的特權連接埠 (低於 1023),請參閱 Cilium 文件以取得說明。

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

    您可以使用下列命令來觀察套用的 Cilium Envoy 組態。

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

    您可以使用下列命令取得cilium-gateway-my-gateway服務的 Envoy 接聽程式連接埠。在此範例中,共用接聽程式連接埠為 8111

    kubectl get cec cilium-gateway-my-gateway -o jsonpath={.spec.services[0].ports[0]}
  3. 取得叢集中節點的 IP 地址。

    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. 使用節點的 IP 地址和cilium-gateway-my-gateway資源的接聽程式連接埠存取服務。在下面的範例中,使用的節點 IP 地址是 10.80.146.32,接聽程式連接埠是 8111。以您環境的值取代這些值。

    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

由於上游 Cilium 問題 (#34028),主機網路模式中的 Cilium Ingress 需要使用 loadbalancerMode: shared,這會為叢集中的所有輸入資源建立單一的 ClusterIP 服務類型。如果您針對傳入資源使用特權連接埠 (低於 1023),請參閱 Cilium 文件以取得說明。

  1. 建立名為 cilium-ingress-host-network.yaml 且具有下列內容的檔案。

    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. 將主機網路 Cilium Ingress 組態套用至叢集。

    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

    如果您尚未建立傳入資源,則可以將下列傳入定義套用至叢集來建立資源。下面的傳入定義使用中所述的 Istio Bookinfo 範例應用程式部署 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

    您可以使用下列命令來觀察套用的 Cilium Envoy 組態。

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

    您可以使用下列命令取得cilium-ingress服務的 Envoy 接聽程式連接埠。在此範例中,共用接聽程式連接埠為 8111

    kubectl get cec -n kube-system cilium-ingress -o jsonpath={.spec.services[0].ports[0]}
  3. 取得叢集中節點的 IP 地址。

    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. 使用節點的 IP 地址和 cilium-ingress 資源sharedListenerPort的 存取 服務。在下面的範例中,使用的節點 IP 地址是 10.80.146.32,接聽程式連接埠是 8111。以您環境的值取代這些值。

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