Öğretici: Ansible kullanarak Azure Kubernetes Service'te (AKS) kubenet ağını yapılandırma
Önemli
Bu makaledeki örnek playbook'ları çalıştırmak için Ansible 2.8 (veya üzeri) gereklidir.
Azure Kubernetes Service (AKS), Azure'da yönetilen bir Kubernetes kümesi dağıtmayı kolaylaştırır. AKS, sorumluluğun çoğunu Azure'a devrederek Kubernetes yönetiminin karmaşıklığını ve işlemsel yükünü azaltır. Barındırılan bir Kubernetes hizmeti olarak, Azure sistem durumu izleme ve bakım gibi kritik görevleri sizin için gerçekleştirir. Kubernetes ana düğümler Azure tarafından yönetilir. Siz yalnızca aracı düğümlerini yönetir ve sürdürürsünüz. Yönetilen bir Kubernetes hizmeti olarak AKS ücretsizdir; yalnızca kümelerinizdeki aracı düğümleri için ödeme gerçekleştirirsiniz; Ustalar için değil.
AKS kullanarak aşağıdaki ağ modellerini kullanarak bir küme dağıtabilirsiniz:
- Kubenet ağı - Aks kümesi dağıtılırken ağ kaynakları genellikle oluşturulur ve yapılandırılır.
- Azure Container Networking Interface (CNI) ağı - AKS kümesi mevcut sanal ağ kaynaklarına ve yapılandırmalarına bağlıdır.
AKS'deki uygulamalarınıza ağ oluşturma hakkında daha fazla bilgi için bkz . AKS'deki uygulamalar için ağ kavramları.
Bu makalede şunları öğreneceksiniz:
- AKS kümesi oluşturma
- Azure kubenet ağını yapılandırma
Önkoşullar
- Azure aboneliği: Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
- Azure hizmet sorumlusu: Aşağıdaki değerleri not ederek bir hizmet sorumlusu oluşturun: appId, displayName, password ve tenant.
Ansible'ı Yükleme: Aşağıdaki seçeneklerden birini yapın:
- Ansible'ı Linux sanal makinesine yükleme ve yapılandırma
- Azure Cloud Shell'i yapılandırın ve Linux sanal makinesine erişiminiz yoksa Ansible ile bir sanal makine oluşturun.
Sanal ağ ve alt ağ oluşturma
Bu bölümdeki playbook kodu aşağıdaki Azure kaynaklarını oluşturur:
- Sanal ağ
- Sanal ağ içinde alt ağ
Aşağıdaki playbook'u vnet.yml
olarak kaydedin:
- 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
Sanal ağda AKS kümesi oluşturma
Bu bölümdeki playbook kodu, sanal ağ içinde bir AKS kümesi oluşturur.
Aşağıdaki playbook'u aks.yml
olarak kaydedin:
- 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
Örnek playbook ile çalışırken göz önünde bulundurmanız gereken bazı önemli notlar şunlardır:
Desteklenen sürümü bulmak için modülü kullanın
azure_rm_aks_version
.vnet_subnet_id
, önceki bölümde oluşturulan alt ağdır.,
network_profile
kubenet ağ eklentisinin özelliklerini tanımlar.service_cidr
, AKS kümesindeki iç hizmetleri bir IP adresine atamak için kullanılır. Bu IP adresi aralığı, AKS kümelerinin dışında kullanılmayan bir adres alanı olmalıdır. Ancak, aynı hizmet CIDR'yi birden çok AKS kümesi için yeniden kullanabilirsiniz.Adres,
dns_service_ip
hizmet IP adresi aralığınızın ".10" adresi olmalıdır.pod_cidr
, ağ ortamınızın başka bir yerinde kullanılmamış büyük bir adres alanı olmalıdır. Adres aralığı, ölçeği artırmayı beklediğiniz düğüm sayısını karşılayacak kadar büyük olmalıdır. Küme dağıtıldıktan sonra bu adres aralığını değiştiremezsiniz. Hizmet CIDR'de olduğu gibi, bu IP aralığı AKS kümesinin dışında bulunmamalıdır, ancak kümeler arasında güvenli bir şekilde yeniden kullanılabilir.Pod IP adresi aralığı, kümedeki her düğüme /24 adres alanı atamak için kullanılır. Aşağıdaki örnekte,
pod_cidr
192.168.0.0/16'nın ilk düğümü 192.168.0.0/24, ikinci düğüm 192.168.1.0/24 ve üçüncü düğümü 192.168.2.0/24 atar.Küme ölçeklendikçe veya yükseltildikçe Azure, her yeni düğüme bir pod IP adresi aralığı atamaya devam eder.
playbook'u içinden
~/.ssh/id_rsa.pub
yüklenirssh_key
. Bunu değiştirirseniz, "ssh-rsa" ile başlayan (tırnak işaretleri olmadan) tek satırlı biçimi kullanın.client_id
veclient_secret
değerleri, varsayılan kimlik bilgisi dosyası olan dosyasından~/.azure/credentials
yüklenir. Bu değerleri hizmet sorumlunuza ayarlayabilir veya ortam değişkenlerinden bu değerleri yükleyebilirsiniz:client_id: "{{ lookup('env', 'AZURE_CLIENT_ID') }}" client_secret: "{{ lookup('env', 'AZURE_SECRET') }}"
Ağ kaynaklarını ilişkilendirme
AKS kümesi oluşturduğunuzda, bir ağ güvenlik grubu ve yol tablosu oluşturulur. Bu kaynaklar AKS tarafından yönetilir ve hizmetleri oluşturup kullanıma sunduğunuzda güncelleştirilir. Ağ güvenlik grubunu ve yönlendirme tablosunu aşağıdaki gibi sanal ağ alt ağınızla ilişkilendirin.
Aşağıdaki playbook'u olarak associate.yml
kaydedin.
- 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 }}"
Örnek playbook ile çalışırken göz önünde bulundurmanız gereken bazı önemli notlar şunlardır:
node_resource_group
, AKS düğümlerinin oluşturulduğu kaynak grubu adıdır.vnet_subnet_id
, önceki bölümde oluşturulan alt ağdır.
Örnek playbook'u çalıştırma
Bu bölümde, bu makalede oluşturma görevlerini çağıran örnek playbook'un tamamı listelenmiştir.
Aşağıdaki playbook'u aks-kubenet.yml
olarak kaydedin:
---
- 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]
vars
bölümünde aşağıdaki değişiklikleri yapın:
- Anahtar için
resource_group
değeri kaynak grubunuzun adıylaaksansibletest
değiştirin. - Anahtar için
name
değeri AKS adınız olarak değiştirinaksansibletest
. - Anahtar için
Location
değeri kaynak grubu konumunuza değiştirineastus
.
komutunu kullanarak playbook'un ansible-playbook
tamamını çalıştırın:
ansible-playbook aks-kubenet.yml
Playbook çalıştırılırken aşağıdaki çıkışa benzer sonuçlar gösterilir:
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
Kaynakları temizleme
Aşağıdaki kodu olarak
delete_rg.yml
kaydedin.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
ansible-playbook komutunu kullanarak playbook'u çalıştırın. Yer tutucuyu silinecek kaynak grubunun adıyla değiştirin. Kaynak grubundaki tüm kaynaklar silinir.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Önemli noktalar:
- Playbook'un
register
değişkeni vedebug
bölümü nedeniyle, komut tamamlandığında sonuçlar görüntülenir.
- Playbook'un