다음을 통해 공유


자습서: Ansible을 사용하여 AKS(Azure Kubernetes Service)에서 kubenet 네트워킹 구성

Important

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

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

AKS를 사용하여 다음 네트워크 모델을 사용하여 클러스터를 배포할 수 있습니다.

AKS의 애플리케이션에 대한 네트워킹에 대한 자세한 내용은 AKS의 애플리케이션에 대한 네트워크 개념을 참조하세요.

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

  • AKS 클러스터 만들기
  • Azure kubenet 네트워킹 구성

필수 조건

  • Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
  • Azure 서비스 주체: appId, displayName, 암호테넌트 값을 기록하여 서비스 주체만듭니다.

가상 네트워크 및 서브넷 만들기

이 섹션의 플레이북 코드는 다음 Azure 리소스 그룹을 만듭니다.

  • 가상 네트워크
  • 가상 네트워크 내의 서브넷

다음 플레이북을 vnet.yml로 저장합니다.

- name: Create vnet
  azure_rm_virtualnetwork:
      resource_group: "{{ resource_group }}"
      name: "{{ name }}"
      address_prefixes_cidr:
          - 10.0.0.0/8

- name: Create subnet
  azure_rm_subnet:
      resource_group: "{{ resource_group }}"
      name: "{{ name }}"
      address_prefix_cidr: 10.240.0.0/16
      virtual_network_name: "{{ name }}"
  register: subnet

가상 네트워크에서 AKS 클러스터 만들기

이 섹션의 플레이북 코드는 가상 네트워크 내에 AKS 클러스터를 만듭니다.

다음 플레이북을 aks.yml로 저장합니다.

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

- name: Create AKS cluster with vnet
  azure_rm_aks:
      resource_group: "{{ resource_group }}"
      name: "{{ name }}"
      dns_prefix: "{{ name }}"
      kubernetes_version: "{{ versions.azure_aks_versions[-1] }}"
      agent_pool_profiles:
        - count: 3
          name: nodepool1
          vm_size: Standard_D2_v2
          vnet_subnet_id: "{{ vnet_subnet_id }}"
      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') }}"
      network_profile:
          network_plugin: kubenet
          pod_cidr: 192.168.0.0/16
          docker_bridge_cidr: 172.17.0.1/16
          dns_service_ip: 10.0.0.10
          service_cidr: 10.0.0.0/16
  register: aks

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

  • 모듈을 사용하여 azure_rm_aks_version 지원되는 버전을 찾습니다.

  • 이전 vnet_subnet_id 섹션에서 만든 서브넷입니다.

  • kubenet network_profile 네트워크 플러그 인에 대한 속성을 정의합니다.

  • AKS service_cidr 클러스터의 내부 서비스를 IP 주소에 할당하는 데 사용됩니다. 이 IP 주소 범위는 AKS 클러스터 외부에서 사용되지 않는 주소 공간이어야 합니다. 그러나 여러 AKS 클러스터에 동일한 서비스 CIDR을 다시 사용할 수 있습니다.

  • 주소는 dns_service_ip 서비스 IP 주소 범위의 ".10" 주소여야 합니다.

  • 네트워크 pod_cidr 환경의 다른 곳에서는 사용되지 않는 큰 주소 공간이어야 합니다. 주소 범위는 확장할 것으로 예상되는 노드 수를 수용할 수 있을 만큼 커야 합니다. 클러스터가 배포된 후에는 이 주소 범위를 변경할 수 없습니다. 서비스 CIDR과 마찬가지로 이 IP 범위는 AKS 클러스터 외부에 있으면 안 되지만 클러스터 간에 안전하게 재사용할 수 있습니다.

  • Pod IP 주소 범위는 클러스터의 각 노드에 /24 주소 공간을 할당하는 데 사용됩니다. 다음 예제에서 192.168.0.0/16의 pod_cidr은 첫 번째 노드 192.168.0.0/24, 두 번째 노드 192.168.1.0/24 및 세 번째 노드 192.168.2.0/24를 할당합니다.

  • 클러스터가 확장 또는 업그레이드됨에 따라 Azure는 Pod IP 주소 범위를 각 새 노드에 계속 할당합니다.

  • 플레이북이 .에서 ~/.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 클러스터를 만들면 네트워크 보안 그룹 및 경로 테이블이 생성됩니다. 이러한 리소스는 AKS를 통해 관리되며, 사용자가 서비스를 만들고 노출할 때 업데이트됩니다. 다음과 같이 네트워크 보안 그룹 및 경로 테이블을 가상 네트워크 서브넷과 연결합니다.

다음 플레이북을 다음과 같이 associate.yml저장합니다.

- name: Get route table
  azure_rm_routetable_facts:
      resource_group: "{{ node_resource_group }}"
  register: routetable

- name: Get network security group
  azure_rm_securitygroup_facts:
      resource_group: "{{ node_resource_group }}"
  register: nsg

- name: Parse subnet id
  set_fact:
      subnet_name: "{{ vnet_subnet_id | regex_search(subnet_regex, '\\1') }}"
      subnet_rg: "{{ vnet_subnet_id | regex_search(rg_regex, '\\1') }}"
      subnet_vn: "{{ vnet_subnet_id | regex_search(vn_regex, '\\1') }}"
  vars:
      subnet_regex: '/subnets/(.+)'
      rg_regex: '/resourceGroups/(.+?)/'
      vn_regex: '/virtualNetworks/(.+?)/'

