設定混合節點的 Webhook - Amazon EKS

協助改進此頁面

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

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

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

設定混合節點的 Webhook

此頁面詳細說明使用混合節點執行 Webhook 的考量事項。Webhook 可用於 Kubernetes 應用程式和開放原始碼專案,例如 AWS Load Balancer 控制器和 CloudWatch 可觀測性代理程式,以在執行時期執行變更和驗證功能。

可路由的 Pod 網路

如果您能夠在內部部署網路上讓內部部署 Pod CIDR 可路由,則可在混合節點上執行 Webhook。您可以使用多種技術,讓您的內部部署 Pod CIDR 在內部部署網路上可路由,包括邊界閘道協定 (BGP)、靜態路由或其他自訂路由解決方案。BGP 是建議的解決方案,因為它比需要自訂或手動路由組態的替代解決方案更具可擴展性且更容易管理。AWS 支援 Cilium 和 Calico 的 BGP 功能,可用於公告 Pod CIDR,如需詳細資訊,請參閱 設定混合節點的 CNI可路由的遠端 Pod CIDR

不可路由的 Pod 網路

如果您無法在使內部部署 Pod CIDR 在內部部署網路上可路由並且需要執行 Webhook,則建議您在與混合節點相同的 EKS 叢集中的雲端節點上,執行所有 Webhook。

混合模式叢集的考量事項

混合模式叢集定義為具有混合節點和在 AWS 雲端中執行的節點的 EKS 叢集。執行混合模式叢集時,請考量下列建議:

  • 在 AWS 雲端的節點上執行 VPC CNI,並在混合節點上執行 Cilium 或 Calico。在 AWS 雲端中的節點上執行時,AWS 不支援 Cilium 和 Calico。

  • 設定 Webhook 以在 AWS 雲端中的節點上執行。如需如何為 AWS 和社群附加元件設定 Webhook,請參閱 為附加元件設定 Webhook

  • 如果您的應用程式需要在 AWS 雲端中的節點上執行的 Pod 以便直接與在混合節點上執行的 Pod 通訊 (「東西通訊」),並且您在 AWS 雲端中的節點上使用 VPC CNI,以及在混合節點上使用 Cilium 或 Calico,則您的內部部署 Pod CIDR 必須在內部部署網路上可路由。

  • 在 AWS 雲端中的節點上執行至少一個 CoreDNS 複本,並在混合節點上執行至少一個 CoreDNS 複本。

  • 設定服務流量分佈,以將服務流量保持在其來源區域的本機。如需有關服務流量分佈的詳細資訊,請參閱 設定服務流量分佈

  • 如果您針對混合節點上執行的工作負載流量使用 AWS Application Load Balancers (ALB) 或 Network Load Balancer (NLB),則搭配 ALB 或 NLB 使用的 IP 目標必須可從 AWS 路由。

  • 指標伺服器附加元件需要從 EKS 控制平面連線至指標伺服器 Pod IP 位址。如果您在混合節點上執行指標伺服器附加元件,則您的內部部署 Pod CIDR 必須在內部部署網路上可路由。

  • 若要使用 Amazon Managed Service for Prometheus (AMP) 受管收集器收集混合節點的指標,您的內部部署 Pod CIDR 必須在內部部署網路上可路由。或者,您可以將 AMP 受管收集器用於在 AWS 雲端中執行的 EKS 控制平面指標和資源,並且使用 AWS Distro for OpenTelemetry (ADOT) 附加元件來收集混合節點的指標。

設定混合模式叢集

若要檢視叢集上執行的變更和驗證 Webhook,您可以在叢集的 EKS 主控台的資源面板中檢視延伸模組模源類型,或者也可以使用下列命令。EKS 還會在叢集可觀測性儀表板中報告 Webhook 指標,如需詳細資訊,請參閱 使用可觀測性儀表板監控您的叢集

kubectl get mutatingwebhookconfigurations
kubectl get validatingwebhookconfigurations

