Tutorial: Mengonfigurasi jaringan kubenet di Azure Kubernetes Service (AKS) menggunakan Ansible

Penting

Ansible 2.8 (atau yang lebih baru) diperlukan untuk menjalankan sampel playbook dalam artikel ini.

Azure Kubernetes Service (AKS) memudahkan penyebaran kluster Kubernetes terkelola di Azure. AKS mengurangi kerumitan dan operasional yang berlebih dalam mengelola Kubernetes dengan mengalihkan sebagian besar tanggung jawab tersebut ke Azure. Sebagai layanan Kubernetes yang dihosting, Azure menangani tugas-tugas penting, seperti pemantauan dan pemeliharaan kesehatan. Master Kubernetes dikelola oleh Azure. Anda hanya mengelola dan memelihara node agen. Sebagai layanan Kubernetes terkelola, AKS gratis - Anda hanya perlu membayar node agen dalam kluster Anda; bukan untuk master.

Dengan AKS, Anda dapat menyebarkan kluster yang menggunakan model jaringan berikut:

Untuk informasi selengkapnya tentang jaringan ke aplikasi Anda di AKS, lihat Konsep jaringan untuk aplikasi di AKS.

Dalam artikel ini, Anda akan mempelajari cara:

  • Membuat kluster AKS
  • Konfigurasikan jaringan kubenet Azure

Prasyarat

  • Langganan Azure: Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum memulai.
  • Perwakilan layanan Azure: Buat perwakilan layanan, catat nilai-nilai berikut: appId, displayName, kata sandi, dan penyewa.

Membuat jaringan virtual dan subnet

Kode playbook di bagian ini membuat sumber daya Azure berikut:

  • Jaringan virtual
  • Subnet di dalam jaringan virtual

Simpan playbook berikut sebagai 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

Membuat kluster AKS di jaringan virtual

Kode playbook di bagian ini membuat kluster AKS dalam jaringan virtual.

Simpan playbook berikut sebagai 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

Berikut adalah beberapa catatan penting yang perlu dipertimbangkan saat bekerja dengan sampel playbook:

  • Gunakan modul azure_rm_aks_version untuk menemukan versi yang didukung.

  • vnet_subnet_id adalah subnet yang dibuat di bagian sebelumnya.

  • network_profile mendefinisikan properti untuk plug-in jaringan kubenet.

  • service_cidr digunakan untuk menetapkan layanan internal di kluster AKS ke alamat IP. Rentang alamat IP ini harus berupa ruang alamat yang tidak digunakan di luar kluster AKS. Namun, Anda dapat menggunakan kembali CIDR layanan yang sama untuk beberapa kluster AKS.

  • Alamat dns_service_ip harus berupa alamat ".10" dari rentang alamat IP layanan Anda.

  • pod_cidr harus berupa ruang alamat besar yang tidak digunakan di tempat lain di lingkungan jaringan Anda. Rentang alamat ini harus cukup besar untuk mengakomodasi jumlah node yang ingin Anda tingkatkan skalanya. Anda tidak dapat mengubah rentang alamat ini setelah kluster disebarkan. Seperti halnya layanan CIDR, rentang IP ini seharusnya tidak ada di luar kluster AKS, tetapi dapat digunakan kembali dengan aman di seluruh kluster.

  • Rentang alamat IP pod digunakan untuk menetapkan ruang alamat /24 ke setiap simpul dalam kluster. Dalam contoh berikut, pod_cidr dari 192.168.0.0/16 menetapkan node pertama 192.168.0.0/24, node kedua 192.168.1.0/24, dan node ketiga 192.168.2.0/24.

  • Seiring kluster melakukan penskalaan atau peningkatan, Azure terus menetapkan rentang alamat IP pod ke setiap node baru.

  • Playbook memuat ssh_key dari ~/.ssh/id_rsa.pub. Jika Anda memodifikasinya, gunakan format satu baris - dimulai dengan "ssh-rsa" (tanpa tanda kutip).

  • Nilai client_id dan client_secret dimuat dari ~/.azure/credentials, yang merupakan file informasi masuk default. Anda dapat mengatur nilai-nilai ini ke perwakilan layanan Anda atau memuat nilai-nilai ini dari variabel lingkungan:

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

Mengaitkan sumber daya jaringan

Saat Anda membuat kluster AKS, grup keamanan jaringan dan tabel rute akan dibuat secara otomatis. Sumber daya ini dikelola oleh AKS dan diperbarui saat Anda membuat dan mengekspos layanan. Kaitkan grup keamanan jaringan dan tabel rute dengan subnet jaringan virtual Anda sebagai berikut.

Simpan playbook berikut sebagai 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 }}"

Berikut adalah beberapa catatan penting yang perlu dipertimbangkan saat bekerja dengan sampel playbook:

  • node_resource_group adalah nama grup sumber daya di mana node AKS dibuat.
  • vnet_subnet_id adalah subnet yang dibuat di bagian sebelumnya.

Jalankan sampel playbook

Bagian ini mencantumkan playbook sampel lengkap, yang memanggil pembuatan tugas dalam artikel ini.

Simpan playbook berikut sebagai 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]

Di bagian vars, buat perubahan berikut:

  • Untuk kunci resource_group, ubah nilai aksansibletest ke nama grup sumber daya Anda.
  • Untuk kunci name, ubah nilai aksansibletest ke nama AKS Anda.
  • Untuk kunci Location, ubah nilai eastus ke lokasi grup sumber daya Anda.

Jalankan playbook lengkap menggunakan perintah ansible-playbook:

ansible-playbook aks-kubenet.yml

Menjalankan playbook menunjukkan hasil yang mirip dengan output berikut:

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

Membersihkan sumber daya

  1. Simpan kode berikut sebagai delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Jalankan playbook menggunakan perintah ansible-playbook. Ganti tempat penampung dengan nama grup sumber daya yang akan dihapus. Semua sumber daya dalam grup sumber daya akan dihapus.

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

    Poin utama:

    • Karena variabel register dan bagian debug dari playbook, hasilnya akan ditampilkan ketika perintah selesai.

Langkah berikutnya