協助改進此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定混合節點的 Kubernetes Ingress
本主題會說明如何為在 Amazon EKS 混合節點上執行的工作負載設定 Kubernetes Ingress。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 的內建傳入功能,而該功能可在您的環境中搭配或不搭配負載平衡器基礎結構使用。
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。
考量事項
-
如需有關 AWS Application Load Balancer 和 AWS Load Balancer 控制器的詳細資訊,請參閱 透過 Application Load Balancer 路由應用程式與 HTTP 流量 和 搭配 Helm 的 Install AWS Load Balancer 控制器。
-
如需如何在 AWS Application Load Balancer 和 AWS Network Load Balancer 之間選擇的資訊,請參閱負載平衡的最佳實務。
-
如需可以使用 AWS Application AWS Load Balancer 為傳入資源設定的註釋清單,請參閱 Load Balancer 控制器傳入注釋
。
先決條件
-
遵循 設定混合節點的 CNI 中的指示安裝 Cilium。
-
遵循 設定混合節點的 Cilium BGP 中的指示啟用 Cilium BGP 控制平面。如果您不想使用 BGP,則必須使用替代方法,以讓內部部署 Pod CIDR 在內部部署網路上可路由。如果您未讓內部部署 Pod CIDR 可路由,則 ALB 將無法註冊或聯絡您的 Pod IP 目標。
-
已在命令列環境中安裝 Helm,如需詳細資訊,請參閱安裝 Helm 說明。
-
已在命令列環境中安裝 eksctl,如需詳細資訊,請參閱安裝 eksctl 說明。
程序
-
下載適用於 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 -
使用上一個步驟中下載的政策,建立 IAM 政策。
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json -
使用您的設定取代下列值:叢集名稱 (
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 -
新增 eks-charts Helm Chart 儲存庫並更新您的本機 Helm 儲存庫,以確保您擁有最近的圖表。
helm repo add eks https://aws.github.io/eks-chartshelm repo update eks -
安裝 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 \ --versionAWS_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
-
-
驗證 AWS Load Balancer 控制器是否已成功安裝。
kubectl get -n kube-system deployment aws-load-balancer-controllerNAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s -
建立範例應用程式。以下範例會使用 Istio Bookinfo
範例微服務應用程式。 kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml -
使用下列內容建立名為
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 -
將傳入組態套用至叢集。
kubectl apply -f my-ingress-alb.yaml -
為您的傳入資源佈建 ALB 可能需要幾分鐘的時間。佈建 ALB 後,您的傳入資源將會為其指派一個與 ALB 部署的 DNS 名稱對應的地址。地址的格式為
<alb-name>-<random-string>.<region>.elb.amazonaws.com。kubectl get ingress my-ingressNAME CLASS HOSTS ADDRESS PORTS AGE my-ingress alb * my-ingress-alb-<random-string>.<region>.elb.amazonaws.com 80 23m -
使用 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
當您啟用 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 Ingress
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 類型的服務模式。對於沒有負載平衡器基礎結構的環境,主機網路模式非常有用,如需詳細資訊,請參閱 主機網路。
先決條件
-
已在命令列環境中安裝 Helm,請參閱安裝 Helm 說明。
-
遵循 設定混合節點的 CNI 中的指示安裝 Cilium。
程序
-
安裝 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 -
建立稱為
cilium-gateway-values.yaml的檔案,其中具有以下內容。以下範例會將 Cilium Gateway 設定為使用預設負載平衡器模式,以及為僅在混合節點上執行的 Envoy 代理使用單獨cilium-envoyDaemonSet。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 -
將 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 -
確認 Cilium 運算子、代理程式和 Envoy Pod 正在執行。
kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=ciliumNAME 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 章節中的範例及 Cilium 文件
中的範例,以了解如何使用和設定這些資源。
部署 Cilium Gateway
-
建立範例應用程式。以下範例會使用 Istio Bookinfo
範例微服務應用程式。 kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml -
確認應用程式已成功執行。
kubectl get podsNAME 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 -
使用下列內容建立名為
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 -
將閘道資源套用至您的叢集。
kubectl apply -f my-gateway.yaml -
確認閘道資源和對應的服務已建立。在此階段,閘道資源的
ADDRESS欄位預期不會填入 IP 位址或主機名稱,而且閘道資源的 LoadBalancer 類型的服務同樣不會指派 IP 位址或主機名稱。kubectl get gateway my-gatewayNAME CLASS ADDRESS PROGRAMMED AGE my-gateway cilium True 10skubectl get svc cilium-gateway-my-gatewayNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cilium-gateway-my-gateway LoadBalancer 172.16.227.247 <pending> 80:30912/TCP 24s -
繼續 服務類型 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負載平衡器模式時,共用服務的設定 (例如labels、annotations、type和loadBalancerIP) 可在 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所建立的。
先決條件
-
已在命令列環境中安裝 Helm,請參閱安裝 Helm 說明。
-
遵循 設定混合節點的 CNI 中的指示安裝 Cilium。
程序
-
建立稱為
cilium-ingress-values.yaml的檔案,其中具有以下內容。以下範例會將 Cilium Ingress 設定為使用預設負載平衡器dedicated模式,以及為僅在混合節點上執行的 Envoy 代理使用單獨cilium-envoyDaemonSet。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 -
將 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 -
確認 Cilium 運算子、代理程式和 Envoy Pod 正在執行。
kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=ciliumNAME 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 註釋
| 註釋 | 描述 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
要從 Cilium LoadBalancer IPAM 配置的 IP 位址的清單 |
Cilium 和 Kubernetes Ingress 規格可支援傳入路徑的精確、字首和實作特定相符規則。Cilium 支援 regex 作為其實作專屬相符規則。如需詳細資訊,請參閱 Cilium 文件中的傳入路徑類型和優先順序
範例 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
-
建立範例應用程式。以下範例會使用 Istio Bookinfo
範例微服務應用程式。 kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml -
確認應用程式已成功執行。
kubectl get podsNAME 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 -
使用下列內容建立名為
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 -
將傳入資源套用至您的叢集。
kubectl apply -f my-ingress.yaml -
確認傳入資源和對應的服務已建立。在此階段,傳入資源的
ADDRESS欄位預期不會填入 IP 位址或主機名稱,而且傳入資源的 LoadBalancer 類型的共用或專用服務同樣不會指派 IP 位址或主機名稱。kubectl get ingress my-ingressNAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium * 80 8s對於負載平衡器模式
sharedkubectl -n kube-system get svc cilium-ingressNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cilium-ingress LoadBalancer 172.16.217.48 <pending> 80:32359/TCP,443:31090/TCP 10m對於負載平衡器模式
dedicatedkubectl -n default get svc cilium-ingress-my-ingressNAME 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 -
繼續 服務類型 LoadBalancer 以設定傳入資源,進而使用 Cilium Load Balancer IPAM 配置的 IP 位址;以及使用 服務類型 NodePort 或 主機網路 以設定傳入資源,進而使用 NodePort 或主機網路位址。
服務類型 LoadBalancer
現有的負載平衡器基礎結構
根據預設,對於 Cilium Ingress 和 Cilium Gateway,Cilium 會為傳入/閘道資源建立 LoadBalancer 類型的 Kubernetes Service。Cilium 建立的服務屬性可以透過傳入和閘道資源進行設定。當您建立傳入或閘道資源時,傳入或閘道的外部公開 IP 位址或主機名稱會從負載平衡器基礎結構進行配置,並且通常由傳入或閘道控制器進行佈建。
許多傳入和閘道控制器會使用註釋來偵測和設定負載平衡器基礎結構。如上述範例所示,這些傳入和閘道控制器的註釋會在傳入或閘道資源上設定。如需其支援的註釋,請參閱傳入或閘道控制器的文件,而如需熱門控制器的清單,則請參閱 Kubernetes Ingress 文件
重要
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 位址管理
以下範例說明如何使用 IP 位址設定 Cilium 的 LB IPAM 以用於您的傳入/閘道資源,以及如何設定 Cilium BGP 控制平面以向內部部署網路公告 LoadBalancer IP 位址。根據預設,Cilium 的 LB IPAM 功能已啟用,但在建立 CiliumLoadBalancerIPPool 資源之前不會啟動。
先決條件
-
遵循 安裝 Cilium Ingress 或 安裝 Cilium Gateway 中的指示安裝 Cilium Ingress 或 Gateway。
-
遵循 部署 Cilium Ingress 或 部署 Cilium Gateway 中的指示,部署範例應用程式的 Cilium Ingress 或 Gateway 資源。
-
遵循 設定混合節點的 Cilium BGP 中的指示啟用 Cilium BGP 控制平面。如果您不想使用 BGP,則可以略過此先決條件,但在 Cilium LB IPAM 配置的 LoadBalancer IP 位址在內部部署網路上可路由之前,您將無法存取您的傳入或閘道資源。
程序
-
選擇性地修補傳入或閘道資源,以請求用於 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"}} }' -
使用
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 位址,請使用/32CIDR。如需詳細資訊,請參閱 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"
-
-
將
CiliumLoadBalancerIPPool資源套用至您的叢集。kubectl apply -f cilium-lbip-pool-ingress.yaml -
確認已從 Cilium LB IPAM 為傳入/閘道資源配置 IP 位址。
閘道
kubectl get gateway my-gatewayNAME CLASS ADDRESS PROGRAMMED AGE my-gateway ciliumLB_IP_ADDRESSTrue 6m41sIngress
kubectl get ingress my-ingressNAME CLASS HOSTS ADDRESS PORTS AGE my-ingress cilium *LB_IP_ADDRESS80 10m -
使用
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" -
將
CiliumBGPAdvertisement資源套用至您的叢集。kubectl apply -f cilium-bgp-advertisement-ingress.yaml -
使用從 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
先決條件
-
遵循 安裝 Cilium Ingress 中的指示安裝 Cilium Ingress。
-
遵循 部署 Cilium Ingress 中的指示,部署範例應用程式的 Cilium Ingress 資源。
程序
-
修補現有的傳入資源
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 -
確認傳入資源的服務已更新為使用服務類型 NodePort。請注意輸出中的 HTTP 通訊協定的連接埠。在以下範例中,此 HTTP 連接埠是
32353,且在後續步驟中,將用其來查詢服務。搭配 NodePort 類型的服務使用 Cilium Ingress 的優點是,對於 Ingress 流量,您可以套用路徑和以主機為基礎的路由以及相關網路政策,而對於沒有 Ingress 的標準 NodePort 類型的服務,您則無法如此操作。kubectl -n default get svc cilium-ingress-my-ingressNAME 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 -
獲取您叢集節點的 IP 位址。
kubectl get nodes -o wideNAME 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 -
使用節點的 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 代理在主機網路上執行的節點子集。
先決條件
-
遵循 安裝 Cilium Ingress 或 安裝 Cilium Gateway 中的指示安裝 Cilium Ingress 或 Gateway。
程序
閘道
-
建立名為
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 -
將主機網路 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]} -
獲取您叢集節點的 IP 位址。
kubectl get nodes -o wideNAME 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 -
使用節點的 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 問題 (#34028loadbalancerMode: shared,而這會為叢集中的所有傳入資源建立 ClusterIP 類型的單一服務。如果您為傳入資源使用了具有特殊權限的連接埠 (低於 1023),請參閱 Cilium 文件
-
建立名為
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 -
將主機網路 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]} -
獲取您叢集節點的 IP 位址。
kubectl get nodes -o wideNAME 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 -
使用節點的 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" }