Alibaba Cloud Container Compute Service (ACS) memungkinkan Anda menerapkan kontrol jaringan berbasis kebijakan dengan Kubernetes NetworkPolicy. Gunakan kebijakan jaringan untuk mengontrol lalu lintas jaringan pada level alamat IP atau port untuk aplikasi tertentu di kluster Anda. Topik ini menjelaskan cara menggunakan kebijakan jaringan di kluster ACS dan menyediakan kasus penggunaan umum.
Penerapan
-
Hanya Pod CPU general-purpose dan komputasi-teroptimalkan yang didukung.
-
Hanya IPv4 yang didukung.
Catatan
-
Aturan NetworkPolicy memungkinkan Anda memilih namespace atau Pod menggunakan LabelSelector. Namun, menerapkan lebih banyak NetworkPolicy pada sebuah Pod akan meningkatkan waktu yang diperlukan agar aturan tersebut berlaku. Banyaknya aturan NetworkPolicy juga dapat mempersulit manajemen dan troubleshooting kluster. Oleh karena itu, batasi jumlah NetworkPolicy di kluster Anda hingga kurang dari 40.
Langkah 1: Aktifkan NetworkPolicy
-
Instal komponen Poseidon.
-
Masuk ke Konsol ACS. Di panel navigasi kiri, klik Clusters.
-
Di halaman Clusters, klik nama kluster target. Di panel navigasi kiri, klik Add-ons.
-
Di halaman Component management, klik tab Network. Pada kartu Poseidon, klik Install.
-
Di halaman Install Component Poseidon, pilih Enable NetworkPolicy, lalu klik Confirm.
Setelah komponen terinstal, Installed akan muncul di pojok kanan atas kartu.
-
-
Aktifkan NetworkPolicy dalam anotasi Pod.
Untuk mengaktifkan NetworkPolicy pada sebuah Pod, tambahkan anotasi berikut ke metadata-nya:
network.alibabacloud.com/enable-network-policy-agent: "true".apiVersion: v1 kind: Pod metadata: annotations: network.alibabacloud.com/enable-network-policy-agent: "true" name: example namespace: default spec: containers: - image: nginx imagePullPolicy: IfNotPresent name: example
Langkah 2: Buat aplikasi uji Nginx
kubectl
-
Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
-
Buat aplikasi Nginx dan komunikasikan melalui Service bernama nginx.
Buat aplikasi Nginx:
kubectl run nginx --image=nginxOutput yang diharapkan:
pod/nginx createdPeriksa status pod:
kubectl get podOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 45sBuat Service bernama nginx:
kubectl expose pod nginx --port=80Output yang diharapkan:
service/nginx exposedLihat Service:
kubectl get serviceOutput yang diharapkan:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 172.XX.XX.1 <none> 443/TCP 30m nginx ClusterIP 172.XX.XX.48 <none> 80/TCP 12s -
Buat Pod bernama busybox dan akses Service bernama nginx.
kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/shOutput yang diharapkan:
If you don't see a command prompt, try pressing enter. / # / #Uji akses ke Nginx:
If you don't see a command prompt, try pressing enter. / # / # wget nginx # Enter wget nginx here.Output yang diharapkan:
Connecting to nginx (172.XX.XX.48:80) saving to 'index.html' index.html 100% |****************************************************************************************************************************************************| 612 0:00:00 ETA 'index.html' saved
Langkah 3: Gunakan kebijakan jaringan
Anda dapat menggunakan kebijakan jaringan dalam skenario berikut sesuai kebutuhan.
Skenario 1: Izinkan akses berdasarkan label
kubectl
-
Gunakan templat YAML berikut dan jalankan perintah
vim policy.yamluntuk membuat filepolicy.yaml.vim policy.yamlBerikut adalah isi file YAML tersebut.
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: access-nginx spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: access: "true" -
Buat kebijakan jaringan dari file policy.yaml.
kubectl apply -f policy.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/access-nginx created -
Saat label akses tidak ditentukan, permintaan ke Service bernama nginx akan timeout dan gagal.
kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/shUji akses ke Service bernama nginx:
wget nginxOutput yang diharapkan:
Connecting to nginx (172.19.XX.XX:80) wget: can't connect to remote host (172.19.XX.XX): Connection timed out -
Tentukan label akses.
kubectl run busybox --rm -ti --labels="access=true" --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/shUji Service Nginx:
wget nginxOutput yang diharapkan:
Connecting to nginx (172.21.XX.XX:80) saving to 'index.html' index.html 100% |****************************************************************************************************************************************************| 612 0:00:00 ETA 'index.html' savedProgres 100% menunjukkan koneksi berhasil ke layanan Nginx.
Skenario 2: Batasi akses berdasarkan blok CIDR sumber
kubectl
-
Buat layanan SLB Alibaba Cloud untuk aplikasi Nginx dan atur
type=LoadBalanceruntuk mengekspos layanan Nginx ke internet.vim nginx-service.yamlBerikut adalah isi untuk file nginx-service.yaml.
# Paste the following YAML content into nginx-service.yaml. apiVersion: v1 kind: Service metadata: labels: run: nginx name: nginx-slb spec: externalTrafficPolicy: Local ports: - port: 80 protocol: TCP targetPort: 80 selector: run: nginx type: LoadBalancerBuat layanan dari file nginx-service.yaml.
kubectl apply -f nginx-service.yamlOutput yang diharapkan:
service/nginx-slb createdPeriksa apakah aplikasi mengekspos layanan Nginx:
kubectl get service nginx-slbOutput yang diharapkan:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-slb LoadBalancer 172.19.xx.xxx 47.110.xxx.xxx 80:32240/TCP 8m -
Akses alamat IP instans SLB, 47.110.xxx.xxx. Koneksi gagal.
wget 47.110.xxx.xxxOutput yang diharapkan:
--2018-11-21 11:46:05-- http://47.110.xx.xxx/ Connecting to 47.110.XX.XX:80... failed: Connection refused.CatatanKoneksi gagal karena alasan berikut:
-
Kebijakan jaringan hanya mengizinkan akses dari aplikasi dengan label
access=true. -
Traffic dari alamat IP SLB berasal dari luar kluster. Kebijakan jaringan saat ini hanya mengizinkan traffic dari pod dengan label tertentu, bukan traffic eksternal.
Solusi: Modifikasi kebijakan jaringan untuk menambahkan blok CIDR sumber yang diizinkan.
-
-
Periksa alamat IP mesin lokal Anda.
curl myip.ipip.netOutput yang diharapkan:
Current IP: 10.0.x.x From: China Beijing Beijing # This is an example. The actual output from your device may vary. -
Modifikasi file policy.yaml yang telah Anda buat.
vim policy.yamlModifikasi file policy.yaml sebagai berikut:
# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: access-nginx spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: access: "true" - ipBlock: cidr: 100.64.0.0/10 - ipBlock: cidr: 10.0.0.1/24 # Your local IP address. This is an example. Your actual address may vary.Terapkan kebijakan yang diperbarui:
kubectl apply -f policy.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/access-nginx unchangedCatatan-
Beberapa jaringan memiliki beberapa alamat IP egress. Gunakan rentang alamat /24 dalam kasus ini.
-
Alamat pemeriksaan kesehatan SLB berada di blok alamat
100.64.0.0/10. Oleh karena itu, Anda harus mengonfigurasi100.64.0.0/10.
-
-
Jalankan pod uji untuk mengakses layanan Nginx.
kubectl run busybox --rm -ti --labels="access=true" --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/shAkses layanan Nginx:
wget 47.110.XX.XXOutput yang diharapkan:
Connecting to 47.110.XX.XX (47.110.XX.XX:80) index.html 100% |***********************************************************| 612 0:00:00 ETAProgres 100% menunjukkan koneksi berhasil ke layanan Nginx.
Skenario 3: Batasi akses pod ke alamat tertentu
Kubectl
-
Lakukan resolusi domain www.aliyun.com.
dig +short www.aliyun.comOutput yang diharapkan:
www-jp-de-intl-adns.aliyun.com. www-jp-de-intl-adns.aliyun.com.gds.alibabadns.com. v6wagbridge.aliyun.com. v6wagbridge.aliyun.com.gds.alibabadns.com. 106.XX.XX.21 140.XX.XX.4 140.XX.XX.13 140.XX.XX.3 -
Buat file busybox-policy.
vim busybox-policy.yamlFile
busybox-policy.yamlberisi hal berikut:# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: busybox-policy spec: podSelector: matchLabels: run: busybox egress: - to: - ipBlock: cidr: 106.XX.XX.21/32 - ipBlock: cidr: 140.XX.XX.4/32 - ipBlock: cidr: 140.XX.XX.13/32 - ipBlock: cidr: 140.XX.XX.3/32 - to: - ipBlock: cidr: 0.0.0.0/0 - namespaceSelector: {} ports: - protocol: UDP port: 53CatatanAturan
egressdalam filebusybox-policy.yamlmembatasi akses arah keluar aplikasi. Untuk memastikan resolusi DNS berfungsi, kebijakan juga harus mengizinkan permintaan UDP pada port 53. -
Buat kebijakan jaringan dari file
busybox-policy.yaml.kubectl apply -f busybox-policy.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/busybox-policy created -
Buat pod
busyboxuntuk menguji kebijakan.kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/shCoba akses website selain www.aliyun.com, misalnya, www.taobao.com:
wget www.taobao.comOutput yang diharapkan:
Connecting to www.taobao.com (64.13.XX.XX:80) wget: can't connect to remote host (64.13.XX.XX): Connection timed outPesan
can't connect to remote hostmenunjukkan bahwa akses ke layanan ditolak. -
Coba akses www.aliyun.com.
wget www.aliyun.comOutput yang diharapkan:
Connecting to www.aliyun.com (140.205.XX.XX:80) Connecting to www.aliyun.com (140.205.XX.XX:443) wget: note: TLS certificate validation not implemented index.html 100% |***********************************************************| 462k 0:00:00 ETAStatus penyelesaian 100% menunjukkan koneksi berhasil.
Kasus Penggunaan 4: Kontrol akses jaringan publik untuk Pod
Operasi ini dapat memengaruhi layanan online yang mengakses jaringan publik. Kami menyarankan Anda melakukan langkah-langkah berikut di namespace kosong.
kubectl
-
Buat namespace uji untuk memverifikasi pembatasan.
Buat namespace bernama
test-np.kubectl create ns test-npOutput yang diharapkan:
namespace/test-np created -
Atur kebijakan jaringan default untuk namespace ini yang hanya mengizinkan traffic arah keluar ke jaringan pribadi.
vim default-deny.yamlBuat file bernama
default-deny.yamldengan isi berikut:# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: namespace: test-np name: deny-public-net spec: podSelector: {} ingress: - from: - ipBlock: cidr: 0.0.0.0/0 egress: - to: - ipBlock: cidr: 192.168.0.0/16 - ipBlock: cidr: 172.16.0.0/12 - ipBlock: cidr: 10.0.0.0/8Buat kebijakan jaringan dari file
default-deny.yaml.kubectl apply -f default-deny.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/deny-public-net createdLihat kebijakan jaringan:
kubectl get networkpolicy -n test-npOutput yang diharapkan:
NAME POD-SELECTOR AGE deny-public-net <none> 1m -
Izinkan Pod dengan label tertentu untuk mengakses jaringan publik.
vim allow-specify-label.yamlContoh label adalah
public-network=true.# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-public-network-for-labels namespace: test-np spec: podSelector: matchLabels: public-network: "true" ingress: - from: - ipBlock: cidr: 0.0.0.0/0 egress: - to: - ipBlock: cidr: 0.0.0.0/0 - namespaceSelector: matchLabels: ns: kube-systemJalankan perintah berikut untuk membuat kebijakan jaringan:
kubectl apply -f allow-specify-label.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/allow-public-network-for-labels createdLihat kebijakan jaringan:
kubectl get networkpolicy -n test-npOutput yang diharapkan:
NAME POD-SELECTOR AGE allow-public-network-for-labels public-network=true 1m deny-public-net <none> 3m -
Verifikasi bahwa Pod tanpa label tertentu tidak dapat mengakses jaringan publik.
kubectl run -it --namespace test-np --rm --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 busybox-intranetping aliyun.comOutput yang diharapkan:
PING aliyun.com (106.11.2xx.xxx): 56 data bytes ^C --- aliyun.com ping statistics --- 9 packets transmitted, 0 packets received, 100% packet lossPesan
0 packets receivedmenunjukkan bahwa akses gagal.CatatanAkses gagal karena kebijakan jaringan
deny-public-netsecara default memblokir akses jaringan publik untuk semua Pod di namespacetest-np. -
Verifikasi bahwa Pod dengan label
public-network=truedapat mengakses jaringan publik.kubectl run -it --namespace test-np --labels public-network=true --rm --image registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 busybox-internetping aliyun.comOutput yang diharapkan:
PING aliyun.com (106.11.1xx.xx): 56 data bytes 64 bytes from 106.11.1xx.xx: seq=0 ttl=47 time=4.235 ms 64 bytes from 106.11.1xx.xx: seq=1 ttl=47 time=4.200 ms 64 bytes from 106.11.1xx.xx: seq=2 ttl=47 time=4.182 ms ^C --- aliyun.com ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 4.182/4.205/4.235 msPesan
0% packet lossmenunjukkan akses berhasil ke jaringan publik.CatatanAkses berhasil karena kebijakan jaringan
allow-public-network-for-labelsmemberikan akses jaringan publik kepada Pod dengan labelpublic-network=true, seperti Podbusybox-internet.