設定混合節點的 Kubernetes Ingress - Amazon EKS

協助改進此頁面

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

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

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

設定混合節點的 Kubernetes Ingress

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

針對 EKS 混合節點上執行的工作負載,AWS 支援 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

考量事項

先決條件

  • 遵循 設定混合節點的 CNI 中的指示安裝 Cilium。

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

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

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

程序

  1. 下載適用於 AWS Load Balancer 控制器的 IAM 政策,允許它代表您呼叫 AWS API。

    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 search repo eks/aws-load-balancer-controller --versions 來尋找最新版本的 Helm Chart。

      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 Ingress 和 Cilium Gateway 概觀

Cilium 的傳入功能內建於 Cilium 的架構中,並且可以使用 Kubernetes 傳入 API 或閘道 API 進行管理。如果您沒有現有的傳入資源,AWS 會建議您從閘道 API 開始,因為這種方法更豐富生動,可更靈活地是定義和管理 Kubernetes 聯網資源。Kubernetes 閘道 API 旨在標準化 Kubernetes 叢集中傳入、負載平衡和服務網格的網路資源的定義和管理方式。

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

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

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

Cilium Ingress 和 Gateway 比較

下表總結了截至 Cilium 版本 1.17.x 的 Cilium Ingress 和 Cilium Gateway 功能。

功能 Ingress 閘道

服務類型 LoadBalancer

服務類型 NodePort

1

主機網路

共用的負載平衡器

專用負載平衡器

2

網路政策

通訊協定

第 7 層 (HTTP(S)、gRPC)

第 7 層 (HTTP(S)、gRPC)3

TLS 傳遞

流量管理

路徑和主機路由

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

1 Cilium Gateway 計劃在 Cilium 版本 1.18.x 中對 NodePort 服務提供支援 (#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.enabled 設定為 true,如以下範例所示。

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

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

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

先決條件

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

  2. 遵循 設定混合節點的 CNI 中的指示安裝 Cilium。

程序

  1. 安裝 Kubernetes 閘道 API 自訂資源定義 (CRD)。

    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 設定為使用預設負載平衡器模式,以及為僅在混合節點上執行的 Envoy 代理使用單獨 cilium-envoy DaemonSet。

    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,即可在閘道物件上啟用 Cilium Ingress。Cilium 為閘道資源建立的服務可以使用閘道物件上的欄位進行設定。閘道控制器用來設定負載平衡器基礎結構的常見註釋可以透過閘道物件的 infrastructure 欄位進行設定。使用 Cilium 的 LoadBalancer IPAM 時 (請參閱 服務類型 LoadBalancer 中的範例),可在閘道物件的 addresses 欄位中設定用於 LoadBalancer 類型的服務的 IP 位址。如需閘道組態的詳細資訊,請參閱 Kubernetes 閘道 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、閘道、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 雲端提供者為 LoadBalancer 類型的服務建立 Classic Load Balancer,而該服務是 Cilium 為閘道資源所建立的。

    --- 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 負載平衡器模式時,共用服務的設定 (例如 labelsannotationstypeloadBalancerIP) 可在 Helm 值的 ingressController.service 區段中進行設定。如需詳細資訊,請參閱 Cilium Helm 值參考

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

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

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

先決條件

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

  2. 遵循 設定混合節點的 CNI 中的指示安裝 Cilium。

程序

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

    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 Ingress

ingressClassName 設定為 cilium,即可在 Ingress 物件上啟用 Cilium Ingress。當使用 dedicated 負載平衡器模式時,Cilium 為傳入資源建立的服務可藉助傳入物件上的注釋進行設定,而當使用 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。

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 雲端提供者為 LoadBalancer 類型的服務建立 Classic Load Balancer,而該服務是 Cilium 為傳入資源所建立的。

    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 建立的服務屬性可以透過傳入和閘道資源進行設定。當您建立傳入或閘道資源時,傳入或閘道的外部公開 IP 位址或主機名稱會從負載平衡器基礎結構進行配置,並且通常由傳入或閘道控制器進行佈建。

許多傳入和閘道控制器會使用註釋來偵測和設定負載平衡器基礎結構。如上述範例所示,這些傳入和閘道控制器的註釋會在傳入或閘道資源上設定。如需其支援的註釋,請參閱傳入或閘道控制器的文件,而如需熱門控制器的清單,則請參閱 Kubernetes Ingress 文件Kubernetes Gateway 文件

重要

Cilium Ingress 和 Gateway 不能搭配具有 EKS 混合節點的 AWS Load Balancer 控制器及 AWS Network Load Balancer (NLB) 使用。嘗試將其一起使用會導致未註冊的目標,因為當 NLB 的 target-type 設定為 ip 時,NLB 會嘗試直接連接至支援 LoadBalancer 類型的服務的 Pod 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 位址。在下列命令中,使用 IP 位址取代 LB_IP_ADDRESS,以請求 LoadBalancer 類型的服務。

    閘道

    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. 使用 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 資格的閘道資源。

    • 使用用於 Load Balancer IP 位址的 IP 位址範圍取代 LB_IP_CIDR。若要選取單一 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

    Ingress

    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,而這些 Pod 可能位於相同的節點,也可能位於不同的節點。

注意

Cilium Gateway 計劃在 Cilium 版本 1.18.x 中對 NodePort 服務提供支援 (#27273)

先決條件

程序

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

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

    如果您尚未建立傳入資源,則可以將下列傳入定義套用至叢集,進而建立傳入資源。請注意,以下傳入定義會使用 部署 Cilium Ingress 中所述的 Istio Bookinfo 範例應用程式。

    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 的優點是,對於 Ingress 流量,您可以套用路徑和以主機為基礎的路由以及相關網路政策,而對於沒有 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

    如果您尚未建立閘道資源,則可以將下列閘道定義套用至叢集,進而建立閘道資源。以下閘道定義會使用 部署 Cilium Gateway 中所述的 Istio Bookinfo 範例應用程式。在以下範例中,閘道資源會設定為使用 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

    如果您尚未建立傳入資源,則可以將下列傳入定義套用至叢集,進而建立傳入資源。以下傳入定義會使用 部署 Cilium Ingress 中所述的 Istio Bookinfo 範例應用程式。

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