厳格な権限要件を持つクラウド環境では、きめ細かなアクセス制御を実現するために、Pod の IP アドレスを指定された ApsaraDB RDS ホワイトリストに動的に追加または削除する必要がある場合があります。ack-kubernetes-webhook-injector コンポーネントを使用して Pod にアノテーションを追加することで、指定された ApsaraDB RDS ホワイトリストに Pod の IP アドレスを動的に追加または削除できます。このトピックでは、ack-kubernetes-webhook-injector をインストールして使用し、Alibaba Cloud サービスのホワイトリストを動的に設定する方法、およびそれらの内部エンドポイントへのアクセスを設定する方法について説明します。
前提条件
-
クラスターが Terway ネットワークプラグインを使用していること。詳細については、「Terway ネットワークプラグインの使用」をご参照ください。
概要
クラウドコンピューティングでは、一部のリソースは外部ソースからアクセスされる前にセキュリティポリシーを必要とします。たとえば、インスタンスには Server Load Balancer (SLB) のアクセス制御ポリシーが必要な場合や、ApsaraDB RDS データベースにはクライアントソース IP アドレスのホワイトリストが必要な場合があります。ACK クラスターの作成時にクラスターノードの IP アドレス範囲を指定された ApsaraDB RDS ホワイトリストに追加することは可能ですが、このアプローチには以下の欠点があります。
-
ホワイトリストのルールが粗すぎる。ホワイトリストに登録された IP CIDR ブロックは、クラスター内のすべてのノードと Pod の IP アドレスをカバーしてしまいます。
-
クラスターが削除された後、ホワイトリストのルールを手動でクリーンアップする必要があります。
これらの問題に対処するため、ACK は ack-kubernetes-webhook-injector を提供しています。このコンポーネントは、指定された Pod の作成時にその IP アドレスを ApsaraDB RDS ホワイトリストに動的に追加し、Pod の削除時にその IP アドレスを削除します。これにより、セキュリティポリシーのきめ細かな制御が可能になります。
現在、ack-kubernetes-webhook-injector は以下の機能をサポートしています。
-
Pod の作成および削除に伴い、指定された SLB アクセス制御ポリシーグループに Pod の IP アドレスを自動的に追加および削除します。
-
Pod の作成および削除に伴い、指定された ApsaraDB for Redis ホワイトリストに Pod の IP アドレスを自動的に追加および削除します。
-
Pod の作成および削除に伴い、指定された ApsaraDB RDS ホワイトリストに Pod の IP アドレスを自動的に追加および削除します。
ack-kubernetes-webhook-injector のインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、 をクリックします。
-
ack-kubernetes-webhook-injector を見つけてクリックし、右上隅の デプロイ をクリックします。
-
表示されたパネルで、対象のクラスターと 名前空間 を選択し、リリース名 を設定してから 次 をクリックします。
-
Chart バージョン を選択します。値 ページで、
openapiセクションの下にあるakとskフィールドにご利用の AccessKey 情報を入力し、ページ下部の OK をクリックします。AccessKey ペアの取得方法の詳細については、「AccessKey ペアの取得」をご参照ください。
openapi: # テスト専用です。本番環境では ak/sk 認証を使用しないでください。 use_aksk: true ak: sk:
例:Pod IP の RDS ホワイトリストへの動的追加
ご利用のワークロードの Pod 仕様で、アノテーションを使用して、Pod が参加する必要のある ApsaraDB RDS インスタンス ID とホワイトリストグループの名前を指定できます。Pod が作成されると、ack-kubernetes-webhook-injector は Pod の IP アドレスをホワイトリストに追加します。Pod が削除されると、コンポーネントはその IP アドレスを削除します。
ApsaraDB RDS ホワイトリストの Pod アノテーションには、以下を含める必要があります。
-
ApsaraDB RDS インスタンス ID:
ack.aliyun.com/rds_id -
ApsaraDB RDS ホワイトリストグループ名:
ack.aliyun.com/white_list_name
このセクションでは、ack-kubernetes-webhook-injector を使用して Pod を ApsaraDB RDS ホワイトリストに動的に追加する方法を示します。
-
以下の YAML テンプレートを使用して Deployment を作成します。Pod 定義に、ApsaraDB RDS インスタンス ID とホワイトリストグループ名のアノテーションを追加します。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: inject-test name: inject-test spec: replicas: 1 selector: matchLabels: app: inject-test template: metadata: annotations: ack.aliyun.com/rds_id: <rm-wz9nanjcud75b****> ack.aliyun.com/white_list_name: <rds_group> labels: app: inject-test spec: containers: - command: - sleep - "3600" image: alpine:latest name: inject-test -
次のコマンドを実行して、Pod の IP アドレスを表示します。
kubectl --kubeconfig .kube/config_sts_test -n inject-test get pod -o wide出力例:
NAME READY STATUS RESTARTS AGE IP NODE inject-test-68cc8f9bbf-gj86n 1/1 Running 0 22s 172.25.0.28 cn-hangzhou.xxx出力では、Pod の IP アドレスは 172.25.0.28 です。
-
ApsaraDB RDS コンソールにログインし、アノテーションで指定された ApsaraDB RDS インスタンスのホワイトリストを表示します。ApsaraDB RDS ホワイトリストの表示方法の詳細については、「拡張 IP アドレスホワイトリストモード」をご参照ください。
-
ステップ 1 で作成した Deployment のレプリカ数を 0 に設定し、ApsaraDB RDS ホワイトリストを再度確認します。
IP アドレスはホワイトリストから自動的に削除されます。
内部エンドポイントへのアクセスの設定
デフォルトでは、ack-kubernetes-webhook-injector は Alibaba Cloud サービスのパブリックエンドポイントを使用します。ご利用のクラスターでパブリックネットワークアクセスが有効になっていない場合は、設定を変更して内部エンドポイントを使用できます。
一部の Alibaba Cloud サービスは、すべてのリージョンで内部エンドポイントを提供しているわけではありません。続行する前に、OpenAPI Explorer を確認して、対象のサービスがそのリージョンで内部エンドポイントを利用できるかを確認してください。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
ページ上部の 名前空間 ドロップダウンリストから kube-system を選択します。kubernetes-webhook-injector Deployment を見つけます。アクション 列で、 を選択します。
-
spec.template.spec.containers.commandの下に、- '--intranet-access'の行を追加し、更新 をクリックします。
その他のセキュリティポリシー設定
ack-kubernetes-webhook-injector は、以下のセキュリティポリシー設定もサポートしています。
-
SLB アクセス制御:
ack.aliyun.com/access_control_policy_id。 -
ApsaraDB for Redis ホワイトリスト設定:
-
Redis ID:
ack.aliyun.com/redis_id。 -
Redis ホワイトリストグループ:
ack.aliyun.com/redis_white_list_name。
-
ack-kubernetes-webhook-injector のアンインストール
ack-kubernetes-webhook-injector が不要になった場合は、ACK のリリース管理機能を使用して削除できます。詳細については、「Helm リリースの管理」をご参照ください。その後、次のコマンドを実行して、残りの設定リソースを削除します。
kubectl -n kube-system delete secret kubernetes-webhook-injector-certs
kubectl delete mutatingwebhookconfigurations.admissionregistration.k8s.io kubernetes-webhook-injector