

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# ハイブリッドノード用のウェブフックを設定する
<a name="hybrid-nodes-webhooks"></a>

このページでは、ハイブリッドノードでウェブフックを実行する場合の考慮事項について詳しく説明します。ウェブフックは、AWS Load Balancer Controller や CloudWatch Observability エージェントといった Kubernetes アプリケーションとオープンソースプロジェクトで実行時にミューテーション機能と検証機能を利用する目的で使用されます。

 **ルーティング可能なポッドネットワーク** 

オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にできる場合、ハイブリッドノードでウェブフックを実行できます。オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にするために使用できる手法がいくつかあります。具体的には、ボーダーゲートウェイプロトコル (BGP)、静的ルート、その他のカスタムルーティングソリューションなどです。BGP はカスタムまたは手動でルート設定する必要がある代替ソリューションよりもスケーラブルで管理しやすいため、推奨されるソリューションです。AWS は、ポッド CIDR をアドバタイズするための Cilium と Calico の BGP 機能をサポートしています。詳細については、「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」および「[ルーティング可能なリモートポッド CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)」を参照してください。

 **ルーティング不可能なポッドネットワーク** 

オンプレミスポッド CIDR をオンプレミスネットワークでルーティング可能にすることが*できず*、ウェブフックを実行する必要がある場合、すべてのウェブフックをハイブリッドノードと同じ EKS クラスターのクラウドノードで実行することが推奨されます。

## 混合モードクラスターの考慮事項
<a name="hybrid-nodes-considerations-mixed-mode"></a>

 *混合モードクラスター*は、ハイブリッドノードと AWS クラウドで実行中のノードの両方を備えた EKS クラスターであると定義されています。混合モードクラスターを実行する場合は、以下の推奨事項を検討してください。
