使用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
节点扩容
我现在创建了一个拥有一个节点的系统,但是我要将它扩展为两个节点。
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
如果将计数的值重新设为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
從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
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
另外,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モジュールのドキュメント