Öğretici: Ansible kullanarak Azure Kubernetes Service'te (AKS) kubenet ağını yapılandırma

Önemli

Bu makaledeki örnek playbook'ları çalıştırmak için Ansible 2.8 (veya üzeri) gereklidir.

Azure Kubernetes Service (AKS), Azure'da yönetilen bir Kubernetes kümesi dağıtmayı kolaylaştırır. AKS, sorumluluğun çoğunu Azure'a devrederek Kubernetes yönetiminin karmaşıklığını ve işlemsel yükünü azaltır. Barındırılan bir Kubernetes hizmeti olarak, Azure sistem durumu izleme ve bakım gibi kritik görevleri sizin için gerçekleştirir. Kubernetes ana düğümler Azure tarafından yönetilir. Siz yalnızca aracı düğümlerini yönetir ve sürdürürsünüz. Yönetilen bir Kubernetes hizmeti olarak AKS ücretsizdir; yalnızca kümelerinizdeki aracı düğümleri için ödeme gerçekleştirirsiniz; Ustalar için değil.

AKS kullanarak aşağıdaki ağ modellerini kullanarak bir küme dağıtabilirsiniz:

AKS'deki uygulamalarınıza ağ oluşturma hakkında daha fazla bilgi için bkz . AKS'deki uygulamalar için ağ kavramları.

Bu makalede şunları öğreneceksiniz:

  • AKS kümesi oluşturma
  • Azure kubenet ağını yapılandırma

Önkoşullar

  • Azure aboneliği: Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Sanal ağ ve alt ağ oluşturma

Bu bölümdeki playbook kodu aşağıdaki Azure kaynaklarını oluşturur:

  • Sanal ağ
  • Sanal ağ içinde alt ağ

Aşağıdaki playbook'u vnet.yml olarak kaydedin:

- 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

Sanal ağda AKS kümesi oluşturma

Bu bölümdeki playbook kodu, sanal ağ içinde bir AKS kümesi oluşturur.

Aşağıdaki playbook'u aks.yml olarak kaydedin:

- 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

Örnek playbook ile çalışırken göz önünde bulundurmanız gereken bazı önemli notlar şunlardır:

  • Desteklenen sürümü bulmak için modülü kullanın azure_rm_aks_version .

  • vnet_subnet_id, önceki bölümde oluşturulan alt ağdır.

  • , network_profile kubenet ağ eklentisinin özelliklerini tanımlar.

  • service_cidr, AKS kümesindeki iç hizmetleri bir IP adresine atamak için kullanılır. Bu IP adresi aralığı, AKS kümelerinin dışında kullanılmayan bir adres alanı olmalıdır. Ancak, aynı hizmet CIDR'yi birden çok AKS kümesi için yeniden kullanabilirsiniz.

  • Adres, dns_service_ip hizmet IP adresi aralığınızın ".10" adresi olmalıdır.

  • pod_cidr, ağ ortamınızın başka bir yerinde kullanılmamış büyük bir adres alanı olmalıdır. Adres aralığı, ölçeği artırmayı beklediğiniz düğüm sayısını karşılayacak kadar büyük olmalıdır. Küme dağıtıldıktan sonra bu adres aralığını değiştiremezsiniz. Hizmet CIDR'de olduğu gibi, bu IP aralığı AKS kümesinin dışında bulunmamalıdır, ancak kümeler arasında güvenli bir şekilde yeniden kullanılabilir.

  • Pod IP adresi aralığı, kümedeki her düğüme /24 adres alanı atamak için kullanılır. Aşağıdaki örnekte, pod_cidr 192.168.0.0/16'nın ilk düğümü 192.168.0.0/24, ikinci düğüm 192.168.1.0/24 ve üçüncü düğümü 192.168.2.0/24 atar.

  • Küme ölçeklendikçe veya yükseltildikçe Azure, her yeni düğüme bir pod IP adresi aralığı atamaya devam eder.

  • playbook'u içinden ~/.ssh/id_rsa.pubyüklenirssh_key. Bunu değiştirirseniz, "ssh-rsa" ile başlayan (tırnak işaretleri olmadan) tek satırlı biçimi kullanın.

  • client_id ve client_secret değerleri, varsayılan kimlik bilgisi dosyası olan dosyasından ~/.azure/credentialsyüklenir. Bu değerleri hizmet sorumlunuza ayarlayabilir veya ortam değişkenlerinden bu değerleri yükleyebilirsiniz:

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

Ağ kaynaklarını ilişkilendirme

AKS kümesi oluşturduğunuzda, bir ağ güvenlik grubu ve yol tablosu oluşturulur. Bu kaynaklar AKS tarafından yönetilir ve hizmetleri oluşturup kullanıma sunduğunuzda güncelleştirilir. Ağ güvenlik grubunu ve yönlendirme tablosunu aşağıdaki gibi sanal ağ alt ağınızla ilişkilendirin.

Aşağıdaki playbook'u olarak associate.ymlkaydedin.

- 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 }}"

Örnek playbook ile çalışırken göz önünde bulundurmanız gereken bazı önemli notlar şunlardır:

  • node_resource_group, AKS düğümlerinin oluşturulduğu kaynak grubu adıdır.
  • vnet_subnet_id, önceki bölümde oluşturulan alt ağdır.

Örnek playbook'u çalıştırma

Bu bölümde, bu makalede oluşturma görevlerini çağıran örnek playbook'un tamamı listelenmiştir.

Aşağıdaki playbook'u aks-kubenet.yml olarak kaydedin:

---
- 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 bölümünde aşağıdaki değişiklikleri yapın:

  • Anahtar için resource_group değeri kaynak grubunuzun adıyla aksansibletest değiştirin.
  • Anahtar için name değeri AKS adınız olarak değiştirin aksansibletest .
  • Anahtar için Location değeri kaynak grubu konumunuza değiştirin eastus .

komutunu kullanarak playbook'un ansible-playbook tamamını çalıştırın:

ansible-playbook aks-kubenet.yml

Playbook çalıştırılırken aşağıdaki çıkışa benzer sonuçlar gösterilir:

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

Kaynakları temizleme

  1. Aşağıdaki kodu olarak delete_rg.ymlkaydedin.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. ansible-playbook komutunu kullanarak playbook'u çalıştırın. Yer tutucuyu silinecek kaynak grubunun adıyla değiştirin. Kaynak grubundaki tüm kaynaklar silinir.

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

    Önemli noktalar:

    • Playbook'un register değişkeni ve debug bölümü nedeniyle, komut tamamlandığında sonuçlar görüntülenir.

Sonraki adımlar