

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

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

# サービスに割り当てることができる外部IPアドレスを制限する
<a name="restrict-service-external-ip"></a>

Kubernetes サービスには、クラスターの内部から次を経由することで到達できます。
+ Kubernetes によって自動的に割り当てられるクラスター IP アドレス
+ サービス仕様で `externalIPs` プロパティに指定した任意の IP アドレス 外部 IP アドレスは Kubernetes によって管理されるのではなく、クラスターの管理者が管理します。`externalIPs` で指定される外部 IP アドレスは、クラウドプロバイダーによって提供される `LoadBalancer` タイプのサービスに割り当てられる外部 IP アドレスとは異なります。

Kubernetes サービスの詳細については、Kubernetes ドキュメントの「[サービス](https://kubernetes.io/docs/concepts/services-networking/service/)」を参照してください。サービス仕様で `externalIPs` に指定できる IP アドレスを制限できます。

1. webhook の証明書を管理するには`cert-manager` をデプロイします。詳細については「[cert-manager](https://cert-manager.io/docs/)」(証明書マネージャー) ドキュメントを参照してください。

   ```
   kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
   ```

1. `cert-manager` Pod が実行中であることを確認します。

   ```
   kubectl get pods -n cert-manager
   ```

   出力例は次のとおりです。

   ```
   NAME                                       READY   STATUS    RESTARTS   AGE
   cert-manager-58c8844bb8-nlx7q              1/1     Running   0          15s
   cert-manager-cainjector-745768f6ff-696h5   1/1     Running   0          15s
   cert-manager-webhook-67cc76975b-4v4nk      1/1     Running   0          14s
   ```

1. 既存のサービスを確認して、アドレスを制限する CIDR ブロックに含まれない外部 IP アドレスが割り当てられていないことを確認します。

   ```
   kubectl get services -A
   ```

   出力例は次のとおりです。

   ```
   NAMESPACE                      NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)         AGE
   cert-manager                   cert-manager                            ClusterIP      10.100.102.137   <none>          9402/TCP        20m
   cert-manager                   cert-manager-webhook                    ClusterIP      10.100.6.136     <none>          443/TCP         20m
   default                        kubernetes                              ClusterIP      10.100.0.1       <none>          443/TCP         2d1h
   externalip-validation-system   externalip-validation-webhook-service   ClusterIP      10.100.234.179   <none>          443/TCP         16s
   kube-system                    kube-dns                                ClusterIP      10.100.0.10      <none>          53/UDP,53/TCP   2d1h
   my-namespace                   my-service                              ClusterIP      10.100.128.10    192.168.1.1     80/TCP          149m
   ```

   いずれかの値が、アクセスを制限するブロック内にない IP アドレスである場合はブロック内に存在するアドレスを変更し、サービスを再びデプロイする必要があります。例えば、前の出力の `my-service` サービスにはステップ 5 の CIDR ブロックの例に含まれていない外部 IP アドレスが割り当てられています。

1. 外部 IP のウェブフックマニフェストをダウンロードします。また、GitHub で[ウェブフックのソースコード](https://github.com/kubernetes-sigs/externalip-webhook)を確認できます。

   ```
   curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/docs/externalip-webhook.yaml
   ```

1. CIDR ブロックを指定します。ダウンロードしたファイルをエディタで開き、次の行の最初の `\#` を削除します。

   ```
   #args:
   #- --allowed-external-ip-cidrs=10.0.0.0/8
   ```

   `10.0.0.0/8` を独自の CIDR ブロックに置き換えます。ブロックはいくつでも指定できます。複数のブロックを指定する場合はブロック間にコンマを追加します。

1. クラスターが `us-west-2` AWS に存在しない場合、ファイル内の `us-west-2`、`602401143452`、および `amazonaws.com` を次のコマンドに置き換えます。コマンドを実行する前に、*地域コード* および *111122223333* を「[Amazon EKS アドオンの Amazon コンテナイメージレジストリを表示する](add-ons-images.md)」のリストから AWS リージョンの値に置き換えます。

   ```
   sed -i.bak -e 's|602401143452|111122223333|' externalip-webhook.yaml
   sed -i.bak -e 's|us-west-2|region-code|' externalip-webhook.yaml
   sed -i.bak -e 's|amazonaws.com||' externalip-webhook.yaml
   ```

1. マニフェストをクラスターに適用します。

   ```
   kubectl apply -f externalip-webhook.yaml
   ```

   「CIDR ブロックを指定します」のステップで指定したブロックに含まれていない、`externalIPs` に指定された IP アドレスを使用して、サービスをクラスターにデプロイしようとすると、失敗します。