重要
需要 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 服务主体:创建服务主体,记下以下值:appId、displayName、密码和 租户。
安装 Ansible:执行以下其中一项操作:
- 在 Linux 虚拟机上安装 并 配置 Ansible
- 配置 Azure Cloud Shell,如果无权访问 Linux 虚拟机,使用 Ansible创建虚拟机。
创建虚拟网络和子网
本部分中的示例剧本代码用于:
- 创建虚拟网络
- 在虚拟网络中创建子网
将以下 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_id
和client_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
清理资源
将以下代码另存为
delete_rg.yml
。--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
使用 ansible-playbook 命令运行 playbook。 将占位符替换为要删除的资源组的名称。 资源组中的所有资源都将被删除。
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
要点:
- 由于 playbook 的
register
变量和debug
部分,因此在命令完成时,将显示结果。
- 由于 playbook 的
后续步骤
教程:使用 Ansible 在 AKS 中配置 Microsoft Entra ID