+ AWS Cloud 内のノードでは VPC CNI を実行し、ハイブリッドノードでは Cilium または Calico を実行します。AWS では、AWS Cloud 内のノードで Cilium と Calico を実行する操作はサポートされていません。
+ AWS Cloud 内のノードで動作するようにウェブフックを設定します。AWS およびコミュニティアドオンのウェブフックを設定する方法については、「[アドオン用のウェブフックを設定する](#hybrid-nodes-webhooks-add-ons)」を参照してください。
+ アプリケーションの要件により AWS Cloud 内のノードで実行中のポッドがハイブリッドノードで実行中のポッドと直接通信 (「東西通信」) しなければならず、かつ AWS Cloud 内のノードでは VPC CNI が使用され、ハイブリッドノードでは Cilium または Calico が使用されている場合は、オンプレミスネットワークでオンプレミスポッド CIDR がルーティング可能である必要があります。
+ AWS クラウドのノードで少なくとも 1 つの CoreDNS レプリカを実行し、ハイブリッドノードで少なくとも 1 つの CoreDNS レプリカを実行してください。
+ サービストラフィック分散を設定し、Service トラフィックを発信元のゾーン内に留めます。サービストラフィック分散の詳細については、「[サービストラフィック分散の設定](#hybrid-nodes-mixed-service-traffic-distribution)」を参照してください。
+ ハイブリッドノードで実行されているワークロードトラフィックに AWS Application Load Balancer (ALB) または Network Load Balancer (NLB) を使用している場合、ALB または NLB と使用されている IP ターゲットを AWS からルーティング可能である必要があります。
+ Metrics Server アドオンでは、EKS コントロールプレーンから Metrics Server ポッド IP アドレスへの接続が必要になります。ハイブリッドノードで Metrics Server アドオンを実行している場合は、オンプレミスネットワークでオンプレミスポッド CIDR をルーティングできる必要があります。
+ Amazon Managed Service for Prometheus (AMP) マネージドコレクターを使用してハイブリッドノードに関するメトリクスを収集するには、オンプレミスネットワークでオンプレミスポッド CIDR をルーティングできる必要があります。または、EKS コントロールプレーンメトリクスおよび AWS クラウドで実行されているリソースに AMP マネージドコレクターを使用し、AWS Distro for OpenTelemetry (ADOT) アドオンを使用してハイブリッドノードのメトリクスを収集することもできます。

## 混合モードクラスターの設定
<a name="hybrid-nodes-mixed-mode"></a>

クラスターで実行中のミューテーション用と検証用のウェブフックを表示するには、クラスターの EKS コンソールの **[リソース]** パネルで **[拡張機能]** リソースタイプを表示するか、以下のコマンドを使用します。EKS は、クラスターオブザーバビリティダッシュボードにウェブフックメトリクスもレポートします。詳細については、「[オブザーバビリティダッシュボードを使用してクラスターをモニタリングする](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 以降で利用可能) は、[Topology Aware Routing](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/) よりも予測性に優れているため、推奨されるソリューションです。サービストラフィック分散を使用すると、ゾーン内の正常なエンドポイントはそのゾーンのすべてのトラフィックが受信されます。Topology Aware Routing を使用すると、カスタムルーティングを適用するために各サービスはそのゾーンの複数の条件を満たす必要があります。そうでない場合、トラフィックはすべてのエンドポイントに均等にルーティングされます。

Cilium を CNI として使用している場合は、`enable-service-topology` を `true` に設定して CNI を実行し、Service Traffic Distribution を有効にする必要があります。この設定は 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 クラウド内のノードの両方を備える混合モードのクラスターを実行している場合は、ハイブリッドノードと AWS クラウド内のノードのそれぞれに CoreDNS レプリカを 1 つ以上作成しておくことが推奨されます。混合モードクラスターの設定でレイテンシーとネットワークの問題を回避するには、[Service Traffic Distribution](https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution) を使って最も近くにある CoreDNS レプリカを優先するように CoreDNS サービスを設定します。

 *Service Traffic Distribution* (EKS で Kubernetes バージョン 1.31 以降で使用可能) は、[Topology Aware Routing](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/) よりも予測性に優れているため、推奨される方法です。Service Traffic Distribution では、ゾーン内の正常なエンドポイントは、そのゾーンのすべてのトラフィックを受信します。Topology Aware Routing の場合、カスタムルーティングを適用するには各サービスがそのゾーンの複数の条件を満たしている必要があります。満たしていない場合、トラフィックはすべてのエンドポイントに均等にルーティングされます。以下のステップで、Service Traffic Distribution を設定していきます。

Cilium を CNI として使用している場合は、`enable-service-topology` を `true` に設定して CNI を実行し、Service Traffic Distribution を有効にする必要があります。この設定は 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 Cloud で実行されているノードは、自身のアベイラビリティーゾーン (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` サービスのエンドポイントスライスを表示することで、Service Traffic Distribution が有効になっていることを確認できます。エンドポイントスライスにはトポロジーゾーンのラベルの `hints` が表示されているはずです。これで、Service Traffic Distribution が有効になっていることが確認できます。各エンドポイントアドレスの `hints` が表示されなければ、Service Traffic Distribution は有効になっていません。

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

### アドオン用のウェブフックを設定する
<a name="hybrid-nodes-webhooks-add-ons"></a>

以下のアドオンは、ウェブフックを使用しており、ハイブリッドノードでの使用がサポートされています。
+  AWS ロードバランサーコントローラー
+ Amazon CloudWatch オベサビリティ エージェント
+  AWS オープンテレメトリー用ディストリビューター (ADOT)
+  `cert-manager` 

これらのアドオンで使用されるウェブフックを AWS クラウド内のノードで実行するように設定する方法については、以下のセクションを参照してください。

#### AWS ロードバランサーコントローラー
<a name="hybrid-nodes-mixed-lbc"></a>

AWS Load Balancer Controller を混合モードクラスターの設定で使用するには、このコントローラーを AWS クラウドのノードで実行する必要があります。それには、Helm 値の設定に以下を追加するか、EKS アドオン設定を使用して値を指定します。

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

#### Amazon CloudWatch オベサビリティ エージェント
<a name="hybrid-nodes-mixed-cwagent"></a>

CloudWatch Observability Agent アドオンには、ウェブフックを使用する Kubernetes Operator があります。混合モードクラスター設定の AWS Cloud 内のノードでオペレーターを実行するには、CloudWatch Observability エージェントオペレーター設定を編集します。インストール時に Helm と EKS アドオンを使用してオペレーターアフィニティを設定することはできません (「[containers-roadmap issue \#2431](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 オープンテレメトリー用ディストリビューター (ADOT)
<a name="hybrid-nodes-mixed-adot"></a>

AWS Distro for OpenTelemetry (ADOT) アドオンには、ウェブフックを使用する Kubernetes Operator があります。混合モードクラスター設定の AWS クラウド内のノードでオペレーターを実行するには、Helm 値設定に以下を追加するか、EKS アドオン設定を使用して値を指定します。

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

ポッド 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 アドオンには、ADOT オペレーターウェブフックで使用される TLS 証明書に `cert-manager` をインストールするための前提条件があります。`cert-manager` はウェブフックも実行し、次の 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` アドオンは、ウェブフックを実行し、以下の 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
```