Pengantar Kebijakan Jaringan Kubernet untuk Profesional Keamanan



Catatan perev. : Penulis artikel - Reuven Harrison - memiliki lebih dari 20 tahun pengalaman dalam pengembangan perangkat lunak, dan hari ini adalah direktur teknis dan salah satu pendiri Tufin, sebuah perusahaan yang menciptakan solusi manajemen kebijakan keamanan. Mempertimbangkan kebijakan jaringan Kubernetes sebagai alat yang cukup kuat untuk segmentasi jaringan dalam sebuah cluster, ia percaya bahwa mereka tidak begitu mudah untuk diterapkan dalam praktik. Materi ini (agak banyak) dirancang untuk meningkatkan pengetahuan spesialis dalam hal ini dan membantu mereka dalam membuat konfigurasi yang diperlukan.

Saat ini, banyak perusahaan semakin memilih Kubernetes untuk menjalankan aplikasi mereka. Ketertarikan pada perangkat lunak ini sangat tinggi sehingga beberapa orang menyebut Kubernetes "sistem operasi pusat data baru." Secara bertahap, Kubernetes (atau k8s) mulai dianggap sebagai bagian penting dari bisnis, yang membutuhkan organisasi proses bisnis yang matang, termasuk keamanan jaringan.

Untuk para profesional keamanan yang bingung karena bekerja dengan Kubernetes, kebijakan default platform ini mungkin merupakan penemuan nyata: biarkan semuanya.

Panduan ini akan membantu Anda memahami struktur internal kebijakan jaringan; Pahami perbedaannya dari aturan untuk firewall biasa. Beberapa jebakan juga akan dijelaskan dan rekomendasi akan diberikan yang akan membantu melindungi aplikasi di Kubernetes.

Kebijakan Jaringan Kubernetes


Mekanisme kebijakan jaringan Kubernetes memungkinkan Anda untuk mengontrol interaksi aplikasi yang digunakan pada platform di tingkat jaringan (yang ketiga dalam model OSI). Kebijakan jaringan tidak memiliki beberapa fitur canggih firewall modern, seperti pemantauan OSI tingkat 7 dan deteksi ancaman, tetapi mereka memberikan tingkat dasar keamanan jaringan, yang merupakan titik awal yang baik.

Kebijakan jaringan mengontrol komunikasi antar pod


Beban kerja Kubernet didistribusikan di seluruh pod yang terdiri dari satu atau lebih kontainer yang digunakan bersama. Kubernetes memberi setiap pod alamat IP yang dapat diakses dari pod lainnya. Kebijakan jaringan Kubernetes menetapkan izin untuk grup pod dengan cara yang sama seperti grup keamanan di cloud digunakan untuk mengontrol akses ke mesin virtual virtual.

Menentukan Kebijakan Jaringan


Seperti sumber daya Kubernet lainnya, kebijakan jaringan diatur dalam YAML. Pada contoh di bawah ini, balance diberikan akses ke postgres :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres namespace: default spec: podSelector: matchLabels: app: postgres ingress: - from: - podSelector: matchLabels: app: balance policyTypes: - Ingress 



( Catatan : tangkapan layar ini, seperti semua tangkapan layar serupa berikutnya, tidak dibuat menggunakan alat asli Kubernetes, tetapi menggunakan alat Tufin Orca, yang dikembangkan oleh penulis artikel asli dan disebutkan di akhir artikel.)

Menentukan kebijakan jaringan Anda sendiri akan membutuhkan pengetahuan dasar YAML. Bahasa ini didasarkan pada lekukan (ditentukan oleh spasi, bukan tab). Elemen indentasi milik elemen indentasi terdekat di atasnya. Item daftar baru dimulai dengan tanda hubung, semua item lainnya bernilai kunci .

Setelah mendeskripsikan kebijakan dalam YAML, gunakan kubectl untuk membuatnya di cluster:

 kubectl create -f policy.yaml 

Spesifikasi Kebijakan Jaringan


Spesifikasi Kebijakan Jaringan Kubernetes mencakup empat elemen:

  1. podSelector : mendefinisikan pod yang dipengaruhi oleh kebijakan (sasaran) ini - wajib;
  2. policyTypes : menunjukkan jenis kebijakan apa yang termasuk dalam ini: masuk dan / atau keluar - opsional, namun, saya sarankan Anda mendaftar secara eksplisit dalam semua kasus;
  3. ingress : menentukan lalu lintas masuk yang diizinkan ke pod target - opsional;
  4. egress : menentukan lalu lintas keluar yang diizinkan dari pod target - opsional.