設定服務流量分佈

執行混合模式叢集時,建議您使用服務流量分佈,以將服務流量保持在其來源區域的本機。服務流量分佈 (適用於 EKS 中的 Kubernetes 版本 1.31 及更新版本) 是拓撲感知路由的建議解決方案,因為其可預測性更高。透過服務流量分佈,區域中運作狀態良好的端點將會接收該區域的所有流量。利用拓撲感知路由,每個服務都必須符合該區域中的數個條件,以套用自訂路由,否則其會將流量平均路由至所有端點。

如果您使用 Cilium 作為 CNI,則必須執行 CNI,並將 enable-service-topology 設定為 true 以啟用服務流量分佈。您可以使用 Helm 安裝旗標 --set loadBalancer.serviceTopology=true 傳遞此組態,或者,您也可以使用 Cilium CLI 命令 cilium config set enable-service-topology true 更新現有的安裝。更新現有安裝的組態後,必須重新啟動在每個節點上執行的 Cilium 代理程式。

下節會顯示如何為 CoreDNS 服務設定服務流量分佈的範例,並且建議您為叢集中的所有服務啟用相同的服務流量分佈,以避免意外的跨環境流量。

設定 CoreDNS 複本

如果您執行具有混合節點和 AWS 雲端中的節點的混合模式叢集,則建議您在混合節點上至少有一個 CoreDNS 複本,並在 AWS 雲端中的節點上至少有一個 CoreDNS 複本。為了防止混合模式叢集設定中的延遲和網路問題,您可以將 CoreDNS 服務設定為偏好使用具有服務流量分佈的最接近的 CoreDNS 複本。

服務流量分佈 (適用於 EKS 中的 Kubernetes 版本 1.31 及更新版本) 是拓撲感知路由的建議解決方案,因為其可預測性更高。在服務流量分佈中,區域中運作狀態良好的端點將會接收該區域的所有流量。在拓撲感知路由中,每個服務都必須符合該區域中的數個條件,以套用自訂路由,否則其會將流量平均路由至所有端點。下列步驟可設定服務流量分佈。

如果您使用 Cilium 作為 CNI,則必須執行 CNI,並將 enable-service-topology 設定為 true 以啟用服務流量分佈。您可以使用 Helm 安裝旗標 --set loadBalancer.serviceTopology=true 傳遞此組態,或者,您也可以使用 Cilium CLI 命令 cilium config set enable-service-topology true 更新現有的安裝。更新現有安裝的組態後,必須重新啟動在每個節點上執行的 Cilium 代理程式。

  1. 為每個混合節點新增一個拓撲區域標籤,例如 topology.kubernetes.io/zone: onprem。或者,您可以在 nodeadm 組態中指定標籤,進而在 nodeadm init 階段設定標籤,請參閱 用於自訂 kubelet 的節點組態 (選用)。請注意,在 AWS 雲端中執行的節點會自動取得套用至它們的拓撲區域標籤,而這些節點可對應至節點的可用區域 (AZ)。

    kubectl label node hybrid-node-name topology.kubernetes.io/zone=zone
  2. 使用拓撲區域金鑰將 podAntiAffinity 新增至 CoreDNS 部署。或者,您可以在安裝過程中使用 EKS 附加元件設定 CoreDNS 部署。

    kubectl edit deployment coredns -n kube-system
    spec: template: spec: affinity: ... podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: matchExpressions: - key: k8s-app operator: In values: - kube-dns topologyKey: kubernetes.io/hostname weight: 100 - podAffinityTerm: labelSelector: matchExpressions: - key: k8s-app operator: In values: - kube-dns topologyKey: topology.kubernetes.io/zone weight: 50 ...
  3. 將設定 trafficDistribution: PreferClose 新增至 kube-dns 服務組態,以啟用服務流量分佈。

    kubectl patch svc kube-dns -n kube-system --type=merge -p '{ "spec": { "trafficDistribution": "PreferClose" } }'
  4. 您可以檢視 kube-dns 服務的端點配量,進而確認已啟用服務流量分佈。您的端點配量必須顯示拓撲區域標籤的 hints,進而確認已啟用服務流量分佈。如果您沒有看到每個端點地址的 hints,則不會啟用服務流量分佈。

    kubectl get endpointslice -A | grep "kube-dns"
    kubectl get endpointslice [.replaceable]`kube-dns-<id>` -n kube-system -o yaml
    addressType: IPv4 apiVersion: discovery.k8s.io/v1 endpoints: - addresses: - <your-hybrid-node-pod-ip> hints: forZones: - name: onprem nodeName: <your-hybrid-node-name> zone: onprem - addresses: - <your-cloud-node-pod-ip> hints: forZones: - name: us-west-2a nodeName: <your-cloud-node-name> zone: us-west-2a

