Mengamankan lalu lintas antar pod dengan menggunakan kebijakan jaringan di AKS
Saat Anda menjalankan aplikasi modern berbasis layanan mikro di Kube, Anda sering kali ingin mengontrol komponen mana yang dapat berkomunikasi satu sama lain. Prinsip hak istimewa paling rendah harus diterapkan pada bagaimana lalu lintas dapat mengalir antar pod dalam kluster Azure Kubernetes Service (AKS). Katakanlah Anda ingin memblokir lalu lintas langsung ke aplikasi back-end. Fitur Kebijakan Jaringan di Kubernetes memungkinkan Anda menentukan aturan untuk lalu lintas masuk dan keluar antar pod dalam sebuah cluster.
Artikel ini menunjukkan cara memasang mesin kebijakan jaringan dan membuat kebijakan jaringan Kube untuk mengontrol arus lalu lintas antar Pod di AKS. Kebijakan jaringan dapat digunakan untuk simpul dan pod berbasis Linux atau berbasis Windows di AKS.
Secara default, semua Pod dalam kluster AKS dapat mengirim dan menerima lalu lintas tanpa batasan. Untuk meningkatkan keamanan, Anda dapat menentukan aturan yang mengontrol arus lalu lintas. Aplikasi back-end sering hanya terkena layanan front-end yang diperlukan, misalnya. Atau, komponen database hanya dapat diakses oleh tingkat aplikasi yang terhubung ke mereka.
Kebijakan jaringan adalah spesifikasi Kubernetes yang menentukan kebijakan akses untuk komunikasi antar pod. Saat menggunakan kebijakan jaringan, Anda menentukan sekumpulan aturan yang diurutkan untuk mengirim dan menerima lalu lintas. Anda menerapkan aturan ke kumpulan pod yang cocok dengan satu atau beberapa pemilih label.
Aturan kebijakan jaringan didefinisikan sebagai manifes YAML. Kebijakan jaringan dapat dimasukkan sebagai bagian dari manifes yang lebih luas yang juga menciptakan penyebaran atau layanan.
Azure menyediakan tiga mesin Kebijakan Jaringan untuk memberlakukan kebijakan jaringan:
- Cilium untuk kluster AKS yang menggunakan Azure CNI Powered by Cilium.
- Azure Network Policy Manager.
- Calico, jaringan sumber terbuka dan solusi keamanan jaringan yang didirikan oleh Tigera.
Cilium adalah mesin Kebijakan Jaringan yang direkomendasikan. Cilium memberlakukan kebijakan jaringan pada lalu lintas menggunakan Linux Berkeley Packet Filter (BPF), yang umumnya lebih efisien daripada "IPTables". Lihat detail selengkapnya dalam dokumentasi Azure CNI Powered by Cilium.
Untuk menerapkan kebijakan yang ditentukan, Azure Network Policy Manager untuk Linux menggunakan Linux IPTables. Azure Network Policy Manager untuk Windows menggunakan ACLPolicies Host Network Service (HNS). Kebijakan diterjemahkan ke dalam set pasangan IP yang diizinkan dan yang tidak. Pasangan ini kemudian diprogram sebagai IPTable
atau HNS ACLPolicy
aturan filter.
Kemampuan | Azure Network Policy Manager | Calico | Cilium |
---|---|---|---|
Platform yang didukung | Linux, Windows Server 2022 (Pratinjau). | Linux, Windows Server 2019 dan 2022. | Linux. |
Opsi jaringan yang didukung | Antarmuka Jaringan Kontainer Azure (CNI). | Azure CNI (Linux, Windows Server 2019 dan 2022) dan kubenet (Linux). | Azure CNI. |
Kepatuhan terhadap spesifikasi Kube | Semua tipe kebijakan yang didukung | Semua jenis kebijakan didukung. | Semua jenis kebijakan didukung. |
Fitur lainnya | Tidak ada. | Model kebijakan yang diperluas yang terdiri dari Kebijakan Jaringan Global, Set Jaringan Global, dan Titik Akhir Host. Untuk informasi selengkapnya tentang menggunakan calicoctl CLI untuk mengelola fitur yang diperluas ini, lihat referensi pengguna calicoctl. |
Tidak ada. |
Dukungan | Didukung oleh tim Dukungan dan Teknik Azure. | Didukung oleh tim Dukungan dan Teknik Azure. | Didukung oleh tim Dukungan dan Teknik Azure. |
Catatan
Dengan Azure NPM untuk Linux, kami tidak mengizinkan penskalaan melebihi 250 simpul dan 20.000 pod. Jika Anda mencoba menskalakan melebihi batas ini, Anda mungkin mengalami kesalahan Kehabisan Memori (OOM ). Untuk skalabilitas yang lebih baik dan dukungan IPv6, dan jika batasan berikut menjadi perhatian, sebaiknya gunakan atau tingkatkan ke Azure CNI Powered by Cilium untuk menggunakan Cilium sebagai mesin kebijakan jaringan.
Azure NPM tidak mendukung IPv6. Jika tidak, ini sepenuhnya mendukung spesifikasi kebijakan jaringan di Linux.
Di Windows, Azure NPM tidak mendukung fitur spesifikasi kebijakan jaringan berikut:
- Port bernama.
- Protokol Transmisi Kontrol Aliran (SCTP).
- Label pencocokan negatif atau pemilih namespace layanan. Misalnya, semua label kecuali
debug=true
. except
blok perutean interdomain tanpa kelas (CIDR) (CIDR dengan pengecualian).
Catatan
Log pod Azure Network Policy Manager merekam kesalahan jika kebijakan jaringan yang tidak didukung dibuat.
Dalam beberapa kasus yang jarang terjadi, ada kemungkinan untuk mencapai kondisi balapan yang mungkin mengakibatkan konektivitas sementara dan tidak terduga untuk koneksi baru ke/dari pod pada node yang terkena dampak saat mengedit atau menghapus kebijakan jaringan "cukup besar". Mencapai kondisi balapan ini tidak pernah berdampak pada koneksi aktif.
Jika kondisi balapan ini terjadi untuk sebuah simpul, pod Azure NPM pada simpul tersebut memasuki status di mana ia tidak dapat memperbarui aturan keamanan, yang mungkin menyebabkan konektivitas yang tidak terduga untuk koneksi baru ke/dari pod pada simpul yang terkena dampak. Untuk mengurangi masalah, pod Azure NPM secara otomatis memulai ulang ~15 detik setelah memasuki status ini. Saat Azure NPM memulai ulang pada simpul yang terkena dampak, Azure NPM menghapus semua aturan keamanan, lalu menerapkan kembali aturan keamanan untuk semua kebijakan jaringan. Meskipun semua aturan keamanan sedang diterapkan kembali, ada kemungkinan konektivitas sementara dan tidak terduga untuk koneksi baru ke/dari pod pada simpul yang terkena dampak.
Untuk membatasi kemungkinan mencapai kondisi balapan ini, Anda dapat mengurangi ukuran kebijakan jaringan. Masalah ini kemungkinan besar terjadi untuk kebijakan jaringan dengan beberapa ipBlock
bagian. Kebijakan jaringan dengan empat bagian atau kurang ipBlock
cenderung mengalami masalah.
Anda memerlukan Azure CLI versi 2.0.61 atau yang lebih baru terpasang dan terkonfigurasi. Jalankan az --version
untuk menemukan versinya. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.
Untuk melihat kebijakan jaringan dalam tindakan, Anda membuat kluster AKS yang mendukung kebijakan jaringan lalu bekerja pada penambahan kebijakan.
Untuk menggunakan Azure Network Policy Manager, Anda harus menggunakan plug-in Azure CNI. Calico dapat digunakan dengan plug-in Azure CNI atau dengan plug-in CNI Kubenet.
Contoh skrip berikut membuat kluster AKS dengan identitas yang ditetapkan sistem dan mengaktifkan kebijakan jaringan dengan menggunakan Azure Network Policy Manager.
Catatan
Calico dapat digunakan dengan --network-plugin azure
parameter atau --network-plugin kubenet
.
Alih-alih menggunakan identitas yang ditetapkan sistem, Anda juga dapat menggunakan identitas yang ditetapkan pengguna. Untuk informasi selengkapnya, lihat Menggunakan identitas terkelola.
Di bagian ini, Anda membuat kluster dengan kumpulan simpul Linux dan Azure Network Policy Manager diaktifkan.
Untuk memulai, Anda mengganti nilai untuk $RESOURCE_GROUP_NAME
variabel dan $CLUSTER_NAME
.
$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$LOCATION=canadaeast
Buat kluster AKS dan tentukan azure
untuk network-plugin
dan network-policy
.
Untuk membuat kluster, gunakan perintah berikut:
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--network-plugin azure \
--network-policy azure \
--generate-ssh-keys
Membuat kluster AKS dengan Azure Network Policy Manager diaktifkan - Windows Server 2022 (pratinjau)
Di bagian ini, Anda membuat kluster dengan kumpulan simpul Windows dan Azure Network Policy Manager diaktifkan.
Catatan
Azure Network Policy Manager dengan simpul Windows hanya tersedia di Windows Server 2022.
Penting
Fitur pratinjau AKS tersedia berdasarkan layanan mandiri. Pratinjau disediakan "apa adanya" dan "sebagaimana tersedia," dan mereka dikecualikan dari perjanjian tingkat layanan dan garansi terbatas. Pratinjau AKS sebagian dicakup oleh dukungan pelanggan berdasarkan upaya terbaik. Dengan demikian, fitur-fitur ini tidak dimaksudkan untuk penggunaan produksi. Untuk informasi lebih lanjut, lihat artikel dukungan berikut ini:
Untuk menginstal aks-preview
ekstensi, jalankan perintah berikut:
az extension add --name aks-preview
Untuk memperbarui ke versi terbaru ekstensi yang dirilis, jalankan perintah berikut:
az extension update --name aks-preview
Daftarkan WindowsNetworkPolicyPreview
bendera fitur dengan menggunakan perintah daftar fitur az, seperti yang ditunjukkan dalam contoh berikut:
az feature register --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"
Dibutuhkan beberapa menit agar status menampilkan Terdaftar. Verifikasi status pendaftaran dengan menggunakan perintah az feature show :
az feature show --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"
Saat status mencerminkan Terdaftar, refresh pendaftaran Microsoft.ContainerService
penyedia sumber daya dengan menggunakan perintah az provider register :
az provider register --namespace Microsoft.ContainerService
Sekarang, Anda mengganti nilai untuk $RESOURCE_GROUP_NAME
variabel , $CLUSTER_NAME
, dan $WINDOWS_USERNAME
.
$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$WINDOWS_USERNAME=myWindowsUserName
$LOCATION=canadaeast
Buat nama pengguna untuk digunakan sebagai informasi masuk admin untuk kontainer Windows Server pada kluster Anda. Perintah berikut meminta nama pengguna kepada Anda. Atur ke $WINDOWS_USERNAME
. Ingatlah bahwa perintah dalam artikel ini dimasukkan ke dalam shell Bash.
echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
Untuk membuat kluster, gunakan perintah berikut:
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--windows-admin-username $WINDOWS_USERNAME \
--network-plugin azure \
--network-policy azure \
--generate-ssh-keys
Perlu waktu beberapa menit untuk membuat kluster tersebut. Secara default, kluster Anda dibuat hanya dengan kumpulan simpul Linux. Jika Anda ingin menggunakan kumpulan simpul Windows, Anda dapat menambahkannya. Berikut contohnya:
az aks nodepool add \
--resource-group $RESOURCE_GROUP_NAME \
--cluster-name $CLUSTER_NAME \
--os-type Windows \
--name npwin \
--node-count 1
Buat kluster AKS dan tentukan --network-plugin azure
, dan --network-policy calico
. Menentukan --network-policy calico
mengaktifkan Calico pada kumpulan simpul Linux dan Windows.
Jika Anda berencana menambahkan kumpulan simpul Windows ke kluster Anda, sertakan windows-admin-username
parameter dan windows-admin-password
yang memenuhi persyaratan kata sandi Windows Server.
Penting
Saat ini, menggunakan kebijakan jaringan Calico dengan simpul Windows tersedia pada kluster baru dengan menggunakan Kubernetes versi 1.20 atau yang lebih baru dengan Calico 3.17.2 dan mengharuskan Anda menggunakan jaringan Azure CNI. Simpul Windows pada kluster AKS dengan Calico diaktifkan juga mengaktifkan IP Mengambang secara default.
Untuk kluster dengan hanya kumpulan simpul Linux yang menjalankan Kubernetes 1.20 dengan versi Calico yang lebih lama, versi Calico secara otomatis meningkatkan ke 3.17.2.
Buat nama pengguna untuk digunakan sebagai informasi masuk admin untuk kontainer Windows Server pada kluster Anda. Perintah berikut meminta nama pengguna kepada Anda. Atur ke $WINDOWS_USERNAME
. Ingatlah bahwa perintah dalam artikel ini dimasukkan ke dalam shell Bash.
echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--windows-admin-username $WINDOWS_USERNAME \
--network-plugin azure \
--network-policy calico \
--generate-ssh-keys
Perlu waktu beberapa menit untuk membuat kluster tersebut. Secara default, kluster Anda dibuat hanya dengan kumpulan simpul Linux. Jika Anda ingin menggunakan kumpulan simpul Windows, Anda dapat menambahkannya. Contohnya:
az aks nodepool add \
--resource-group $RESOURCE_GROUP_NAME \
--cluster-name $CLUSTER_NAME \
--os-type Windows \
--name npwin \
--node-count 1
Menginstal Azure Network Policy Manager atau Calico pada kluster AKS yang ada juga didukung.
Peringatan
Proses peningkatan memicu setiap kumpulan simpul untuk di-image ulang secara bersamaan. Meningkatkan setiap kumpulan simpul secara terpisah tidak didukung. Dalam setiap kumpulan simpul, simpul dicitrakan ulang mengikuti proses yang sama seperti dalam operasi peningkatan versi Kubernetes standar di mana simpul buffer ditambahkan sementara untuk meminimalkan gangguan pada aplikasi yang berjalan saat proses pencitraan ulang simpul sedang berlangsung. Oleh karena itu gangguan apa pun yang mungkin terjadi mirip dengan apa yang akan Anda harapkan selama peningkatan gambar node atau operasi peningkatan versi Kubernetes.
Contoh perintah untuk menginstal Azure Network Policy Manager:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy azure
Contoh perintah untuk menginstal Calico:
Peringatan
Peringatan ini berlaku untuk meningkatkan kluster Kubenet dengan Calico diaktifkan ke Azure CNI Overlay dengan Calico diaktifkan.
- Di kluster Kubenet dengan Calico diaktifkan, Calico digunakan sebagai CNI dan mesin kebijakan jaringan.
- Di kluster Azure CNI, Calico hanya digunakan untuk penegakan kebijakan jaringan, bukan sebagai CNI. Hal ini dapat menyebabkan penundaan singkat antara ketika pod dimulai dan ketika Calico mengizinkan lalu lintas keluar dari pod.
Disarankan untuk menggunakan Cilium alih-alih Calico untuk menghindari masalah ini. Pelajari selengkapnya tentang Cilium di Azure CNI Powered by Cilium
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy calico
Meningkatkan kluster yang sudah ada yang menginstal Azure NPM atau Calico ke Azure CNI Powered by Cilium
Untuk meningkatkan kluster yang ada yang memiliki mesin Kebijakan Jaringan yang diinstal ke Azure CNI Powered by Cilium, lihat Meningkatkan kluster yang ada ke Azure CNI Powered by Cilium
Ketika kluster sudah siap, konfigurasikan kubectl
untuk terhubung ke kluster Kube menggunakan perintah az aks get-credentials. Perintah ini mengunduh informasi masuk dan mengonfigurasi CLI Kube untuk menggunakannya:
az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
Untuk memulai verifikasi kebijakan jaringan, Anda membuat aplikasi sampel dan menetapkan aturan lalu lintas.
Pertama, buat namespace layanan yang dipanggil demo
untuk menjalankan contoh pod:
kubectl create namespace demo
Sekarang buat dua pod di kluster bernama client
dan server
.
Catatan
Jika Anda ingin menjadwalkan klien atau server pada simpul tertentu, tambahkan bit berikut sebelum --command
argumen dalam perintah kubectl run pembuatan pod:
--overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux|windows"}}}'
Buat server
pod. Pod ini berfungsi pada port TCP 80:
kubectl run server -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --labels="app=server" --port=80 --command -- /agnhost serve-hostname --tcp --http=false --port "80"
Buat client
pod. Perintah berikut menjalankan Bash pada client
pod:
kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --command -- bash
Sekarang, di jendela terpisah, jalankan perintah berikut untuk mendapatkan IP server:
kubectl get pod --output=wide -n demo
Output akan terlihat seperti ini:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
server 1/1 Running 0 30s 10.224.0.72 akswin22000001 <none> <none>
Di shell klien, jalankan perintah berikut untuk memverifikasi konektivitas dengan server. Ganti server-ip
dengan menggunakan IP yang ditemukan dalam output dari menjalankan perintah sebelumnya. Jika koneksi berhasil, tidak ada output.
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Untuk menambahkan kebijakan jaringan, buat file bernama demo-policy.yaml
dan tempel manifes YAML berikut:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: demo-policy
namespace: demo
spec:
podSelector:
matchLabels:
app: server
ingress:
- from:
- podSelector:
matchLabels:
app: client
ports:
- port: 80
protocol: TCP
Tentukan nama manifes YAML Anda dan terapkan dengan menggunakan kubectl apply:
kubectl apply –f demo-policy.yaml
Sekarang, di shell klien, verifikasi konektivitas dengan server dengan menjalankan perintah berikut /agnhost
:
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Konektivitas dengan lalu lintas diblokir karena server diberi label , app=server
tetapi klien tidak diberi label. Perintah connect sebelumnya menghasilkan output ini:
TIMEOUT
Jalankan perintah berikut untuk memberi client
label dan memverifikasi konektivitas dengan server. Output tidak boleh mengembalikan apa pun.
kubectl label pod client -n demo app=client
Persyaratan:
- Azure CLI versi 2.63 atau yang lebih baru
Catatan
- Proses penghapusan instalasi tidak menghapus Definisi Sumber Daya Kustom (CRD) dan Sumber Daya Kustom (CR) yang digunakan oleh Calico. CRD dan CR ini semuanya memiliki nama yang diakhir dengan "projectcalico.org" atau "tigera.io". CRD ini dan CR terkait dapat dihapus secara manual setelah Calico berhasil dihapus instalasinya (menghapus CRD sebelum menghapus Calico merusak kluster).
- Peningkatan tidak akan menghapus sumber daya NetworkPolicy apa pun di kluster, tetapi setelah penghapusan instalan kebijakan ini tidak lagi diberlakukan.
Peringatan
Proses peningkatan memicu setiap kumpulan simpul untuk di-image ulang secara bersamaan. Meningkatkan setiap kumpulan simpul secara terpisah tidak didukung. Gangguan apa pun pada jaringan kluster mirip dengan peningkatan gambar simpul atau peningkatan versi Kubernetes di mana setiap simpul dalam kumpulan simpul di-image ulang.
Untuk menghapus Azure Network Policy Manager atau Calico dari kluster, jalankan perintah berikut:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy none
Dalam artikel ini, Anda membuat namespace layanan dan dua pod dan menerapkan kebijakan jaringan. Untuk membersihkan sumber daya ini, gunakan perintah kubectl delete dan tentukan nama sumber daya:
kubectl delete namespace demo
Untuk informasi selengkapnya tentang sumber daya jaringan, lihat Konsep jaringan untuk aplikasi di Azure Kubernetes Service (AKS).
Untuk mempelajari kebijakan lebih lanjut, lihat kebijakan jaringan Kube.
Umpan balik Azure Kubernetes Service
Azure Kubernetes Service adalah proyek sumber terbuka. Pilih tautan untuk memberikan umpan balik: