Amazon Elastic Kubernetes Service (Amazon EKS) で LoadBalancer タイプのサービスの CIDR IP アドレスを制限したいと考えています。
簡単な説明
type:LoadBalancer のサービスを作成すると、ソース 0.0.0.0/0 からのリクエストがデフォルトで許可されます。ロードバランサーがパブリックサブネットにある場合、リクエストはインターネット上のどこからでもワーカーノードにルーティングされます。
解決方法
注意: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
環境の設定
1. Amazon EKS クラスターを作成します。
2. ワーカーノードを作成して起動します。
3. kubectl をセットアップします。
4. AWS CLI をセットアップします。
5. AWS Load Balancer Controller をセットアップします。
**注意:**AWS ロードバランサーコントローラーは、タイプ LoadBalancer の AWS ネットワークロードバランサーの次のバージョンをサポートしています。NLB IP モード (バージョン 2.0.0 以上) と NLB インスタンスモード (2.2.0 以上)
**重要:**LoadBalancer タイプのサービス用に新しいネットワークロードバランサーをプロビジョニングする場合は、AWS ロードバランサーコントローラーを使用することをお勧めします。Kubernetes インツリーサービスロードバランサーコントローラの代わりに AWS ロードバランサーコントローラーを使用します。
CIDR IP アドレスの制限
1. サービスマニフェストファイル (svc.yaml) で、.spec.loadBalancerSourceRanges フィールドを追加します。以下はその例です。
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"
2. マニフェストファイルを適用するには、次のコマンドを実行します。
$ kubectl apply -f svc.yaml
3. セキュリティグループのインバウンドルールが変更されたことを確認するには、次の AWS CLI コマンドを実行します。
$ aws ec2 describe-security-groups --group-ids sg-XXXXXXXXXXXXXXXXX
...
"CidrIp": "143.231.0.0/16"
...
最後に、以下の点を考慮してください。
NLB IP モードを使用する場合、 .spec.loadbalancersSourceRanges フィールドはデフォルトで無視されています。この場合、次の注釈を使用します。
service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true
この注釈は、クライアント IP の保存を有効にします。
Network Load Balancer タイプを使用するサービスでは、セキュリティグループの最大制限に注意してください。各ノードポートとサブネット CIDR 範囲について、コントローラはワーカーノードのセキュリティグループにルールを作成します。
関連情報
クラスター認証
Kubernetes サービス