Contoh yang dipinjam dari situs web Kubernetes (saya mengganti role dengan app ) menunjukkan bagaimana keempat elemen digunakan:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: # <<< matchLabels: app: db policyTypes: # <<< - Ingress - Egress ingress: # <<< - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: # <<< - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978 




Harap dicatat bahwa keempat elemen bersifat opsional. Hanya podSelector yang podSelector , parameter lain dapat digunakan sesuai keinginan.

Jika Anda menghilangkan policyTypes , kebijakan tersebut akan ditafsirkan sebagai berikut:

  • Secara default, diasumsikan bahwa itu mendefinisikan sisi masuknya. Jika kebijakan tidak secara eksplisit menunjukkan hal ini, sistem akan mempertimbangkan bahwa semua lalu lintas dilarang.
  • Perilaku di sisi jalan keluar akan ditentukan oleh ada atau tidak adanya parameter jalan keluar yang sesuai.

Untuk menghindari kesalahan, saya sarankan untuk selalu secara eksplisit menentukan policyTypes .

Sesuai dengan logika di atas, jika egress ingress dan / atau egress dihilangkan, kebijakan akan melarang semua lalu lintas (lihat "Aturan pengupasan" di bawah).

Kebijakan default adalah mengizinkan


Jika tidak ada kebijakan yang ditentukan, Kubernetes secara default memungkinkan semua lalu lintas. Semua pod bebas bertukar informasi satu sama lain. Dari sudut pandang keamanan, ini mungkin tampak berlawanan dengan intuisi, tetapi ingat bahwa Kubernet awalnya dibuat oleh pengembang untuk memastikan interoperabilitas aplikasi. Kebijakan jaringan ditambahkan kemudian.

Ruang nama


Ruang nama adalah mekanisme kolaboratif Kubernetes. Mereka dirancang untuk mengisolasi lingkungan logis dari satu sama lain, sementara pertukaran data antar ruang diizinkan secara default.

Seperti kebanyakan komponen Kubernetes, kebijakan jaringan berada di namespace tertentu. Di blok metadata , Anda bisa menentukan ruang mana kebijakan itu milik:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: my-namespace # <<< spec: ... 

Jika namespace tidak ditulis secara eksplisit dalam metadata, sistem akan menggunakan namespace yang ditentukan dalam kubectl (secara default namespace=default ):

 kubectl apply -n my-namespace -f namespace.yaml 

Saya merekomendasikan secara eksplisit menentukan namespace kecuali Anda menulis kebijakan yang ditujukan untuk beberapa namespace sekaligus.

Elemen podSelector utama dalam suatu kebijakan akan memilih pod dari namespace yang dimiliki kebijakan tersebut (ditolak akses ke pod dari namespace lain).

Demikian pula, podSelector dalam blok masuk dan keluar dapat memilih pod hanya dari namespace mereka, kecuali, jika Anda menggabungkannya dengan namespaceSelector (ini akan dibahas di bagian “Memfilter menurut namespace dan pod”) .

Aturan Penamaan Kebijakan


Nama kebijakan unik dalam satu ruang nama. Mungkin tidak ada dua kebijakan dengan nama yang sama dalam satu ruang, tetapi mungkin ada kebijakan dengan nama yang sama di ruang yang berbeda. Ini berguna ketika Anda ingin menerapkan kembali kebijakan yang sama di beberapa ruang.

Saya terutama menyukai satu cara penamaan. Ini terdiri dalam menggabungkan nama namespace dengan pod target. Sebagai contoh:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres # <<< namespace: default spec: podSelector: matchLabels: app: postgres ingress: - from: - podSelector: matchLabels: app: admin policyTypes: - Ingress 



Label


Label khusus dapat dilampirkan ke objek Kubernetes, seperti pod dan ruang nama. Label adalah setara dengan tag di cloud. Kebijakan jaringan Kubernetes menggunakan label untuk memilih pod yang mereka terapkan:

 podSelector: matchLabels: role: db 

... atau ruang nama yang mereka terapkan. Dalam contoh ini, semua pod di ruang nama dengan label yang sesuai dipilih:

 namespaceSelector: matchLabels: project: myproject 

