Amazon Elastic Kubernetes Service (Amazon EKS) の LoadBalancer タイプのサービスの CIDR IP アドレスを制限したいと考えています。
簡単な説明
LoadBalancer タイプのサービスを作成すると、ソース 0.0.0.0/0 からのリクエストがデフォルトで許可されます。ロードバランサーがパブリックサブネットにある場合、リクエストはインターネット上のどこからでもワーカーノードにルーティングされます。
ソースを制限するには、0.0.0.0/0 の代わりに loadBalancerSourceRanges を使用してください。
解決策
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
環境を設定する
環境を設定するには、次の手順を実行します。
- Amazon EKS クラスターを作成します。
- ワーカーノードを作成して起動します。
- kubectl をセットアップします。
- AWS CLI をセットアップします。
- AWS Load Balancer Controller のテストを行います。
**注:**LoadBalancer タイプのサービスの場合、AWS ロードバランサーコントローラーは Network Load Balancer (NLB) IP モードバージョン 2.0.0 以降と NLB インスタンスモード 2.2.0 以降をサポートします。
**重要:**LoadBalancer タイプのサービスに新しいネットワークロードバランサーを割り当てるには、Kubernetes Service ロードバランサーコントローラーの代わりに AWS ロードバランサーコントローラーを使用するのがベストプラクティスです。AWS バランサーコントローラーの最新バージョンについては、GitHub ウェブサイトの「aws-load-balancer-controller」を参照してください。
CIDR IP アドレスを制限する
loadBalancerSourceRangeを指定するには、次のいずれかの方法を選択します。
注釈を使う
サービスマニフェストファイル (svc.yaml) で注釈を使用します。
注釈の例:
service.beta.kubernetes.io/load-balancer-source-ranges: 143.231.0.0/16
詳細については、Kubernetes Web サイトの「アクセス制御」を参照してください。
loadBalancerSourceRanges フィールドを追加する
-
.spec.loadbalancerSourceRanges フィールドを svc.yaml ファイルに追加します。
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance"
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerSourceRanges:
- "143.231.0.0/16"
-
次のコマンドを実行して svc.yaml ファイルを適用します。
$ kubectl apply -f svc.yaml
次のコマンドを実行して、AWS Load Balancer Controller のポッドログを確認します。
$ kubectl logs -f <aws load balancer controller pod> -n <namespace>
-
AWS Load Balancer Controller は、設定したロードバランサーソース範囲をセキュリティグループのインバウンドルールに追加します。次のコマンドを実行して、セキュリティグループのインバウンドルールが変更されていることを確認します。
$ aws ec2 describe-security-groups --group-ids sg-XXXXXXXXXXXXXXXXX
...
"CidrIp": "143.231.0.0/16"
...
-
ネットワークロードバランサーを IP モードで使用する場合、.spec.LoadBalancerSourceRanges フィールドはデフォルトで無視されます。この場合、次の注釈を使用してクライアントの IP 保存を有効にしてください。
service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true
Network Load Balancer タイプのサービスの場合、セキュリティグループの最大制限を増やすことをお勧めします。各ノードポートとサブネットの CIDR 範囲について、コントローラーはワーカーノードのセキュリティグループにルールを作成します。詳細については、Kubernetes ウェブサイトの「Ingress traffic」を参照してください。
**注:**Network Load Balancer タイプのサービスの場合は、セキュリティグループの最大クォータを増やすことをお勧めします。各ノードポートとサブネットの CIDR 範囲について、コントローラーはワーカーノードのセキュリティグループにルールを作成します。たとえば、3 つのアベイラビリティーゾーンにワーカーノードがあるとします。loadBalancerSourceRange を追加します。ワーカーノードセキュリティグループには、3 つのヘルスチェックルール (サブネットごとに 1 つ) と 1 つの LoadBalancerSourceRange ルールが作成されます。セキュリティグループのデフォルトのルール制限は 60 個です。このクォータを増やすことはできますが、ネットワークインターフェイスあたりのセキュリティグループの総数は 1,000 を超えることはできません。
関連情報
ユーザーにクラスターへのアクセスを許可する