チュートリアル: Ansible を使用して Azure Kubernetes Service (AKS) でロールベースのアクセス制御 (RBAC) ロールを構成する

重要

この記事のサンプル プレイブックを実行するには、Ansible 2.8 (以降) が必要です。

Azure Kubernetes Service (AKS) を使用すると、マネージド Kubernetes クラスターを Azure 内に簡単にデプロイできます。 AKS では、責任の多くを Azure にオフロードすることで、Kubernetes の管理の複雑さと運用上のオーバーヘッドを軽減します。 ホストされた Kubernetes サービスとして、Azure は正常性監視やメンテナンスなどの重要なタスクを自動的に処理します。 Kubernetes マスターは、Azure によって管理されます。 ユーザーは、エージェント ノードの管理と保守のみを行います。 マネージド Kubernetes サービスである AKS は無料のため、マスターではなく、クラスター内のエージェント ノードに対してのみ料金を支払います。

AKS は、ユーザー認証に Microsoft Entra ID を使用するように構成できます。 構成後は、Microsoft Entra 認証トークンを使用して AKS クラスターにサインインします。 ユーザーの ID またはディレクトリのグループ メンバーシップに基づく RBAC が可能です。

この記事では、次のことについて説明します。

  • Microsoft Entra ID 対応 AKS クラスターを作成する
  • クラスターで RBAC ロールを構成する

前提条件

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • RedHat OpenShift ライブラリをインストールする - pip install openshift

AKS 認証用に Microsoft Entra ID を構成する

AKS 認証用に Microsoft Entra ID を構成すると、2 つの Microsoft Entra アプリケーションが構成されます。 この操作は、Azure テナント管理者が行う必要があります。 詳細については、「Microsoft Entra ID を AKS と統合する」を参照してください。

Azure テナント管理者に問い合わせて、次の値を取得します。

  • サーバー アプリ シークレット
  • サーバー アプリ ID
  • クライアント アプリ ID
  • テナント ID

これらの値は、サンプルのプレイブックを実行するために必要です。

AKS クラスターを作成する

このセクションでは、Microsoft Entra アプリケーションを使用して AKS を作成します。

以下に、サンプル プレイブックを使用する際に考慮すべき重要な点をいくつか示します。

  • このプレイブックは ~/.ssh/id_rsa.pub から ssh_key を読み込みます。 これを変更する場合は、"ssh-rsa" (引用符は除く) で始まる単一行形式を使用してください。

  • client_id および client_secret の値は、既定の資格情報ファイルである ~/.azure/credentials から読み込まれます。 これらの値をサービス プリンシパルに設定するか、環境変数からこれらの値を読み込むことができます。

    client_id: "{{ lookup('env', 'AZURE_CLIENT_ID') }}"
    client_secret: "{{ lookup('env', 'AZURE_SECRET') }}"
    

次のプレイブックを aks-create.yml という名前で保存します。

- name: Create resource group
  azure_rm_resourcegroup:
      name: "{{ resource_group }}"
      location: "{{ location }}"

- name: List supported kubernetes version from Azure
  azure_rm_aksversion_facts:
      location: "{{ location }}"
  register: versions

- name: Create AKS cluster with RBAC enabled
  azure_rm_aks:
      resource_group: "{{ resource_group }}"
      name: "{{ name }}"
      dns_prefix: "{{ name }}"
      enable_rbac: yes
      kubernetes_version: "{{ versions.azure_aks_versions[-1] }}"
      agent_pool_profiles:
        - count: 3
          name: nodepool1
          vm_size: Standard_D2_v2
      linux_profile:
          admin_username: azureuser
          ssh_key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
      service_principal:
          client_id: "{{ lookup('ini', 'client_id section=default file=~/.azure/credentials') }}"
          client_secret: "{{ lookup('ini', 'secret section=default file=~/.azure/credentials') }}"
      aad_profile:
          client_app_id: "{{ client_app_id }}"
          server_app_id: "{{ server_app_id }}"
          server_app_secret: "{{ server_app_secret }}"
          tenant_id: "{{ app_tenant_id }}"
  register: aks

