使用Ansible来操作AKS(Azure Kubernete服务)

首先

最近一直以来被提及的IaC(Infrastructure as Code)概念,大家都在使用哪些工具呢?
是Terraform吗?还是ARM模板?还是可能是Bicep呢?
本文将总结使用Ansible进行AKS操作的尝试记录。

环境

这篇文章的内容是在Azure Cloud Shell(Bash版本)上执行的。

$ ansible --version
ansible 2.10.2
  config file = None
  configured module search path = ['/home/ussvgr/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /opt/ansible/lib/python3.7/site-packages/ansible
  executable location = /opt/ansible/bin/ansible
  python version = 3.7.3 (default, Jul 25 2020, 13:03:44) [GCC 8.3.0]

准备:安装(或升级)Collection的版本。

Cloud Shell上的环境默认已安装用于通过Ansible操作Azure资源的模块。然而,由于版本过旧,需要进行升级(截至2021年10月31日的信息)。

已经安装的 Collection 版本是 1.2.0(根据 CHANGELOG.md 文件中最新的描述确认)。

$ head /opt/ansible/lib/python3.7/site-packages/ansible_collections/azure/azcollection/CHANGELOG.md
# Change Log

## v1.2.0 (2020-10-09)

### NEW MODULES
  - azure_rm_backupazurevm  ([#248](https://github.com/ansible-collections/azure/pull/248))
  - azure_rm_backupazurevm_info ([#248](https://github.com/ansible-collections/azure/pull/248))
  - azure_rm_recoveryservicesvault ([#254](https://github.com/ansible-collections/azure/pull/254))
  - azure_rm_openshiftmanagedcluster ([#276](https://github.com/ansible-collections/azure/pull/276))

使用ansible-galaxy命令安装最新的Collection。

$ ansible-galaxy collection install azure.azcollection
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Installing 'azure.azcollection:1.10.0' to '/home/ussvgr/.ansible/collections/ansible_collections/azure/azcollection'
Downloading https://galaxy.ansible.com/download/azure-azcollection-1.10.0.tar.gz to /home/ussvgr/.ansible/tmp/ansible-local-1517j3twu3a/tmpo_e77nln
azure.azcollection (1.10.0) was installed successfully

已安装版本为v1.10.0。

使用最小的Playbook创建AKS集群。

Azure官方文档中也有使用Ansible创建AKS集群的说明,但是文档中提供的示例Playbook是基于azure.azcollection的v1.2.0版本编写的。
在最新版本中,可以省略服务主体和节点的SSH密钥,只需创建集群即可,简化方式如下:
(若未指定服务主体,则使用托管标识创建)

- name: Create Azure Kubernetes Service
  hosts: localhost
  connection: local
  tasks:
  - name: Create resource group
    azure.azcollection.azure_rm_resourcegroup:
      name: aks_rg
      location: japaneast
  - name: Create AKS Cluster
    azure.azcollection.azure_rm_aks:
      name: akstest
      kubernetes_version: 1.20.7
      location: japaneast
      resource_group: aks_rg
      dns_prefix: akstest
      agent_pool_profiles:
        - name: agentpool1
          mode: System
          count: 1
          vm_size: Standard_D2_v2

执行ansible-playbook命令。

$ ansible-playbook aks.yaml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [Create Azure Kubernetes Service] *********************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [localhost]

TASK [Create resource group] *******************************************************************************************************************************************************
changed: [localhost]

TASK [Create AKS Cluster] **********************************************************************************************************************************************************
[WARNING]: Azure API profile latest does not define an entry for ContainerServiceClient
changed: [localhost]

PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
スクリーンショット 2021-10-31 15.07.08.png

节点扩容

我现在创建了一个拥有一个节点的系统,但是我要将它扩展为两个节点。

      agent_pool_profiles:
        - name: agentpool1
          mode: System
          count: 2
          vm_size: Standard_D2_v2

我把之前Playbook中agent_pool_profiles内的count从1改成了2。

再次执行ansible-playbook命令。

$ ansible-playbook aks.yaml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [Create Azure Kubernetes Service] *********************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [localhost]

TASK [Create resource group] *******************************************************************************************************************************************************
ok: [localhost]

TASK [Create AKS Cluster] **********************************************************************************************************************************************************
[WARNING]: Azure API profile latest does not define an entry for ContainerServiceClient
changed: [localhost]

PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
スクリーンショット 2021-10-31 15.16.59.png

如果将计数的值重新设为1并应用,就会进行缩减。

节点的扩展(SKU更改)

尝试修改节点大小。
我刚刚将Playbook中的agent_pool_profiles中的vm_size从”Standard_D2_v2″更改为”Standard_D3_v2″。

      agent_pool_profiles:
        - name: agentpool1
          mode: System
          count: 1
          vm_size: Standard_D3_v2
$ ansible-playbook aks.yaml
〜略〜
TASK [Create AKS Cluster] **********************************************************************************************************************************************************
[WARNING]: Azure API profile latest does not define an entry for ContainerServiceClient
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Error creating the AKS instance: Operation failed with status: 'Bad Request'. Details: Changing property 'agentPoolProfile.vmSize' is not allowed."}

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

抱歉,无法直接更改现有节点池的虚拟机大小,已经出现错误。

那么,我们先添加一个新的节点池,待添加完成后再删除旧的节点池,来进行试验。
原来的agentpool1的大小保持为“Standard_D2_v2”,然后我们新增了agentpool2。

      agent_pool_profiles:
        - name: agentpool1
          mode: System
          count: 1
          vm_size: Standard_D2_v2
        - name: agentpool2
          mode: System
          count: 1
          vm_size: Standard_D3_v2
$ ansible-playbook aks.yaml
〜略〜
PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
スクリーンショット 2021-10-31 15.34.55.png

從Playbook中刪除agentpool1的描述,然後重新執行。

      agent_pool_profiles:
        - name: agentpool2
          mode: System
          count: 1
          vm_size: Standard_D3_v2
$ ansible-playbook aks.yaml
〜略〜
PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
スクリーンショット 2021-10-31 15.37.54.png

AKS集群进行版本升级。

我最初的Playbook在Kubernetes版本1.20.7上创建了,但现在要进行升级。

    azure.azcollection.azure_rm_aks:
      name: akstest
      kubernetes_version: 1.20.9
      location: japaneast
      resource_group: aks_rg
      dns_prefix: akstest

更改 kubernetes_version 的值并执行 ansible-playbook。

$ ansible-playbook aks.yaml
〜略〜
PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
スクリーンショット 2021-10-31 15.51.12.png

另外,Ansible的模块中有一个名为azure_rm_aksupgrade_info的模块,可以获取指定AKS集群可升级的目标版本列表。

我們將創建並執行以下類似的Playbook。

- name: Get available upgrade version for AKS instance
  hosts: localhost
  connection: local
  tasks:
  - name: Get available upgrade version
    azure.azcollection.azure_rm_aksupgrade_info:
      name: akstest
      resource_group: aks_rg
    register: upgradable_version
  - name: Show Versions
    debug:
      msg: "{{ upgradable_version }}"
$ ansible-playbook aksupgrade_info.yaml
〜略〜
TASK [Get available upgrade version] ***********************************************************************************************************************************************
[WARNING]: Azure API profile latest does not define an entry for ContainerServiceClient
ok: [localhost]

TASK [Show Versions] ***************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": {
        "azure_aks_upgrades": {
            "agent_pool_profiles": null,
            "control_plane_profile": {
                "kubernetes_version": "1.20.9",
                "name": null,
                "os_type": "Linux",
                "upgrades": [
                    {
                        "is_preview": null,
                        "kubernetes_version": "1.21.1"
                    },
                    {
                        "is_preview": null,
                        "kubernetes_version": "1.21.2"
                    }
                ]
            }
        },
        "changed": false,
        "failed": false,
        "warnings": [
            "Azure API profile latest does not define an entry for ContainerServiceClient"
        ]
    }
}

PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

可以确认从1.20.9版本升级的可行版本有1.21.1和1.21.2。您可以结合这些版本编写一个名为“升级到最大可指定版本”的操作手册。

- name: Upgrade version for AKS instance
  hosts: localhost
  connection: local
  tasks:
  - name: Get available upgrade version
    azure.azcollection.azure_rm_aksupgrade_info:
      name: akstest
      resource_group: aks_rg
    register: upgradable_version
  - name: Upgrade AKS Cluster
    azure.azcollection.azure_rm_aks:
      name: akstest
      kubernetes_version: "{{ upgradable_version.azure_aks_upgrades.control_plane_profile.upgrades[-1].kubernetes_version }}"
      location: japaneast
      resource_group: aks_rg
      dns_prefix: akstest
      agent_pool_profiles:
        - name: agentpool2
          mode: System
          count: 1
          vm_size: Standard_D3_v2

删除 AKS 集群

您可以使用以下的Playbook来删除AKS集群。

- name: Delete AKS instance
  hosts: localhost
  connection: local
  tasks:
  - name: Delete AKS Cluster
    azure.azcollection.azure_rm_aks:
      name: akstest
      resource_group: aks_rg
      state: absent
$ ansible-playbook aks_delete.yaml
〜略〜
TASK [Delete AKS Cluster] **********************************************************************************************************************************************************
[WARNING]: Azure API profile latest does not define an entry for ContainerServiceClient
changed: [localhost]

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

最后

我在Ansible中发现可以对AKS进行各种操作。
根据文档,我看到可以更细致地指定AKS集群的选项,所以我会继续尝试操作。

请引用以下内容为中国母语的方式,只需一种选项:

参考资料

    • Microsoft公式ドキュメント

 

    • azure_rm_aksモジュールのドキュメント

 

    • azure_rm_aksversion_infoモジュールのドキュメント

 

    • azure_rm_aks_infoモジュールのドキュメント

 

    azure_rm_aksupgrade_infoモジュールのドキュメント
广告
将在 10 秒后关闭
bannerAds