Satu peringatan: ketika menggunakan namespaceSelector pastikan namespaceSelector Anda pilih berisi label yang Anda inginkan . Ingatlah bahwa ruang nama default seperti default dan kube-system tidak mengandung label secara default.

Anda dapat menambahkan label ke spasi sebagai berikut:

 kubectl label namespace default namespace=default 

Dalam kasus ini, namespace di bagian metadata harus merujuk ke nama sebenarnya dari spasi, dan bukan ke label:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default # <<< spec: ... 

Sumber dan Tujuan


Kebijakan untuk firewall terdiri dari aturan dengan sumber dan tujuan. Kebijakan jaringan Kubernetes didefinisikan untuk tujuan - satu set pod yang menerapkannya, dan kemudian menetapkan aturan untuk lalu lintas masuk (masuk) dan / atau keluar (keluar). Dalam contoh kami, target kebijakan adalah semua pod di namespace default dengan label dengan kunci app dan nilai db :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: app: db # <<< policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978 




ingress dalam kebijakan ini membuka lalu lintas masuk ke pod target. Dengan kata lain, masuknya adalah sumber, dan target adalah penerima yang tepat. Demikian pula, jalan keluar adalah target, dan target adalah sumbernya.



Ini sama dengan dua aturan untuk firewall: Ingress → Target; Sasaran → Jalan keluar.

Egress dan DNS (penting!)


Ketika membatasi lalu lintas keluar, perhatikan DNS - Kubernetes menggunakan layanan ini untuk memetakan layanan ke alamat IP. Misalnya, kebijakan berikut tidak akan berfungsi karena Anda tidak mengizinkan aplikasi balance mengakses DNS:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.balance namespace: default spec: podSelector: matchLabels: app: balance egress: - to: - podSelector: matchLabels: app: postgres policyTypes: - Egress 



Anda dapat memperbaikinya dengan membuka akses ke layanan DNS:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.balance namespace: default spec: podSelector: matchLabels: app: balance egress: - to: - podSelector: matchLabels: app: postgres - to: # <<< ports: # <<< - protocol: UDP # <<< port: 53 # <<< policyTypes: - Egress 



Elemen terakhir ke kosong, dan karena itu secara tidak langsung memilih semua pod di semua ruang nama , memungkinkan balance mengirim permintaan DNS ke layanan Kubernetes yang sesuai (biasanya bekerja di ruang kube-system kubus).

Pendekatan ini berfungsi, tetapi terlalu permisif dan tidak aman , karena memungkinkan Anda untuk mengarahkan permintaan DNS di luar cluster.

Anda dapat meningkatkannya dalam tiga langkah berturut-turut.

1. Izinkan permintaan DNS hanya di dalam cluster dengan menambahkan namespaceSelector :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.balance namespace: default spec: podSelector: matchLabels: app: balance egress: - to: - podSelector: matchLabels: app: postgres - to: - namespaceSelector: {} # <<< ports: - protocol: UDP port: 53 policyTypes: - Egress 



2. Izinkan permintaan DNS hanya di namespace kube-system .

Untuk melakukan ini, tambahkan label ke kubectl label namespace kube-system namespace=kube-system kube-system kubectl label namespace kube-system namespace=kube-system : kubectl label namespace kube-system namespace=kube-system - dan daftarkan dalam kebijakan menggunakan namespaceSelector :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.balance namespace: default spec: podSelector: matchLabels: app: balance egress: - to: - podSelector: matchLabels: app: postgres - to: - namespaceSelector: # <<< matchLabels: # <<< namespace: kube-system # <<< ports: - protocol: UDP port: 53 policyTypes: - Egress 



3. Paranoid dapat melangkah lebih jauh dan membatasi permintaan DNS ke layanan DNS tertentu di kube-system . Di bagian "Saring berdasarkan ruang nama & polong", kami akan menjelaskan cara mencapai ini.

Pilihan lain adalah menyelesaikan DNS di tingkat namespace. Dalam hal ini, tidak perlu dibuka untuk setiap layanan:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.dns namespace: default spec: podSelector: {} # <<< egress: - to: - namespaceSelector: {} ports: - protocol: UDP port: 53 policyTypes: - Egress 

podSelector kosong memilih semua pod di namespace.



Pertandingan pertama dan aturan pesanan


