サービスに割り当てることができる外部 IP アドレスを制限する - Amazon EKS

サービスに割り当てることができる外部 IP アドレスを制限する

Kubernetes サービスには、クラスターの内部から次を経由することで到達できます。

  • Kubernetes によって自動的に割り当てられるクラスター IP アドレス

  • サービス仕様で externalIPs プロパティに指定した任意の IP アドレス 外部IPアドレスは Kubernetes によって管理されておらず、クラスター管理者の責任です。externalIPs で指定される外部 IP アドレスは、クラウドプロバイダーによって提供される LoadBalancer タイプのサービスに割り当てられる外部 IP アドレスとは異なります。

Kubernetes サービスの詳細については、「Kubernetes ドキュメント」の「サービス」を参照してください。サービス仕様で externalIPs に指定できる IP アドレスを制限できます。

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

    kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
  2. cert-manager Pods が実行中であることを確認します。

    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
  3. 既存のサービスを確認して、アドレスを制限する 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 アドレスが割り当てられています。

  4. 外部 IP のウェブフックマニフェストをダウンロードします。また、GitHub で ウェブフックのソースコード を確認できます。

    curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/docs/externalip-webhook.yaml
  5. CIDR ブロックを指定します。ダウンロードしたファイルをエディタで開き、次の行の最初の \# を削除します。

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

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

  6. クラスターが us-west-2 AWS に存在しない場合、ファイル内の us-west-2602401143452、および amazonaws.com を次のコマンドに置き換えます。コマンドを実行する前に、region-code および 111122223333 を「Amazon EKS アドオンの Amazon コンテナイメージレジストリを表示する」のリストから 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
  7. マニフェストをクラスターに適用します。

    kubectl apply -f externalip-webhook.yaml

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