設定混合節點的 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 CIDRs,如需詳細資訊,請參閱 可路由遠端 Pod CIDRs 設定混合節點的 CNI和 。

無法路由的 Pod 網路

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

混合模式叢集的考量事項

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

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

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

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

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

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

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

  • Metrics Server 附加元件需要從 EKS 控制平面連線至 Metrics Server Pod IP 地址。如果您在混合節點上執行 Metrics Server 附加元件,則您的內部部署 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

設定服務流量分佈

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

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

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

設定 CoreDNS 複本

執行混合模式叢集時,我們建議您在混合節點上至少有一個 CoreDNS 複本,以及在 AWS 雲端節點上至少有一個 CoreDNS 複本。

  1. 為每個混合節點新增拓撲區域標籤,例如 topology.kubernetes.io/zone: onprem。或者,您可以透過在nodeadm組態中指定標籤,在 nodeadm init階段設定標籤,請參閱 用於自訂 kubelet 的節點組態 (選用)。請注意,在 AWS Cloud 中執行的節點會自動取得套用至它們的拓撲區域標籤,其對應至節點的可用區域 (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 Cloud 中的節點上執行。

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 Cloud 中的節點執行運算子,請編輯 CloudWatch Observability Agent Operator 組態。您無法在使用 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

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

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

ADOT 附加元件需要cert-manager為 ADOT 運算子 Webhook 所使用的 TLS 憑證安裝 。 cert-manager也會執行 Webhook,而且您可以使用下列 Helm 值組態,將其設定為在 AWS Cloud 中的節點上執行。

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 Cloud 中的節點上執行。

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