Dalam firewall biasa, tindakan ("Izinkan" atau "Tolak") untuk suatu paket ditentukan oleh aturan pertama yang dipenuhi. Di Kubernetes, urutan kebijakan tidak relevan.

Secara default, ketika kebijakan tidak disetel, komunikasi antar pod diperbolehkan dan mereka dapat bertukar informasi secara bebas. Segera setelah Anda mulai merumuskan kebijakan, setiap polong yang dipengaruhi oleh setidaknya satu dari mereka menjadi terisolasi sesuai dengan disjungsi (logis ATAU) dari semua kebijakan yang telah memilihnya. Pod tidak terpengaruh oleh kebijakan apa pun tetap terbuka.

Anda dapat mengubah perilaku ini menggunakan aturan stripping.

Aturan pengupasan (Tolak)


Kebijakan firewall umumnya melarang lalu lintas yang tidak sah secara eksplisit.

Kubernetes tidak memiliki tindakan penolakan , namun, efek yang sama dapat dicapai dengan kebijakan reguler (memungkinkan) dengan memilih grup pod sumber kosong (masuk):

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all namespace: default spec: podSelector: {} policyTypes: - Ingress 



Kebijakan ini memilih semua pod di namespace dan membiarkan masuknya tidak terdefinisi, memblokir semua lalu lintas masuk.

Demikian pula, Anda dapat membatasi semua lalu lintas keluar dari namespace:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-egress namespace: default spec: podSelector: {} policyTypes: - Egress 



Perhatikan bahwa kebijakan tambahan apa pun yang memungkinkan lalu lintas ke pod di namespace akan didahulukan dari aturan ini (mirip dengan menambahkan aturan perbolehkan atas aturan penolakan dalam konfigurasi firewall).

Allow All (Any-Any-Any-Allow)


Untuk membuat kebijakan Allow All, Anda harus menambahkan kebijakan larangan di atas dengan elemen ingress kosong:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all namespace: default spec: podSelector: {} ingress: # <<< - {} # <<< policyTypes: - Ingress 



Ini memungkinkan akses dari semua pod di semua namespace (dan semua IP) ke pod apa saja di namespace default . Perilaku ini diaktifkan secara default, jadi biasanya tidak perlu didefinisikan lebih lanjut. Namun, kadang-kadang mungkin perlu untuk sementara menonaktifkan beberapa izin khusus untuk mendiagnosis masalah.

Aturan dapat dipersempit dan diizinkan akses hanya ke kumpulan pod tertentu ( app:balance ) di namespace default :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-to-balance namespace: default spec: podSelector: matchLabels: app: balance ingress: - {} policyTypes: - Ingress 



Kebijakan berikut memungkinkan semua lalu lintas masuk dan keluar, termasuk akses ke IP apa pun di luar cluster:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all spec: podSelector: {} ingress: - {} egress: - {} policyTypes: - Ingress - Egress 




Menggabungkan banyak kebijakan


Kebijakan digabungkan menggunakan logika ATAU pada tiga tingkatan; izin setiap pod diatur sesuai dengan disjungsi semua kebijakan yang mempengaruhinya:

1. Di bidang from dan to , Anda dapat menentukan tiga jenis elemen (semuanya digabungkan menggunakan OR):

  • namespaceSelector - memilih seluruh namespace;
  • podSelector - memilih pod;
  • ipBlock - memilih subnet.

Pada saat yang sama, jumlah elemen (bahkan sama) di from / to subbagian tidak terbatas. Semuanya akan dikombinasikan dengan logika OR.

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres namespace: default spec: ingress: - from: - podSelector: matchLabels: app: indexer - podSelector: matchLabels: app: admin podSelector: matchLabels: app: postgres policyTypes: - Ingress 



2. Di dalam kebijakan, bagian ingress dapat memiliki banyak elemen (dikombinasikan dengan logika OR). Demikian pula, bagian egress dapat menyertakan banyak elemen (juga digabungkan dengan klausa):

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres namespace: default spec: ingress: - from: - podSelector: matchLabels: app: indexer - from: - podSelector: matchLabels: app: admin podSelector: matchLabels: app: postgres policyTypes: - Ingress 



3. Berbagai kebijakan juga digabungkan dengan logika OR

Tetapi ketika menggabungkan mereka, ada satu batasan yang ditunjukkan Chris Cooney : Kubernetes hanya dapat menggabungkan kebijakan dengan berbagai policyTypes kebijakan ( Ingress atau Egress ). Kebijakan yang menentukan masuknya (atau keluar) akan saling menimpa.

