Tutorial: Configurar a rede CNI do Azure no Serviço de Kubernetes do Azure (AKS) usando o Ansible
Importante
O Ansible 2.8 (ou posterior) é necessário para executar os guias estratégicos de exemplo deste artigo.
O AKS (Serviço de Kubernetes do Azure) simplifica a implantação de um cluster do Kubernetes gerenciado no Azure. O AKS reduz a complexidade e a sobrecarga operacional de gerenciar o Kubernetes passando grande parte dessa responsabilidade para o Azure. Como um serviço Kubernetes hospedado, o Azure lida com as tarefas críticas para você, como o monitoramento da integridade e a manutenção. Os mestres de Kubernetes são gerenciados pelo Azure. Você só gerencia e mantém os nós de agente. Como um serviço do Kubernetes gerenciado, o AKS é gratuito: você paga apenas pelos nós de agentes dentro dos clusters, não pelos mestres.
Com o AKS, você pode implantar um cluster que usa os modelos de rede a seguir:
- Rede Kubenet – os recursos de rede normalmente são criados e configurados à medida que o cluster AKS é implantado.
- Rede CNI do Azure – o cluster AKS é conectado a recursos e configurações de rede virtual (VNET) existentes.
Para saber mais sobre o sistema de rede para seus aplicativos no AKS, confira Conceitos de rede para aplicativos no AKS.
Neste artigo, você aprenderá como:
- Criar um cluster AKS
- Configurar a rede CNI do Azure
Pré-requisitos
- Assinatura do Azure: caso você não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar.
- Entidade de serviço do Azure: crie uma entidade de serviço anotando os seguintes valores: appId, displayName, password e tenant.
Instalar o Ansible: escolha uma das seguintes opções:
- Instalar e configurar o Ansible em uma máquina virtual do Linux
- Configurar o Azure Cloud Shell e, se você não tiver acesso a uma máquina virtual do Linux, criar uma máquina virtual com o Ansible.
Criar a rede virtual e a sub-rede
O código do guia estratégico de exemplo nesta seção é usado para:
- Criar uma rede virtual
- Criar uma sub-rede dentro da rede virtual
Salve o guia estratégico a seguir como 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
Criar um cluster do AKS na rede virtual
O código do guia estratégico de exemplo nesta seção é usado para:
- Criar um cluster do AKS dentro de uma rede virtual.
Salve o guia estratégico a seguir como 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
Há algumas observações importantes a serem consideradas ao trabalhar com o guia estratégico de exemplo:
Use o módulo
azure_rm_aks_version
para encontrar a versão com suporte.O
vnet_subnet_id
é a sub-rede criada na seção anterior.O guia estratégico carrega
ssh_key
a partir de~/.ssh/id_rsa.pub
. Se for modificá-lo, use o formato de linha única, começando com "ssh-rsa" (sem as aspas).Os valores
client_id
eclient_secret
são carregados de~/.azure/credentials
, que é o arquivo de credencial padrão. Você pode definir esses valores para sua entidade de serviço ou carregar esses valores a partir de variáveis de ambiente:client_id: "{{ lookup('env', 'AZURE_CLIENT_ID') }}" client_secret: "{{ lookup('env', 'AZURE_SECRET') }}"
Executar o guia estratégico de exemplo
O código do exemplo de guia estratégico nesta seção é usado para testar vários recursos mostrados ao longo deste tutorial.
Salve o guia estratégico a seguir como 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
Há algumas observações importantes a serem consideradas ao trabalhar com o guia estratégico de exemplo:
- Altere o valor de
aksansibletest
para o nome do grupo de recursos. - Altere o valor de
aksansibletest
para o nome do AKS. - Altere o valor de
eastus
para a localização do grupo de recursos.
Execute o guia estratégico usando o comando ansible-playbook:
ansible-playbook aks-azure-cni.yml
Depois de executar o guia estratégico, você verá resultados semelhantes aos seguintes:
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
Limpar os recursos
Salve o código a seguir como
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Execute o guia estratégico usando o comando ansible-playbook. Substitua o espaço reservado pelo nome do grupo de recursos a ser excluído. Todos os recursos dentro do grupo de recursos serão excluídos.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Pontos principais:
- Devido à variável
register
e à seçãodebug
do guia estratégico, os resultados são exibidos quando o comando é concluído.
- Devido à variável