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.

Gambaran umum kebijakan jaringan

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.

Opsi kebijakan jaringan di AKS

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.

Perbedaan antara mesin Kebijakan Jaringan: Cilium, Azure NPM, dan Calico

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.

Batasan

Azure Network Policy Manager tidak mendukung IPv6. Jika tidak, Azure Network Policy Manager sepenuhnya mendukung spesifikasi kebijakan jaringan di Linux.

Di Windows, Azure Network Policy Manager tidak mendukung:

  • Port bernama.
  • Protokol Transmisi Kontrol Aliran (SCTP).
  • Label kecocokan 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 yang tidak didukung dibuat.

Sisik

Dengan Azure Network Policy Manager 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 meningkatkan batas memori Anda, buat tiket dukungan.

Sebelum Anda mulai

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.

Membuat kluster AKS dan mengaktifkan kebijakan jaringan

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.

Membuat kluster AKS dengan Azure Network Policy Manager diaktifkan - Hanya Linux

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

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.

Menginstal ekstensi Azure CLI pratinjau aks

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

Mendaftarkan bendera fitur WindowsNetworkPolicyPreview

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

Membuat kluster AKS

Sekarang, Anda mengganti nilai untuk $RESOURCE_GROUP_NAMEvariabel , $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

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

Membuat kluster AKS dengan Calico diaktifkan

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 turut mengaktifkan Direct Server Return (DSR) 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

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 di kluster yang ada

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. 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.

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

Memverifikasi penyiapan kebijakan jaringan

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>

Menguji konektivitas tanpa kebijakan jaringan

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

Menguji konektivitas dengan kebijakan jaringan

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

Koneksi ivitas dengan lalu lintas diblokir karena server diberi app=serverlabel , 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

Menghapus instalan Azure Network Policy Manager atau Calico (Pratinjau)

Persyaratan:

  • aks-preview ekstensi Azure CLI versi 0.5.166 atau yang lebih baru. Lihat Menginstal ekstensi Azure CLI pratinjau aks.
  • Azure CLI versi 2.54 atau yang lebih baru
  • AKS REST API versi 2023-08-02-preview 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

Membersihkan sumber daya

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

Langkah berikutnya

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.