Hubungan antara ruang nama


Secara default, pertukaran informasi antara ruang nama diizinkan. Ini dapat diubah menggunakan kebijakan penghalang yang membatasi lalu lintas keluar dan / atau masuk ke namespace (lihat "Aturan pengupasan" di atas).

Dengan memblokir akses ke namespace (lihat "Aturan Stripping" di atas), Anda dapat membuat pengecualian terhadap kebijakan restriktif dengan mengizinkan koneksi dari namespace tertentu menggunakan namespaceSelector :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: database.postgres namespace: database spec: podSelector: matchLabels: app: postgres ingress: - from: - namespaceSelector: # <<< matchLabels: namespace: default policyTypes: - Ingress 



Akibatnya, semua pod di namespace default akan memiliki akses ke pod postgres di namespace database . Tetapi bagaimana jika Anda ingin membuka akses ke postgres hanya ke pod tertentu di namespace default ?

Saring berdasarkan ruang nama & pod


Kubernetes versi 1.11 dan lebih tinggi memungkinkan Anda untuk menggabungkan namespaceSelector dan operator podSelector menggunakan logis I. Sepertinya ini:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: database.postgres namespace: database spec: podSelector: matchLabels: app: postgres ingress: - from: - namespaceSelector: matchLabels: namespace: default podSelector: # <<< matchLabels: app: admin policyTypes: - Ingress 



Mengapa ini ditafsirkan sebagai DAN bukannya OR biasa?

Perhatikan bahwa podSelector tidak dimulai dengan tanda hubung. Dalam YAML, ini berarti podSelector dan namespaceSelector berdiri di depannya merujuk ke item daftar yang sama. Oleh karena itu, mereka dikombinasikan oleh I. logis

Menambahkan tanda hubung di depan podSelector akan menghasilkan item daftar baru yang akan dikombinasikan dengan namespaceSelector sebelumnya menggunakan OR logis.

Untuk memilih pod dengan label tertentu di semua ruang nama , masukkan ruang namespaceSelector kosong:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: database.postgres namespace: database spec: podSelector: matchLabels: app: postgres ingress: - from: - namespaceSelector: {} podSelector: matchLabels: app: admin policyTypes: - Ingress 



Beberapa label digabungkan dengan AND


Aturan untuk firewall dengan banyak objek (host, jaringan, grup) digabungkan menggunakan OR logis. Aturan berikut akan berfungsi jika sumber paket cocok dengan Host_1 OR Host_2 :

 | Source | Destination | Service | Action | | ----------------------------------------| | Host_1 | Subnet_A | HTTPS | Allow | | Host_2 | | | | | ----------------------------------------| 

Sebaliknya, di Kubernetes, berbagai label di podSelector atau namespaceSelector digabungkan oleh logis I. Misalnya, aturan berikut akan memilih pod yang memiliki kedua label, role=db DAN version=v2 :

 podSelector: matchLabels: role: db version: v2 

Logika yang sama berlaku untuk semua jenis operator: pemilih tujuan kebijakan, pemilih pod, dan pemilih namespace.

Subnet dan Alamat IP (IPBlocks)


Firewall menggunakan VLAN, alamat IP, dan subnet untuk mengelompokkan jaringan.

Di Kubernetes, alamat IP ditetapkan untuk pod secara otomatis dan dapat sering berubah, sehingga label digunakan untuk memilih pod dan ruang nama dalam kebijakan jaringan.

ipBlocks ( ipBlocks ) digunakan untuk mengontrol koneksi eksternal (Utara-Selatan) inbound (ingress) atau outbound (egress). Misalnya, kebijakan ini memberikan semua pod dari akses namespace default ke layanan Google DNS:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: egress-dns namespace: default spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 8.8.8.8/32 ports: - protocol: UDP port: 53 



Pemilih pod kosong dalam contoh ini berarti "pilih semua pod di namespace."

Kebijakan ini hanya menyediakan akses ke 8.8.8.8; akses ke IP lain ditolak. Dengan demikian, pada dasarnya, Anda memblokir akses ke layanan DNS internal Kubernetes. Jika Anda masih ingin membukanya, tentukan secara eksplisit.

