適用範囲: Terway ネットワークプラグインを使用する ACK マネージドクラスター
ack-kubernetes-webhook-injector は、Pod の起動時にその IP アドレスをクラウドサービスのホワイトリストに自動的に追加し、Pod が削除された際にも自動的に削除します。これにより、ApsaraDB RDS、ApsaraDB for Redis、および Server Load Balancer (SLB) に対して、手動でホワイトリストエントリを管理することなく、細かい粒度かつライフサイクルに応じたアクセス制御を実現できます。
仕組み
Pod の仕様(spec)に特定のアノテーションを追加すると、ack-kubernetes-webhook-injector は Admission Webhook を介して Pod の作成および削除イベントをインターセプトし、対応する Alibaba Cloud サービスの API を呼び出してホワイトリストを更新します。
対応するサービス:
| サービス | 制御対象 |
|---|---|
| ApsaraDB RDS | 名前付きホワイトリストグループ |
| ApsaraDB for Redis | 名前付きホワイトリストグループ |
| Server Load Balancer (SLB) | アクセス制御リスト(ACL) |
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
ACK マネージドクラスターが存在すること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
kubectl クライアントがクラスターに接続されていること。詳細については、「クラスターの kubeconfig ファイルを取得して kubectl でクラスターに接続する」をご参照ください。
クラスターに Terway ネットワークプラグインがインストールされていること。詳細については、「Terway の使用」をご参照ください。
制限事項
クラスターは Terway ネットワークプラグインを使用している必要があります。他のネットワークプラグインはサポートされていません。
デフォルトでは、ack-kubernetes-webhook-injector は Alibaba Cloud サービスのパブリックエンドポイントを呼び出します。クラスターがパブリックインターネットへのアクセスを無効化している場合は、コンポーネントを設定して内部エンドポイントを使用するようにしてください(「内部エンドポイントの使用」を参照)。
一部の Alibaba Cloud サービスでは、すべてのリージョンで内部エンドポイントが提供されていません。非公開クラスターにデプロイする前に、OpenAPI Explorer を使用して、対象サービスの内部エンドポイントの可用性を確認してください。
ack-kubernetes-webhook-injector のインストール
ACK コンソールにログオンします。左側のナビゲーションウィンドウで、[マーケットプレイス] > [マーケットプレイス] を選択します。
ack-kubernetes-webhook-injector を検索してクリックします。ページ右上隅の デプロイ をクリックします。
表示されるペインで、コンポーネントのクラスターおよび名前空間を指定し、リリース名を入力して 次へ をクリックします。
パラメーター ウィザードページで、
akおよびskをopenapiセクション内に、それぞれ AccessKey ID および AccessKey Secret として設定し、OK をクリックします。詳細については、「AccessKey ペアの取得」をご参照ください。
ApsaraDB RDS のホワイトリストへの Pod IP アドレスの追加
ApsaraDB RDS インスタンスおよびホワイトリストグループを指定するために、Pod の仕様(spec)に以下の 2 つのアノテーションを追加します。
| アノテーション | 説明 |
|---|---|
ack.aliyun.com/rds_id | ApsaraDB RDS インスタンスの ID |
ack.aliyun.com/white_list_name | ホワイトリストグループの名前 |
ack-kubernetes-webhook-injector は、Pod の起動時にその IP アドレスをホワイトリストに自動的に追加し、Pod が削除された際にも自動的に削除します。
例:RDS ホワイトリストのアノテーションを付与してデプロイする
以下の YAML を使用して Deployment を作成します。
<rm-wz9nanjcud75b****>をご自身の RDS インスタンス ID に、<rds_group>をご自身のホワイトリストグループ名に置き換えてください。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-testPod の 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.xxxPod の IP アドレスは
172.25.0.28です。ApsaraDB RDS コンソール にログインし、指定した RDS インスタンスのホワイトリストを確認します。ホワイトリストグループに
172.25.0.28が表示されることを確認してください。詳細については、「強化型 IP アドレスホワイトリストの設定」をご参照ください。Deployment のレプリカ数を 0 にスケールし、再度 RDS のホワイトリストを確認します。Pod の IP アドレスはホワイトリストから自動的に削除されます。
他のサービスへのアクセス制御の構成
ApsaraDB for Redis および SLB に対するアクセス制御を構成するには、以下のアノテーションを使用します。
ApsaraDB for Redis のホワイトリスト
| アノテーション | 説明 |
|---|---|
ack.aliyun.com/redis_id | ApsaraDB for Redis インスタンスの ID |
ack.aliyun.com/white_list_name | ホワイトリストグループの名前 |
SLB のアクセス制御リスト(ACL)
| アノテーション | 説明 |
|---|---|
ack.aliyun.com/access_control_policy_id | SLB ACL の ID |
内部エンドポイントの使用
デフォルトでは、ack-kubernetes-webhook-injector は Alibaba Cloud サービスのパブリックエンドポイントを使用します。クラスターのパブリックインターネットへのアクセスが無効化されている場合は、コンポーネントを設定して代わりに内部エンドポイントを使用するようにしてください。
OpenAPI Explorer を使用して、この変更を行う前に、対象サービスがご使用のリージョンで内部エンドポイントを提供しているかを確認してください。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。
クラスター ページで、ご自身のクラスター名をクリックします。左側のナビゲーションウィンドウで、ワークロード > デプロイメント を選択します。
上部のナビゲーションバーで、kube-system を 名前空間 ドロップダウンリストから選択します。一覧より kubernetes-webhook-injector の Deployment を見つけ、操作 列の その他 > YAML で表示 を選択します。

- '--intranet-access'をspec.template.spec.containers.commandの下に追加し、更新 をクリックします。
ack-kubernetes-webhook-injector のアンインストール
ACK の Helm リリース機能を使用して、ack-kubernetes-webhook-injector をアンインストールします。詳細については、「Helm を使用したリリースの管理」をご参照ください。
アンインストール後に、以下のコマンドを実行して関連する構成を削除します。
kubectl -n kube-system delete secret kubernetes-webhook-injector-certs
kubectl delete mutatingwebhookconfigurations.admissionregistration.k8s.io kubernetes-webhook-injector