為附加元件設定 Webhook

下列附加元件使用 Webhook 並支援與混合節點搭配使用。

  • AWS Load Balancer 控制器

  • CloudWatch 可觀測性代理程式

  • AWS Distro for OpenTelemetry (ADOT)

  • cert-manager

請參閱下列各節,以了解如何設定這些附加元件所使用的 Webhook,以便在 AWS 雲端中的節點上執行。

AWS Load Balancer 控制器

若要在混合模式叢集設定中使用 AWS Load Balancer 控制器,您必須在 AWS 雲端中的節點上執行控制器。為此,請將下列內容新增至 Helm 值組態,或使用 EKS 附加元件組態指定值。

affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid

CloudWatch 可觀測性代理程式

CloudWatch 可觀測性代理程式附加元件具有使用 Webhook 的 Kubernetes Operator。若要在混合模式叢集設定中對 AWS 雲端中的節點執行運算子,請編輯 CloudWatch 可觀測性代理程式運算子組態。您無法在安裝過程中使用 Helm 和 EKS 附加元件設定運算子親和性 (請參閱 Container-roadmap 問題 #2431)。

kubectl edit -n amazon-cloudwatch deployment amazon-cloudwatch-observability-controller-manager
spec: ... template: ... spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid

AWS Distro for OpenTelemetry (ADOT)

AWS Distro for OpenTelemetry (ADOT) 附加元件具有使用 Webhook 的 Kubernetes Operator。若要在混合模式叢集設定中對 AWS 雲端中的節點執行運算子,請將下列項目新增至 Helm 值組態,或使用 EKS 附加元件組態指定值。

affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid

如果您的 Pod CIDR 在內部部署網路上不可路由,則 ADOT 收集器必須在混合節點上執行,以從混合節點和在其上執行的工作負載中抓取指標。為此,請編輯自訂資源定義 (CRD)。

kubectl -n opentelemetry-operator-system edit opentelemetrycollectors.opentelemetry.io adot-col-prom-metrics
spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: In values: - hybrid

您可以將下列 relabel_configs 新增至 ADOT 收集器 CRD 組態中的每個 scrape_configs,從而將 ADOT 收集器設定為僅從混合節點和混合節點上執行的資源抓取指標。

relabel_configs: - action: keep regex: hybrid source_labels: - __meta_kubernetes_node_label_eks_amazonaws_com_compute_type

ADOT 附加元件具有一個先決條件要求,即為 ADOT 運算子 Webhook 所使用的 TLS 憑證安裝 cert-managercert-manager 也會執行 Webhook,而且您可以使用下列 Helm 值組態,將其設定為在 AWS 雲端中的節點上執行。

affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid webhook: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid cainjector: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid startupapicheck: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid

cert-manager

cert-manager 附加元件會執行 Webhook,並且您可以使用下列 Helm 值組態,將其設定為在 AWS 雲端中的節點上執行。

affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid webhook: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid cainjector: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid startupapicheck: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - hybrid