Tutorial: Mengonfigurasi jaringan kubenet di Azure Kubernetes Service (AKS) menggunakan Ansible
Penting
Ansible 2.8 (atau yang lebih baru) diperlukan untuk menjalankan sampel playbook dalam artikel ini.
Azure Kubernetes Service (AKS) memudahkan penyebaran kluster Kubernetes terkelola di Azure. AKS mengurangi kerumitan dan operasional yang berlebih dalam mengelola Kubernetes dengan mengalihkan sebagian besar tanggung jawab tersebut ke Azure. Sebagai layanan Kubernetes yang dihosting, Azure menangani tugas-tugas penting, seperti pemantauan dan pemeliharaan kesehatan. Master Kubernetes dikelola oleh Azure. Anda hanya mengelola dan memelihara node agen. Sebagai layanan Kubernetes terkelola, AKS gratis - Anda hanya perlu membayar node agen dalam kluster Anda; bukan untuk master.
Dengan AKS, Anda dapat menyebarkan kluster yang menggunakan model jaringan berikut:
- Jaringan Kubenet - Sumber daya jaringan biasanya dibuat dan dikonfigurasi saat kluster AKS diterapkan.
- Jaringan Azure Container Networking Interface (CNI) - kluster AKS terhubung ke sumber daya dan konfigurasi jaringan virtual yang ada.
Untuk informasi selengkapnya tentang jaringan ke aplikasi Anda di AKS, lihat Konsep jaringan untuk aplikasi di AKS.
Dalam artikel ini, Anda akan mempelajari cara:
- Membuat kluster AKS
- Konfigurasikan jaringan kubenet Azure
Prasyarat
- Langganan Azure: Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum memulai.
- Perwakilan layanan Azure: Buat perwakilan layanan, catat nilai-nilai berikut: appId, displayName, kata sandi, dan penyewa.
Instal Ansible: Lakukan salah satu opsi berikut:
- Menginstal dan mengonfigurasi Ansibel pada mesin virtual Linux
- Konfigurasikan Azure Cloud Shell dan - jika Anda tidak memiliki akses ke mesin virtual Linux - buat mesin virtual dengan Ansible.
Membuat jaringan virtual dan subnet
Kode playbook di bagian ini membuat sumber daya Azure berikut:
- Jaringan virtual
- Subnet di dalam jaringan virtual
Simpan playbook berikut sebagai 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
Membuat kluster AKS di jaringan virtual
Kode playbook di bagian ini membuat kluster AKS dalam jaringan virtual.
Simpan playbook berikut sebagai 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
Berikut adalah beberapa catatan penting yang perlu dipertimbangkan saat bekerja dengan sampel playbook:
Gunakan modul
azure_rm_aks_version
untuk menemukan versi yang didukung.vnet_subnet_id
adalah subnet yang dibuat di bagian sebelumnya.network_profile
mendefinisikan properti untuk plug-in jaringan kubenet.service_cidr
digunakan untuk menetapkan layanan internal di kluster AKS ke alamat IP. Rentang alamat IP ini harus berupa ruang alamat yang tidak digunakan di luar kluster AKS. Namun, Anda dapat menggunakan kembali CIDR layanan yang sama untuk beberapa kluster AKS.Alamat
dns_service_ip
harus berupa alamat ".10" dari rentang alamat IP layanan Anda.pod_cidr
harus berupa ruang alamat besar yang tidak digunakan di tempat lain di lingkungan jaringan Anda. Rentang alamat ini harus cukup besar untuk mengakomodasi jumlah node yang ingin Anda tingkatkan skalanya. Anda tidak dapat mengubah rentang alamat ini setelah kluster disebarkan. Seperti halnya layanan CIDR, rentang IP ini seharusnya tidak ada di luar kluster AKS, tetapi dapat digunakan kembali dengan aman di seluruh kluster.Rentang alamat IP pod digunakan untuk menetapkan ruang alamat /24 ke setiap simpul dalam kluster. Dalam contoh berikut,
pod_cidr
dari 192.168.0.0/16 menetapkan node pertama 192.168.0.0/24, node kedua 192.168.1.0/24, dan node ketiga 192.168.2.0/24.Seiring kluster melakukan penskalaan atau peningkatan, Azure terus menetapkan rentang alamat IP pod ke setiap node baru.
Playbook memuat
ssh_key
dari~/.ssh/id_rsa.pub
. Jika Anda memodifikasinya, gunakan format satu baris - dimulai dengan "ssh-rsa" (tanpa tanda kutip).Nilai
client_id
danclient_secret
dimuat dari~/.azure/credentials
, yang merupakan file informasi masuk default. Anda dapat mengatur nilai-nilai ini ke perwakilan layanan Anda atau memuat nilai-nilai ini dari variabel lingkungan:client_id: "{{ lookup('env', 'AZURE_CLIENT_ID') }}" client_secret: "{{ lookup('env', 'AZURE_SECRET') }}"
Mengaitkan sumber daya jaringan
Saat Anda membuat kluster AKS, grup keamanan jaringan dan tabel rute akan dibuat secara otomatis. Sumber daya ini dikelola oleh AKS dan diperbarui saat Anda membuat dan mengekspos layanan. Kaitkan grup keamanan jaringan dan tabel rute dengan subnet jaringan virtual Anda sebagai berikut.
Simpan playbook berikut sebagai 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 }}"
Berikut adalah beberapa catatan penting yang perlu dipertimbangkan saat bekerja dengan sampel playbook:
node_resource_group
adalah nama grup sumber daya di mana node AKS dibuat.vnet_subnet_id
adalah subnet yang dibuat di bagian sebelumnya.
Jalankan sampel playbook
Bagian ini mencantumkan playbook sampel lengkap, yang memanggil pembuatan tugas dalam artikel ini.
Simpan playbook berikut sebagai 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]
Di bagian vars
, buat perubahan berikut:
- Untuk kunci
resource_group
, ubah nilaiaksansibletest
ke nama grup sumber daya Anda. - Untuk kunci
name
, ubah nilaiaksansibletest
ke nama AKS Anda. - Untuk kunci
Location
, ubah nilaieastus
ke lokasi grup sumber daya Anda.
Jalankan playbook lengkap menggunakan perintah ansible-playbook
:
ansible-playbook aks-kubenet.yml
Menjalankan playbook menunjukkan hasil yang mirip dengan output berikut:
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
Membersihkan sumber daya
Simpan kode berikut sebagai
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Jalankan playbook menggunakan perintah ansible-playbook. Ganti tempat penampung dengan nama grup sumber daya yang akan dihapus. Semua sumber daya dalam grup sumber daya akan dihapus.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Poin utama:
- Karena variabel
register
dan bagiandebug
dari playbook, hasilnya akan ditampilkan ketika perintah selesai.
- Karena variabel
Langkah berikutnya
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk