教程:使用 Ansible 在 Azure Kubernetes 服务(AKS)中配置 Azure CNI 网络

重要

需要 Ansible 2.8(或更高版本)才能运行本文中的示例剧本。

Azure Kubernetes 服务(AKS) 可以轻松地在 Azure 中部署托管 Kubernetes 群集。 AKS 通过将大部分责任卸载到 Azure 来降低管理 Kubernetes 的复杂性和运营开销。 作为托管的 Kubernetes 服务,Azure 会为你处理运行状况监视和维护等关键任务。 Kubernetes 主服务器由 Azure 管理。 你仅管理和维护代理节点。 作为托管 Kubernetes 服务,AKS 是免费的 - 您只需为群集中的代理节点付费,而无需为主节点付费。

使用 AKS,可以使用以下网络模型部署群集:

  • Azure CNI 网络 - AKS 群集已连接到现有虚拟网络(VNET)资源和配置。

有关 AKS 中应用程序网络的详细信息,请参阅 AKS 中应用程序的网络概念。

本文中你将学习如何:

  • 创建 AKS 群集
  • 配置 Azure CNI 网络

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始前创建 免费帐户
  • Azure 服务主体创建服务主体,记下以下值:appIddisplayName密码租户

创建虚拟网络和子网

本部分中的示例剧本代码用于:

  • 创建虚拟网络
  • 在虚拟网络中创建子网

将以下 playbook 保存为 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 群集。

将以下 playbook 保存为 aks.yml

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

- name: Create AKS cluster within a 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: azure
          docker_bridge_cidr: 172.17.0.1/16
          dns_service_ip: 10.2.0.10
          service_cidr: 10.2.0.0/24
  register: aks

下面是使用示例操作手册时需要注意的一些事项:

  • 使用 azure_rm_aks_version 模块查找受支持的版本。

  • vnet_subnet_id 是在上一部分中创建的子网。

  • playbook 通过 ~/.ssh/id_rsa.pub 加载 ssh_key。 如果对其进行修改,请使用单行格式 - 以“ssh-rsa”开头(不含引号)。

  • 从默认凭据文件 ~/.azure/credentials加载 client_idclient_secret 值。 可以将这些值设置为服务主体,或从环境变量加载这些值:

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

运行示例剧本

本部分的示例流程书代码用于检验本教程中展示的各种特性和功能。

将以下 playbook 保存为 aks-azure-cni.yml

---
- hosts: localhost
  vars:
      resource_group: aksansibletest
      name: aksansibletest
      ___location: eastus
  tasks:
     - name: Ensure resource group exists
       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: Show AKS cluster detail
       debug:
           var: aks

下面是在使用示例手册时要考虑的一些重要提示:

  • aksansibletest 值更改为资源组名称。
  • aksansibletest 值更改为 AKS 名称。
  • eastus 值更改为资源组位置。

使用 ansible-playbook 命令运行 playbook:

ansible-playbook aks-azure-cni.yml

运行 playbook 后,会看到类似于以下结果的输出:

PLAY [localhost] 

TASK [Gathering Facts] 
ok: [localhost]

TASK [Ensure resource group exists] 
changed: [localhost]

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

TASK [Create vnet] 
changed: [localhost]

TASK [Create subnet] 
changed: [localhost]

TASK [Create AKS] 
included: /home/devops/aks-cni/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 [Show AKS cluster detail] 
ok: [localhost] => {
    "aks": {
        "aad_profile": {},
        "addon": {},
        "agent_pool_profiles": [
            {
                "count": 3,
                "name": "nodepool1",
                "os_disk_size_gb": 100,
                "os_type": "Linux",
                "storage_profile": "ManagedDisks",
                "vm_size": "Standard_D2_v2",
                "vnet_subnet_id": "/subscriptions/BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB/resourceGroups/aksansibletest/providers/Microsoft.Network/virtualNetworks/aksansibletest/subnets/aksansibletest"
            }
        ],
        "changed": true,
        "dns_prefix": "aksansibletest",
        "enable_rbac": false,
        "failed": false,
        "fqdn": "aksansibletest-0272707d.hcp.eastus.azmk8s.io",
        "id": "/subscriptions/BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB/resourcegroups/aksansibletest/providers/Microsoft.ContainerService/managedClusters/aksansibletest",
        "kube_config": "..."
        },
        "___location": "eastus",
        "name": "aksansibletest",
        "network_profile": {
            "dns_service_ip": "10.2.0.10",
            "docker_bridge_cidr": "172.17.0.1/16",
            "network_plugin": "azure",
            "network_policy": null,
            "pod_cidr": null,
            "service_cidr": "10.2.0.0/24"
        },
        "node_resource_group": "MC_aksansibletest_aksansibletest_eastus",
        "provisioning_state": "Succeeded",
        "service_principal_profile": {
            "client_id": "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"
        },
        "tags": null,
        "type": "Microsoft.ContainerService/ManagedClusters",
        "warnings": [
            "Azure API profile latest does not define an entry for ContainerServiceClient",
            "Azure API profile latest does not define an entry for ContainerServiceClient"
        ]
    }
}

PLAY RECAP 
localhost                  : ok=9    changed=4    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 命令运行 playbook。 将占位符替换为要删除的资源组的名称。 资源组中的所有资源都将被删除。

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

    要点

    • 由于 playbook 的 register 变量和 debug 部分,因此在命令完成时,将显示结果。

后续步骤

教程:使用 Ansible 在 AKS 中配置 Microsoft Entra ID