- name: Associate network resources with the node subnet
  azure_rm_subnet:
      name: "{{ subnet_name[0] }}"
      resource_group: "{{  subnet_rg[0] }}"
      virtual_network_name: "{{ subnet_vn[0] }}"
      security_group: "{{ nsg.ansible_facts.azure_securitygroups[0].id }}"
      route_table: "{{ routetable.route_tables[0].id }}"

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

  • AKS node_resource_group 노드가 만들어지는 리소스 그룹 이름입니다.
  • 이전 vnet_subnet_id 섹션에서 만든 서브넷입니다.

샘플 플레이북 실행

이 섹션에서는 이 문서에서 만드는 작업을 호출하는 전체 샘플 플레이북을 나열합니다.

다음 플레이북을 aks-kubenet.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 vnet
       include_tasks: vnet.yml

     - name: Create AKS
       vars:
           vnet_subnet_id: "{{ subnet.state.id }}"
       include_tasks: aks.yml

     - name: Associate network resources with the node subnet
       vars:
           vnet_subnet_id: "{{ subnet.state.id }}"
           node_resource_group: "{{ aks.node_resource_group }}"
       include_tasks: associate.yml

     - name: Get details of the AKS
       azure_rm_aks_facts:
           name: "{{ name }}"
           resource_group: "{{ resource_group }}"
           show_kubeconfig: user
       register: output

     - name: Show AKS cluster detail
       debug:
           var: output.aks[0]

vars 섹션에서 다음을 변경합니다.

  • resource_group 키에서 aksansibletest 값을 리소스 그룹 이름으로 변경합니다.
  • 키의 name 경우 값을 AKS 이름으로 변경 aksansibletest 합니다.
  • 키의 Location 경우 값을 리소스 그룹 위치로 변경 eastus 합니다.

다음 명령을 사용하여 전체 플레이북을 실행합니다.ansible-playbook

ansible-playbook aks-kubenet.yml

플레이북을 실행하면 다음 출력과 비슷한 결과가 표시됩니다.

PLAY [localhost] 

TASK [Gathering Facts] 
ok: [localhost]

TASK [Ensure resource group exist] 
ok: [localhost]

TASK [Create vnet] 
included: /home/devops/aks-kubenet/vnet.yml for localhost

TASK [Create vnet] 
ok: [localhost]

TASK [Create subnet] 
ok: [localhost]

TASK [Create AKS] 
included: /home/devops/aks-kubenet/aks.yml for localhost

TASK [List supported kubernetes version from Azure] 
 [WARNING]: Azure API profile latest does not define an entry for
ContainerServiceClient

ok: [localhost]

TASK [Create AKS cluster with vnet] 
changed: [localhost]

TASK [Associate network resources with the node subnet] 
included: /home/devops/aks-kubenet/associate.yml for localhost

TASK [Get route table] 
ok: [localhost]

TASK [Get network security group] 
ok: [localhost]

TASK [Parse subnet id] 
ok: [localhost]

TASK [Associate network resources with the node subnet] 
changed: [localhost]

TASK [Get details of the AKS] 
ok: [localhost]

TASK [Show AKS cluster detail] 
ok: [localhost] => {
    "output.aks[0]": {
        "id": /subscriptions/BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB/resourcegroups/aksansibletest/providers/Microsoft.ContainerService/managedClusters/aksansibletest",
        "kube_config": "apiVersion: ...",
        "location": "eastus",
        "name": "aksansibletest",
        "properties": {
            "agentPoolProfiles": [
                {
                    "count": 3,
                    "maxPods": 110,
                    "name": "nodepool1",
                    "osDiskSizeGB": 100,
                    "osType": "Linux",
                    "storageProfile": "ManagedDisks",
                    "vmSize": "Standard_D2_v2",
                    "vnetSubnetID": "/subscriptions/BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB/resourceGroups/aksansibletest/providers/Microsoft.Network/virtualNetworks/aksansibletest/subnets/aksansibletest"
                }
            ],
            "dnsPrefix": "aksansibletest",
            "enableRBAC": false,
            "fqdn": "aksansibletest-cda2b56c.hcp.eastus.azmk8s.io",
            "kubernetesVersion": "1.12.6",
            "linuxProfile": {
                "adminUsername": "azureuser",
                "ssh": {
                    "publicKeys": [
                        {
                            "keyData": "ssh-rsa ..."
                        }
                    ]
                }
            },
            "networkProfile": {
                "dnsServiceIP": "10.0.0.10",
                "dockerBridgeCidr": "172.17.0.1/16",
                "networkPlugin": "kubenet",
                "podCidr": "192.168.0.0/16",
                "serviceCidr": "10.0.0.0/16"
            },
            "nodeResourceGroup": "MC_aksansibletest_pcaksansibletest_eastus",
            "provisioningState": "Succeeded",
            "servicePrincipalProfile": {
                "clientId": "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"
            }
        },
        "type": "Microsoft.ContainerService/ManagedClusters"
    }
}

PLAY RECAP 
localhost                  : ok=15   changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

리소스 정리

  1. 다음 코드를 .로 delete_rg.yml저장합니다.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. ansible-playbook 명령을 사용하여 플레이북을 실행합니다. 자리 표시자를 삭제할 리소스 그룹의 이름으로 바꿉니다. 리소스 그룹 내의 모든 리소스가 삭제됩니다.

    ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
    

    주요 정보:

    • 플레이북의 register 변수 및 debug 섹션으로 인해 명령이 완료되면 결과가 표시됩니다.

다음 단계