

 **協助改進此頁面** 

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

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

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

# 設定混合節點的 Webhook
<a name="hybrid-nodes-webhooks"></a>

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

 **可路由的 Pod 網路** 

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

 **不可路由的 Pod 網路** 

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

## 混合模式叢集的考量事項
<a name="hybrid-nodes-considerations-mixed-mode"></a>

 *混合模式叢集*定義為具有混合節點和在 AWS 雲端中執行的節點的 EKS 叢集。執行混合模式叢集時，請考量下列建議：
+ 在 AWS 雲端的節點上執行 VPC CNI，並在混合節點上執行 Cilium 或 Calico。在 AWS 雲端中的節點上執行時，AWS 不支援 Cilium 和 Calico。
+ 設定 Webhook 以在 AWS 雲端中的節點上執行。如需如何為 AWS 和社群附加元件設定 Webhook，請參閱 [為附加元件設定 Webhook](#hybrid-nodes-webhooks-add-ons)。
+ 如果您的應用程式需要在 AWS 雲端中的節點上執行的 Pod 以便直接與在混合節點上執行的 Pod 通訊 (「東西通訊」)，並且您在 AWS 雲端中的節點上使用 VPC CNI，以及在混合節點上使用 Cilium 或 Calico，則您的內部部署 Pod CIDR 必須在內部部署網路上可路由。
+ 在 AWS 雲端中的節點上執行至少一個 CoreDNS 複本，並在混合節點上執行至少一個 CoreDNS 複本。
+ 設定服務流量分佈，以將服務流量保持在其來源區域的本機。如需有關服務流量分佈的詳細資訊，請參閱 [設定服務流量分佈](#hybrid-nodes-mixed-service-traffic-distribution)。
+ 如果您針對混合節點上執行的工作負載流量使用 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) 附加元件來收集混合節點的指標。

## 設定混合模式叢集
<a name="hybrid-nodes-mixed-mode"></a>

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

```
kubectl get mutatingwebhookconfigurations
```

```
kubectl get validatingwebhookconfigurations
```

### 設定服務流量分佈
<a name="hybrid-nodes-mixed-service-traffic-distribution"></a>

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

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

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

### 設定 CoreDNS 複本
<a name="hybrid-nodes-mixed-coredns"></a>

如果您執行具有混合節點和 AWS 雲端中的節點的混合模式叢集，則建議您在混合節點上至少有一個 CoreDNS 複本，並在 AWS 雲端中的節點上至少有一個 CoreDNS 複本。為了防止混合模式叢集設定中的延遲和網路問題，您可以將 CoreDNS 服務設定為偏好使用具有[服務流量分佈](https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution)的最接近的 CoreDNS 複本。

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

如果您使用 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 的節點組態 (選用)](hybrid-nodes-nodeadm.md#hybrid-nodes-nodeadm-kubelet)。請注意，在 AWS 雲端中執行的節點會自動取得套用至它們的拓撲區域標籤，而這些節點可對應至節點的可用區域 (AZ)。

   ```
   kubectl label node hybrid-node-name topology.kubernetes.io/zone=zone
   ```

1. 使用拓撲區域金鑰將 `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
         ...
   ```

1. 將設定 `trafficDistribution: PreferClose` 新增至 `kube-dns` 服務組態，以啟用服務流量分佈。

   ```
   kubectl patch svc kube-dns -n kube-system --type=merge -p '{
     "spec": {
       "trafficDistribution": "PreferClose"
     }
   }'
   ```

1. 您可以檢視 `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
<a name="hybrid-nodes-webhooks-add-ons"></a>

下列附加元件使用 Webhook 並支援與混合節點搭配使用。
+  AWS Load Balancer 控制器
+ CloudWatch 可觀測性代理程式
+  AWS Distro for OpenTelemetry (ADOT)
+  `cert-manager` 

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

#### AWS Load Balancer 控制器
<a name="hybrid-nodes-mixed-lbc"></a>

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

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

#### CloudWatch 可觀測性代理程式
<a name="hybrid-nodes-mixed-cwagent"></a>

CloudWatch 可觀測性代理程式附加元件具有使用 Webhook 的 Kubernetes Operator。若要在混合模式叢集設定中對 AWS 雲端中的節點執行運算子，請編輯 CloudWatch 可觀測性代理程式運算子組態。您無法在安裝過程中使用 Helm 和 EKS 附加元件設定運算子親和性 (請參閱 [Container-roadmap 問題 \$12431](https://github.com/aws/containers-roadmap/issues/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)
<a name="hybrid-nodes-mixed-adot"></a>

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

#### `cert-manager`
<a name="hybrid-nodes-mixed-cert-manager"></a>

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