다음을 통해 공유


자습서: Ansible을 사용하여 AKS(Azure Kubernetes Service)에서 RBAC(역할 기반 액세스 제어) 역할 구성

Important

이 문서의 샘플 플레이북을 실행하려면 Ansible 2.8 이상이 필요합니다.

AKS(Azure Kubernetes Service)를 사용하면 Azure에서 관리되는 Kubernetes 클러스터를 간단하게 배포할 수 있습니다. AKS는 대부분의 부담을 Azure에 오프로딩하여 Kubernetes를 관리하는 복잡성 및 운영 과부하를 감소시킵니다. 호스팅되는 Kubernetes 서비스인 Azure는 상태 모니터링 및 유지 관리 같은 중요 작업을 처리합니다. Kubernetes 마스터는 Azure에서 관리됩니다. 고객은 에이전트 노드만 관리 및 유지하면 됩니다. 관리되는 Kubernetes 서비스, AKS가 무료이므로 마스터가 아니라 클러스터 내의 에이전트 노드에 대해서만 지불합니다.

AKS는 사용자 인증에 Microsoft Entra ID를 사용하도록 구성할 수 있습니다. 구성되면 Microsoft Entra 인증 토큰을 사용하여 AKS 클러스터에 로그인합니다. RBAC는 사용자의 ID 또는 디렉터리 그룹 멤버 자격을 기반으로 할 수 있습니다.

이 문서에서는 다음 방법을 설명합니다.

  • Microsoft Entra ID 사용 AKS 클러스터 만들기
  • 클러스터에서 RBAC 역할 구성

필수 조건

  • Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
  • Azure 서비스 주체: appId, displayName, 암호테넌트 값을 기록하여 서비스 주체만듭니다.
  • RedHat OpenShift 라이브러리 설치 - pip install openshift

AKS 인증에 대한 Microsoft Entra ID 구성

AKS 인증을 위해 Microsoft Entra ID를 구성할 때 두 개의 Microsoft Entra 애플리케이션이 구성됩니다. Azure 테넌트 관리자가 이 작업을 완료해야 합니다. 자세한 내용은 AKS와 Microsoft Entra ID 통합을 참조하세요.

Azure 테넌트 관리자로부터 다음 값을 가져옵니다.

  • 서버 앱 비밀
  • 서버 앱 ID
  • 클라이언트 앱 ID
  • 테넌트 ID

샘플 플레이북을 실행하려면 이러한 값이 필요합니다.

AKS 클러스터 만들기

이 섹션에서는 Microsoft Entra 애플리케이션을 사용하여 AKS를 만듭니다.

샘플 플레이북을 사용할 때 고려해야 할 몇 가지 주요 참고 사항은 다음과 같습니다.

  • 플레이북이 .에서 ~/.ssh/id_rsa.pub로드됩니다ssh_key. 수정하는 경우 "ssh-rsa"(따옴표 없이)로 시작하는 한 줄 형식을 사용합니다.

  • client_secret 값은 client_id 기본 자격 증명 파일인 에서 ~/.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를 복사합니다.

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

다음 단계