Biasanya ipBlocks dan podSelectors saling eksklusif, karena alamat IP internal pod tidak digunakan di ipBlocks . Dengan menentukan pod IP internal , Anda sebenarnya akan mengizinkan koneksi ke / dari pod dengan alamat ini. Dalam praktiknya, Anda tidak akan tahu alamat IP mana yang akan digunakan, itulah sebabnya mereka tidak boleh digunakan untuk memilih pod.

Sebagai contoh tandingan, kebijakan berikut mencakup semua IP dan, karenanya, memungkinkan akses ke semua pod lainnya:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: egress-any namespace: default spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0 



Anda dapat membuka akses hanya ke IP eksternal dengan mengecualikan alamat IP internal pod. Misalnya, jika subnet pod Anda adalah 10.16.0.0/14:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: egress-any namespace: default spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0 except: - 10.16.0.0/14 



Port dan Protokol


Biasanya pod mendengarkan pada satu port. Ini berarti bahwa Anda dapat dengan mudah menghilangkan nomor port dalam kebijakan dan membiarkan semuanya sebagai default. Namun, disarankan agar kebijakan dibuat seketat mungkin, sehingga dalam beberapa kasus Anda masih dapat menentukan port:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres namespace: default spec: ingress: - from: - podSelector: matchLabels: app: indexer - podSelector: matchLabels: app: admin ports: # <<< - port: 443 # <<< protocol: TCP # <<< - port: 80 # <<< protocol: TCP # <<< podSelector: matchLabels: app: postgres policyTypes: - Ingress 



Perhatikan bahwa pemilih ports berlaku untuk semua elemen di blok to atau from yang dikandungnya. Untuk menentukan port berbeda untuk set elemen yang berbeda, ingress atau egress ke beberapa subbagian dengan to atau from dan daftarkan port Anda di masing-masing:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres namespace: default spec: ingress: - from: - podSelector: matchLabels: app: indexer ports: # <<< - port: 443 # <<< protocol: TCP # <<< - from: - podSelector: matchLabels: app: admin ports: # <<< - port: 80 # <<< protocol: TCP # <<< podSelector: matchLabels: app: postgres policyTypes: - Ingress 



Port default berfungsi:

  • Jika Anda sepenuhnya menghilangkan definisi port, ini berarti semua protokol dan semua port;
  • Jika Anda menghilangkan definisi protokol, itu berarti TCP;
  • Jika Anda menghilangkan definisi port, ini berarti semua port.

Praktik terbaik: jangan mengandalkan nilai default, tentukan apa yang Anda butuhkan secara eksplisit.

Harap dicatat bahwa perlu menggunakan porta pod, bukan layanan (lebih lanjut tentang ini pada paragraf berikutnya).

Apakah kebijakan ditentukan untuk pod atau layanan?


Biasanya pod di Kubernet menghubungi satu sama lain melalui layanan - penyeimbang beban virtual yang mengalihkan lalu lintas ke pod yang mengimplementasikan layanan. Anda mungkin berpikir bahwa kebijakan jaringan mengontrol akses ke layanan, tetapi ini tidak benar. Kebijakan jaringan Kubernetes bekerja dengan port pod, bukan layanan.

, 80- , 8080 pod', 8080.

: ( pod') .

Service Mesh (, . Istio — . .) .

Ingress, Egress?


— , pod pod' , ( egress-), pod ( , , ingress-).

, .

pod- egress -, . pod'- . pod - , (egress) .

pod'- , ingress -, . pod'-. pod - , (ingress) .

. «Stateful Stateless» .


Kubernetes . , , .


Kubernetes (DNS) egress. , IP- ( aws.com).


. Kubernetes . kubectl Kubernetes , , . Kubernetes . :

 kubernetes get networkpolicy <policy-name> -o yaml 

, Kubernetes .


Kubernetes , API-, , Container Networking Interface (CNI). Kubernetes CNI . CNI , Kubernetes, ( — . .) , , CNI .

, Kubernetes , CNI.

Stateful Stateless?


CNI Kubernetes, , (, Calico Linux conntrack). pod' TCP- . Kubernetes, (statefulness).


Kubernetes:

  1. Service Mesh sidecar- . Istio .
  2. CNI , Kubernetes.
  3. Tufin Orca Kubernetes.

Tufin Orca Kubernetes ( , ).



Kesimpulan


Kubernetes , . , - . .

, , .

PS dari penerjemah


Baca juga di blog kami:

Source: https://habr.com/ru/post/id443190/


All Articles