- name: Save cluster user config
  copy:
      content: "{{ aks.kube_config }}"
      dest: "aks-{{ name }}-kubeconfig-user"

- name: Get admin config of AKS
  azure_rm_aks_facts:
      resource_group: "{{ resource_group }}"
      name: "{{ name }}"
      show_kubeconfig: admin
  register: aks

- name: Save the kubeconfig
  copy:
      content: "{{ aks.aks[0].kube_config }}"
      dest: "aks-{{ name }}-kubeconfig"

Microsoft Entra オブジェクト ID を取得する

RBAC のバインドを作成するには、まず Microsoft Entra オブジェクト ID を取得する必要があります。

  1. Azure portal にサインインします。

  2. ページの上部にある検索フィールドに、「Microsoft Entra ID」と入力します。

  3. [Enter] をクリックします。

  4. [管理] メニューで [ユーザー] を選択します。

  5. [名前] フィールドで、お使いのアカウントを検索します。

  6. [名前] 列で、お使いのアカウントへのリンクを選択します。

  7. [ID] セクションで、[オブジェクト ID] をコピーします。

    Copy the Microsoft Entra Object ID.

RBAC のバインドを作成する

このセクションでは、AKS でロール バインドまたはクラスター ロール バインドを作成します。

次のプレイブックを kube-role.yml という名前で保存します。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admins
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: <your-aad-account>

<your-aad-account> プレースホルダーは、お使いの Microsoft Entra テナント オブジェクト ID に置き換えます。

新しいロールを AKS にデプロイする次のプレイブックを aks-kube-deploy.yml という名前で保存します。

- name: Apply role to AKS
  k8s:
      src: kube-role.yml
      kubeconfig: "aks-{{ name }}-kubeconfig"

サンプル プレイブックを実行する

このセクションでは、この記事で作成するタスクを呼び出す完全なサンプル プレイブックを示します。

次のプレイブックを aks-rbac.yml という名前で保存します。

---
- hosts: localhost
  vars:
      resource_group: aksansibletest
      name: aksansibletest
      location: eastus
  tasks:
     - name: Ensure resource group exist
       azure_rm_resourcegroup:
           name: "{{ resource_group }}"
           location: "{{ location }}"

     - name: Create AKS
       vars:
           client_app_id: <client id>
           server_app_id: <server id>
           server_app_secret: <server secret>
           app_tenant_id: <tenant id>
       include_tasks: aks-create.yml

     - name: Enable RBAC
       include_tasks: aks-kube-deploy.yml

vars セクションで、次のプレースホルダーを実際の Microsoft Entra 情報に置き換えます。

  • <client id>
  • <server id>
  • <server secret>
  • <tenant id>

ansible-playbook コマンドを使用して完全なプレイブックを実行します。

ansible-playbook aks-rbac.yml

結果を確認する

このセクションでは、kubectl を使用して、この記事で作成するノードを一覧表示します。

ターミナルのプロンプトで次のコマンドを入力します。

kubectl --kubeconfig aks-aksansibletest-kubeconfig-user get nodes

このコマンドを実行すると、認証ページに移動します。 Azure のアカウントを使用してサインインします。

認証されると、kubectl によって次の結果のようにノードが一覧表示されます。

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXX to authenticate.
NAME                       STATUS   ROLES   AGE   VERSION
aks-nodepool1-33413200-0   Ready    agent   49m   v1.12.6
aks-nodepool1-33413200-1   Ready    agent   49m   v1.12.6
aks-nodepool1-33413200-2   Ready    agent   49m   v1.12.6

リソースをクリーンアップする

この記事で作成したリソースが不要になったら、削除してください。

cleanup.yml として次のコードを保存します。

---
- hosts: localhost
  vars:
      name: aksansibletest
      resource_group: aksansibletest
  tasks:
      - name: Clean up resource group
        azure_rm_resourcegroup:
            name: "{{ resource_group }}"
            state: absent
            force: yes
      - name: Remove kubeconfig
        file:
            state: absent
            path: "aks-{{ name }}-kubeconfig"

ansible-playbook を使用してプレイブックを実行します

ansible-playbook cleanup.yml

次のステップ