Självstudie: Konfigurera kubenet-nätverk i Azure Kubernetes Service (AKS) med Ansible
Viktigt!
Ansible 2.8 (eller senare) krävs för att köra exempelspelböckerna i den här artikeln.
Azure Kubernetes Service (AKS) gör det enkelt att distribuera ett hanterat Kubernetes-kluster i Azure. AKS minskar komplexiteten och arbetet med att hantera Kubernetes genom att avlasta en stor del av det ansvaret till Azure. Som Kubernetes-värdtjänst hanterar Azure viktiga uppgifter som övervakning av hälsotillstånd och underhåll åt dig. Kubernetes-huvudservrar hanteras av Azure. Du kan endast hantera och underhålla agentnoderna. Som en hanterad Kubernetes-tjänst är AKS kostnadsfri – du betalar bara för agentnoderna i dina kluster. inte för mästarna.
Med hjälp av AKS kan du distribuera ett kluster med hjälp av följande nätverksmodeller:
- Kubenet-nätverk – Nätverksresurser skapas och konfigureras vanligtvis när AKS-klustret distribueras.
- CNI-nätverk (Azure Container Networking Interface) – AKS-klustret är anslutet till befintliga virtuella nätverksresurser och konfigurationer.
Mer information om nätverk till dina program i AKS finns i Nätverksbegrepp för program i AKS.
I den här artikeln kan du se hur du:
- Skapa ett AKS-kluster
- Konfigurera Azure kubenet-nätverk
Förutsättningar
- Azure-prenumeration: Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.
- Azure-tjänstens huvudnamn: Skapa ett huvudnamn för tjänsten och anteckna följande värden: appId, displayName, lösenord och klientorganisation.
Installera Ansible: Gör något av följande alternativ:
- Installera och konfigurera Ansible på en virtuell Linux-dator
- Konfigurera Azure Cloud Shell och – om du inte har åtkomst till en virtuell Linux-dator – skapa en virtuell dator med Ansible.
Skapa ett virtuellt nätverk och ett undernät
Spelbokskoden i det här avsnittet skapar följande Azure-resurser:
- Virtuellt nätverk
- Undernät i det virtuella nätverket
Spara följande spelbok som 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
Skapa ett AKS-kluster i det virtuella nätverket
Spelbokskoden i det här avsnittet skapar ett AKS-kluster i ett virtuellt nätverk.
Spara följande spelbok som aks.yml
:
- name: List supported kubernetes version from Azure
azure_rm_aks_version:
location: "{{ location }}"
register: versions
- name: Create AKS cluster with 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: kubenet
pod_cidr: 192.168.0.0/16
docker_bridge_cidr: 172.17.0.1/16
dns_service_ip: 10.0.0.10
service_cidr: 10.0.0.0/16
register: aks
Här följer några viktiga kommentarer att tänka på när du arbetar med exempelspelboken:
Använd
azure_rm_aks_version
modulen för att hitta den version som stöds.vnet_subnet_id
är det undernät som skapades i föregående avsnitt.network_profile
Definierar egenskaperna för kubenet-nätverkets plugin-program.service_cidr
Används för att tilldela interna tjänster i AKS-klustret till en IP-adress. Det här IP-adressintervallet ska vara ett adressutrymme som inte används utanför AKS-klustren. Du kan dock återanvända samma tjänst-CIDR för flera AKS-kluster.Adressen
dns_service_ip
ska vara ".10"-adressen för tjänstens IP-adressintervall.pod_cidr
Bör vara ett stort adressutrymme som inte används någon annanstans i nätverksmiljön. Adressintervallet måste vara tillräckligt stort för att rymma det antal noder som du förväntar dig att skala upp till. Du kan inte ändra det här adressintervallet när klustret har distribuerats. Precis som med tjänst-CIDR bör det här IP-intervallet inte finnas utanför AKS-klustret, men det kan återanvändas på ett säkert sätt mellan kluster.Ip-adressintervallet för podden används för att tilldela ett /24-adressutrymme till varje nod i klustret. I följande exempel
pod_cidr
tilldelar 192.168.0.0/16 den första noden 192.168.0.0/24, den andra noden 192.168.1.0/24 och den tredje noden 192.168.2.0/24.När klustret skalar eller uppgraderas fortsätter Azure att tilldela en podd-IP-adressintervall till varje ny nod.
Spelboken läses in
ssh_key
från~/.ssh/id_rsa.pub
. Om du ändrar det använder du enkelradsformatet – från och med "ssh-rsa" (utan citattecken).Värdena
client_id
ochclient_secret
läses in från~/.azure/credentials
, vilket är standardfilen för autentiseringsuppgifter. Du kan ange dessa värden till tjänstens huvudnamn eller läsa in dessa värden från miljövariabler:client_id: "{{ lookup('env', 'AZURE_CLIENT_ID') }}" client_secret: "{{ lookup('env', 'AZURE_SECRET') }}"
Associera nätverksresurserna
När du skapar ett AKS-kluster skapas en nätverkssäkerhetsgrupp och routningstabell. Dessa resurser hanteras av AKS och uppdateras när du skapar och exponerar tjänster. Associera nätverkssäkerhetsgruppen och routningstabellen med ditt virtuella nätverksundernät på följande sätt.
Spara följande spelbok som associate.yml
.
- name: Get route table
azure_rm_routetable_facts:
resource_group: "{{ node_resource_group }}"
register: routetable
- name: Get network security group
azure_rm_securitygroup_facts:
resource_group: "{{ node_resource_group }}"
register: nsg
- name: Parse subnet id
set_fact:
subnet_name: "{{ vnet_subnet_id | regex_search(subnet_regex, '\\1') }}"
subnet_rg: "{{ vnet_subnet_id | regex_search(rg_regex, '\\1') }}"
subnet_vn: "{{ vnet_subnet_id | regex_search(vn_regex, '\\1') }}"
vars:
subnet_regex: '/subnets/(.+)'
rg_regex: '/resourceGroups/(.+?)/'
vn_regex: '/virtualNetworks/(.+?)/'
- name: Associate network resources with the node subnet
azure_rm_subnet:
name: "{{ subnet_name[0] }}"
resource_group: "{{ subnet_rg[0] }}"
virtual_network_name: "{{ subnet_vn[0] }}"
security_group: "{{ nsg.ansible_facts.azure_securitygroups[0].id }}"
route_table: "{{ routetable.route_tables[0].id }}"
Här följer några viktiga kommentarer att tänka på när du arbetar med exempelspelboken:
node_resource_group
är resursgruppens namn där AKS-noderna skapas.vnet_subnet_id
är det undernät som skapades i föregående avsnitt.
Kör exempelspelboken
I det här avsnittet visas den fullständiga exempelspelboken som anropar de uppgifter som skapas i den här artikeln.
Spara följande spelbok som aks-kubenet.yml
:
---
- hosts: localhost
vars:
resource_group: aksansibletest
name: aksansibletest
location: eastus
tasks:
- name: Ensure resource group exist
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: Associate network resources with the node subnet
vars:
vnet_subnet_id: "{{ subnet.state.id }}"
node_resource_group: "{{ aks.node_resource_group }}"
include_tasks: associate.yml
- name: Get details of the AKS
azure_rm_aks_facts:
name: "{{ name }}"
resource_group: "{{ resource_group }}"
show_kubeconfig: user
register: output
- name: Show AKS cluster detail
debug:
var: output.aks[0]
I avsnittet vars
gör du följande ändringar:
resource_group
För nyckeln ändrar du värdetaksansibletest
till resursgruppens namn.name
För nyckeln ändrar du värdetaksansibletest
till ditt AKS-namn.Location
För nyckeln ändrar du värdeteastus
till resursgruppens plats.
Kör den fullständiga spelboken med kommandot ansible-playbook
:
ansible-playbook aks-kubenet.yml
När du kör spelboken visas resultat som liknar följande utdata:
PLAY [localhost]
TASK [Gathering Facts]
ok: [localhost]
TASK [Ensure resource group exist]
ok: [localhost]
TASK [Create vnet]
included: /home/devops/aks-kubenet/vnet.yml for localhost
TASK [Create vnet]
ok: [localhost]
TASK [Create subnet]
ok: [localhost]
TASK [Create AKS]
included: /home/devops/aks-kubenet/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 [Associate network resources with the node subnet]
included: /home/devops/aks-kubenet/associate.yml for localhost
TASK [Get route table]
ok: [localhost]
TASK [Get network security group]
ok: [localhost]
TASK [Parse subnet id]
ok: [localhost]
TASK [Associate network resources with the node subnet]
changed: [localhost]
TASK [Get details of the AKS]
ok: [localhost]
TASK [Show AKS cluster detail]
ok: [localhost] => {
"output.aks[0]": {
"id": /subscriptions/BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB/resourcegroups/aksansibletest/providers/Microsoft.ContainerService/managedClusters/aksansibletest",
"kube_config": "apiVersion: ...",
"location": "eastus",
"name": "aksansibletest",
"properties": {
"agentPoolProfiles": [
{
"count": 3,
"maxPods": 110,
"name": "nodepool1",
"osDiskSizeGB": 100,
"osType": "Linux",
"storageProfile": "ManagedDisks",
"vmSize": "Standard_D2_v2",
"vnetSubnetID": "/subscriptions/BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB/resourceGroups/aksansibletest/providers/Microsoft.Network/virtualNetworks/aksansibletest/subnets/aksansibletest"
}
],
"dnsPrefix": "aksansibletest",
"enableRBAC": false,
"fqdn": "aksansibletest-cda2b56c.hcp.eastus.azmk8s.io",
"kubernetesVersion": "1.12.6",
"linuxProfile": {
"adminUsername": "azureuser",
"ssh": {
"publicKeys": [
{
"keyData": "ssh-rsa ..."
}
]
}
},
"networkProfile": {
"dnsServiceIP": "10.0.0.10",
"dockerBridgeCidr": "172.17.0.1/16",
"networkPlugin": "kubenet",
"podCidr": "192.168.0.0/16",
"serviceCidr": "10.0.0.0/16"
},
"nodeResourceGroup": "MC_aksansibletest_pcaksansibletest_eastus",
"provisioningState": "Succeeded",
"servicePrincipalProfile": {
"clientId": "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"
}
},
"type": "Microsoft.ContainerService/ManagedClusters"
}
}
PLAY RECAP
localhost : ok=15 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Rensa resurser
Spara följande kod som
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Kör spelboken med kommandot ansible-playbook . Ersätt platshållaren med namnet på den resursgrupp som ska tas bort. Alla resurser i resursgruppen tas bort.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Viktiga punkter:
- På grund av variabeln
register
ochdebug
avsnittet i spelboken visas resultatet när kommandot har slutförts.
- På grund av variabeln