Calico-тэй сүлжээний бодлогын хэрэгжилтийн сонголтуудыг ойлгох

Calico-тэй сүлжээний бодлогын хэрэгжилтийн сонголтуудыг ойлгох

Calico сүлжээний залгаас нь техник хангамжийн хостууд, виртуал машинууд болон подкуудыг хамгаалах нэгдсэн синтакс бүхий өргөн хүрээний сүлжээний бодлогыг хангадаг. Эдгээр удирдамжийг нэрийн орон зайд ашиглах эсвэл дэлхийн сүлжээний бодлогод хамаарах боломжтой хост төгсгөлийн цэг (хост дээр шууд ажиллаж байгаа програмуудыг хамгаалахын тулд - хост нь сервер эсвэл виртуал машин байж болно) эсвэл ажлын ачааллын эцсийн цэг (контейнер эсвэл байршуулсан виртуал машинд ажиллаж байгаа програмуудыг хамгаалах). Calico-н бодлого нь танд preDNAT, unracked, applicationOnForward гэх мэт сонголтуудыг ашиглан багцын замын янз бүрийн цэгүүдэд аюулгүй байдлын арга хэмжээ авах боломжийг олгодог. Эдгээр сонголтууд хэрхэн ажилладагийг ойлгох нь таны системийн аюулгүй байдал, гүйцэтгэлийг сайжруулахад тусална. Энэ нийтлэл нь пакет боловсруулах замд (iptabels гинж) юу тохиолдохыг онцлон, хост төгсгөлийн цэгүүдэд хэрэглэгдэх Calico бодлогын сонголтуудын (preDNAT, unracked болон applyOnForward) мөн чанарыг тайлбарласан болно.

Энэ нийтлэлд та Kubernetes болон Calico сүлжээний бодлого хэрхэн ажилладаг талаар үндсэн ойлголттой болсон гэж үзэж байна. Хэрэв үгүй ​​​​бол бид үүнийг туршиж үзэхийг зөвлөж байна сүлжээний бодлогын үндсэн заавар и хост хамгаалах заавар Энэ нийтлэлийг уншихаасаа өмнө Calico-г ашиглана уу. Мөн бид таныг ажлын талаар анхан шатны ойлголттой байгаасай гэж найдаж байна iptables линукс дээр.

Калико дэлхийн сүлжээний бодлого шошго (хост болон ажлын ачаалал/подуудын бүлэгт) хандалтын багц дүрмийг хэрэглэх боломжийг танд олгоно. Хэрэв та виртуал машин, техник хангамж дээрх систем эсвэл kubernetes дэд бүтэц зэрэг олон төрлийн системийг хамтад нь ашигладаг бол энэ нь маш хэрэгтэй. Нэмж дурдахад, та кластер (зангилаа)-аа олон тооны мэдэгдлийн бодлогыг ашиглан хамгаалж, ирж буй траффик дээр сүлжээний бодлогыг хэрэгжүүлэх боломжтой (жишээлбэл, NodePorts эсвэл Гадаад IP үйлчилгээгээр дамжуулан).

Үндсэн түвшинд Calico нь подволкийг сүлжээнд холбохдоо (доорх диаграммыг үзнэ үү) үүнийг виртуал Ethernet интерфейс (veth) ашиглан хосттой холбодог. Под-ын илгээсэн траффик нь энэ виртуал интерфейсээс хост руу ирдэг бөгөөд үүнийг физик сүлжээний интерфэйсээс ирсэнтэй адил аргаар боловсруулдаг. Анхдагчаар Calico эдгээр интерфэйсүүдийг caliXXX гэж нэрлэдэг. Траффик виртуал интерфэйсээр дамждаг тул pod нэг хоп зайд байгаа мэт iptables-ээр дамждаг. Тиймээс, трафик под руу/аас ирэхэд хостын үүднээс дамжуулдаг.

Calico ажиллуулж байгаа Kubernetes зангилаа дээр та виртуал интерфейсийг (veth) ажлын ачаалалд дараах байдлаар буулгаж болно. Доорх жишээн дээр та veth#10 (calic1cbf1ca0f8) нь calico-monitoring namespace дахь cnx-manager-*-тай холбогдсон байгааг харж болно.

[centos@ip-172-31-31-46 K8S]$ sudo ip a
...
10: calic1cbf1ca0f8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 5
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever
...

[centos@ip-172-31-31-46 K8S]$ calicoctl get wep --all-namespaces
...
calico-monitoring cnx-manager-8f778bd66-lz45m                            ip-172-31-31-46.ec2.internal 192.168.103.134/32
calic1cbf1ca0f8
...

Calico-тэй сүлжээний бодлогын хэрэгжилтийн сонголтуудыг ойлгох

Calico нь ажлын ачаалал тус бүрт вет интерфэйсийг бий болгодог тул бодлогыг хэрхэн хэрэгжүүлдэг вэ? Үүнийг хийхийн тулд Calico нь iptables ашиглан пакет боловсруулах замын янз бүрийн хэлхээнд дэгээ үүсгэдэг.

Доорх диаграмм нь iptables (эсвэл netfilter дэд систем) дээр пакет боловсруулахад оролцдог хэлхээг харуулж байна. Сүлжээний интерфейсээр пакет ирэхэд эхлээд PREROUTING хэлхээгээр дамждаг. Дараа нь чиглүүлэлтийн шийдвэр гарч, үүн дээр үндэслэн пакет нь INPUT (хост процессууд руу чиглэгддэг) эсвэл FORWARD (сүлжээний под эсвэл өөр зангилаа руу чиглүүлдэг) аль нэгээр дамждаг. Орон нутгийн процессоос пакет нь кабелийг дамжуулахаас өмнө OUTPUT, дараа нь POSTROUTING хэлхээгээр дамждаг.

Под нь iptables боловсруулалтын хувьд мөн гадаад нэгж (veth-д холбогдсон) гэдгийг анхаарна уу. Дүгнэж хэлье:

  • Дамжуулсан урсгал (nat, routed эсвэл to/fod) PREROUTING - FORWARD - POSTROUTING хэлхээгээр дамждаг.
  • Орон нутгийн хост процесс руу чиглэсэн урсгал нь PREROUTING - INPUT хэлхээгээр дамждаг.
  • Орон нутгийн хост процессын урсгал нь OUTPUT - POSTROUTING хэлхээгээр дамждаг.

Calico-тэй сүлжээний бодлогын хэрэгжилтийн сонголтуудыг ойлгох

Calico нь бүх сүлжээн дээр бодлого хэрэгжүүлэх боломжийг олгодог бодлогын сонголтуудыг санал болгодог. Үүнийг харгалзан Calico-д байдаг бодлогын тохиргооны өөр сонголтуудыг харцгаая. Доорх сонголтуудын жагсаалтад байгаа тоонууд нь дээрх диаграм дээрх тоонуудтай тохирч байна.

  1. Ажлын ачааллын төгсгөлийн цэгийн бодлого
  2. Хост эцсийн цэгийн бодлого
  3. ApplyOnForward сонголт
  4. PreDNAT бодлого
  5. Хяналтгүй бодлого

Ажлын ачааллын төгсгөлийн цэгүүдэд (Kubernetes pods эсвэл OpenStack VMs) бодлого хэрхэн хэрэгждэгийг судалж, дараа нь хостын төгсгөлийн цэгүүдийн бодлогын сонголтуудыг харцгаая.

Ажлын ачааллын төгсгөлийн цэгүүд

Ажлын ачааллын эцсийн цэгийн бодлого (1)

Энэ нь таны kubernetes pods хамгаалах сонголт юм. Calico нь Kubernetes NetworkPolicy-тэй ажиллахыг дэмждэг боловч Calico NetworkPolicy болон GlobalNetworkPolicy зэрэг нэмэлт бодлогыг өгдөг. Calico нь хонхорцог (ажлын ачаалал) тус бүрд гинж үүсгэж, ажлын ачааллыг ОРОЛТ, ГАРЦЫН гинжээр FORWARD сүлжээний шүүлтүүрийн хүснэгтэд залгадаг.

Хост төгсгөлийн цэгүүд

Хост эцсийн цэгийн бодлого (2)

CNI (контейнер сүлжээний интерфейс) -ээс гадна Calico бодлого нь хостыг өөрөө хамгаалах боломжийг олгодог. Calico-д та хост интерфейс болон шаардлагатай бол портын дугаарын хослолыг зааж өгснөөр хостын төгсгөлийн цэг үүсгэж болно. Энэ байгууллагын бодлогын хэрэгжилтийг INPUT болон OUTPUT хэлхээн дэх шүүлтүүрийн хүснэгтийг ашиглан гүйцэтгэдэг. Диаграмаас харж байгаагаар (2) тэдгээр нь зангилаа/хост дээрх локал процессуудад хамаарна. Өөрөөр хэлбэл, хэрэв та хостын төгсгөлийн цэгт хамаарах бодлогыг бий болговол энэ нь таны pods руу явах/хэрэглэх урсгалд нөлөөлөхгүй. Гэхдээ энэ нь Calico бодлогуудыг ашиглан таны хост болон pods-ийн урсгалыг хаах нэг интерфэйс/синтаксаар хангадаг. Энэ нь нэг төрлийн бус сүлжээний бодлогыг удирдах үйл явцыг ихээхэн хялбаршуулдаг. Кластерын аюулгүй байдлыг сайжруулахын тулд хостын эцсийн цэгийн бодлогыг тохируулах нь бас нэг чухал хэрэглэгдэхүүн юм.

ApplyOnForward бодлого (3)

ApplyOnForward сонголтыг Calico глобал сүлжээний бодлогод ашиглах боломжтой бөгөөд хостын төгсгөлийн цэгээр дамжин өнгөрч буй бүх траффик, тэр дундаа хостын дамжуулж буй траффикт бодлогыг хэрэгжүүлэх боломжтой. Үүнд локал pod эсвэл сүлжээний аль ч газар руу дамжуулсан траффик орно. Calico нь энэ тохиргоог PreDNAT ашигладаг бодлогод идэвхжүүлэхийг шаарддаг бөгөөд хяналтгүй, дараах хэсгүүдийг үзнэ үү. Нэмж дурдахад, ApplyOnForward нь виртуал чиглүүлэгч эсвэл NAT програм хангамжийг ашигладаг тохиолдолд хостын урсгалыг хянахад ашиглаж болно.

Хэрэв та хост процесс болон pods-д ижил сүлжээний бодлогыг хэрэгжүүлэх шаардлагатай бол ApplyOnForward сонголтыг ашиглах шаардлагагүй гэдгийг анхаарна уу. Таны хийх ёстой зүйл бол шаардлагатай хост цэг болон ажлын ачааллын төгсгөлийн цэг (pod)-д зориулж шошго үүсгэх явдал юм. Calico нь эцсийн цэгийн төрлөөс үл хамааран шошгон дээр суурилсан бодлогыг хэрэгжүүлэхэд хангалттай ухаалаг юм (хостинд цэг эсвэл ажлын ачаалал).

PreDNAT бодлого (4)

Kubernetes-д үйлчилгээний нэгжийн портуудыг гаднаас нь NodePorts сонголтоор эсвэл сонголтоор (Calico ашиглах үед) Cluster IPs or External IPs сонголтуудыг ашиглан сурталчилж болно. Kube-proxy нь DNAT ашиглан үйлчилгээнд холбогдсон орж ирж буй траффикийг харгалзах үйлчилгээний pods руу тэнцвэржүүлдэг. Үүнийг харгалзан та NodePorts-ээр дамжуулан ирж буй замын хөдөлгөөний бодлогыг хэрхэн хэрэгжүүлэх вэ? DNAT (энэ нь хост: порт болон харгалзах үйлчилгээний хоорондох зураглал) трафикийг боловсруулахаас өмнө эдгээр бодлогыг хэрэгжүүлэхийн тулд Calico нь "preDNAT: үнэн" нэртэй globalNetworkPolicy параметрийг өгдөг.

Pre-DNAT-г идэвхжүүлсэн үед эдгээр бодлогыг PREROUTING гинжин хэлхээний mangle хүснэгтийн диаграммд (4)-д DNAT-аас шууд өмнө хэрэгжүүлнэ. Эдгээр бодлогуудын хэрэглээ нь замын хөдөлгөөний боловсруулалтын замаас хамаагүй эрт явагддаг тул ердийн журмын дарааллыг энд дагаж мөрдөхгүй. Гэсэн хэдий ч preDNAT бодлого нь хэрэглээний дарааллыг өөр хоорондоо хүндэтгэдэг.

Pre-DNAT-тай бодлого үүсгэхдээ боловсруулахыг хүсэж буй траффикдаа болгоомжтой хандаж, дийлэнх нь татгалзахыг зөвшөөрөх нь чухал юм. DNAT-ын өмнөх бодлогод "зөвшөөрөх" гэж тэмдэглэгдсэн траффикийг хостын цэгийн бодлогоор шалгахаа больсон бол DNAT-ын өмнөх бодлого амжилтгүй болсон урсгалыг үлдсэн хэлхээгээр үргэлжлүүлнэ.
Тодорхойлолтоор замын хөдөлгөөний хүрэх газрыг хараахан сонгоогүй байгаа тул Calico нь preDNAT-г ашиглахдаа applyOnForward сонголтыг заавал идэвхжүүлсэн. Хөдөлгөөнийг хост процесс руу чиглүүлж эсвэл под эсвэл өөр зангилаа руу дамжуулж болно.

Хяналтгүй бодлого (5)

Сүлжээ болон програмууд нь зан төлөвийн хувьд ихээхэн ялгаатай байж болно. Зарим онцгой тохиолдолд програмууд богино хугацааны олон холболт үүсгэж болно. Энэ нь conntrack (Linux сүлжээний стекийн үндсэн бүрэлдэхүүн хэсэг) санах ойн хомсдолд хүргэж болзошгүй юм. Уламжлал ёсоор эдгээр төрлийн програмуудыг Линукс дээр ажиллуулахын тулд та conntrack-г гараар тохируулах, идэвхгүй болгох эсвэл холболтыг тойрч гарахын тулд iptables дүрмийг бичих шаардлагатай болдог. Хэрэв та холболтыг аль болох хурдан боловсруулахыг хүсч байвал Calico-н хяналтгүй бодлого нь илүү хялбар бөгөөд үр дүнтэй сонголт юм. Жишээлбэл, хэрэв та массив ашигладаг бол memcache эсвэл хамгаалах нэмэлт арга хэмжээ болно DDOS.

Энийг унш блог дараах (эсвэл бидний орчуулга) хяналтгүй бодлогыг ашиглан гүйцэтгэлийн тест зэрэг нэмэлт мэдээлэл авах боломжтой.

Та Calico globalNetworkPolicy-д "doNotTrack: үнэн" сонголтыг тохируулах үед энэ нь **хяналтгүй** бодлого болж, Линукс пакет боловсруулах шугамын маш эрт хэрэгждэг. Дээрх диаграммыг харвал холболтыг хянах (холбогдох) эхлэхээс өмнө түүхий хүснэгтийн PREROUTING болон OUTPUT хэлхээнүүдэд хяналтгүй бодлогыг хэрэгжүүлдэг. Хянагдаагүй бодлого нь пакетыг зөвшөөрсөн тохиолдолд тухайн пакетийн холболтын хяналтыг идэвхгүй болгохоор тэмдэглэнэ. Энэ нь:

  • Хяналтгүй бодлогыг багц тус бүрээр хэрэгжүүлдэг. Холболт (эсвэл урсгал) гэсэн ойлголт байхгүй. Холболтын дутагдал нь хэд хэдэн чухал үр дагаварт хүргэдэг:
  • Хэрэв та хүсэлт болон хариултын урсгалыг хоёуланг нь зөвшөөрөхийг хүсвэл дотогшоо болон гадагш чиглэсэн аль алиных нь дүрэм хэрэгтэй (Учир нь Calico ихэвчлэн хариултын урсгалыг зөвшөөрөгдсөн гэж тэмдэглэхийн тулд conntrack ашигладаг).
  • Хянагдаагүй бодлого нь Kubernetes-ийн ажлын ачаалал (под)-д ажиллахгүй, учир нь энэ тохиолдолд pod-аас гарч буй холболтыг хянах арга байхгүй.
  • NAT нь хяналтгүй пакетуудтай зөв ажиллахгүй (цөм нь NAT зураглалыг conntrack-д хадгалдаг тул).
  • Хяналтгүй бодлого дахь "бүгдийг зөвшөөрөх" дүрмээр дамжих үед бүх пакетууд хяналтгүй гэж тэмдэглэгдэх болно. Энэ нь таны хүссэн зүйл бараг үргэлж байдаггүй, тиймээс хяналтгүй бодлогоор зөвшөөрөгдсөн пакетуудыг сонгохдоо маш болгоомжтой байх нь чухал (мөн ихэнх урсгалыг ердийн хянагддаг бодлогоор явуулахыг зөвшөөрөх).
  • Хяналтгүй бодлогуудыг пакет боловсруулах дамжуулах хоолойн хамгийн эхэнд ашигладаг. Энэ нь Calico бодлогуудыг үүсгэх үед ойлгох нь маш чухал юм. Та захиалга:1-тэй pod бодлого, захиалга:1000-тай хяналтгүй бодлоготой байж болно. Энэ хамаагүй. Хяналтгүй удирдамж нь под-д зориулсан удирдамжийн өмнө хэрэгжинэ. Хяналтгүй бодлого нь гүйцэтгэх дарааллыг зөвхөн өөр хоорондоо хүндэтгэдэг.

doNotTrack бодлогын нэг зорилго нь Линукс пакет боловсруулах шугамын эхэн үед бодлогыг хэрэгжүүлэх явдал тул Calico doNotTrack-г ашиглахдаа applyOnForward сонголтыг заавал зааж өгөхийг шаарддаг. Пакет боловсруулах диаграммыг дурдахад чиглүүлэлтийн шийдвэр гаргахын өмнө untracked(5) бодлогыг хэрэгжүүлдэг болохыг анхаарна уу. Хөдөлгөөнийг хост процесс руу чиглүүлж эсвэл под эсвэл өөр зангилаа руу дамжуулж болно.

Үр дүн

Бид Calico дахь бодлогын янз бүрийн сонголтуудыг (Host endpoint, ApplyOnForward, preDNAT, and Untracked) болон тэдгээрийг пакет боловсруулах замд хэрхэн ашигладаг талаар авч үзсэн. Тэд хэрхэн ажилладагийг ойлгох нь үр дүнтэй, аюулгүй бодлого боловсруулахад тусалдаг. Calico-ийн тусламжтай та шошгонд (зангилаа ба хонгилын бүлэг) хамаарах глобал сүлжээний бодлогыг ашиглаж, янз бүрийн параметр бүхий бодлогыг хэрэгжүүлэх боломжтой. Энэ нь аюулгүй байдал болон сүлжээний дизайны мэргэжилтнүүдэд Calico бодлого бүхий бодлогын нэг хэлийг ашиглан "бүх зүйлийг" (эцсийн цэгийн төрлүүд) нэг дор эвтэйхэн хамгаалах боломжийг олгодог.

Талархал: Би баярлалаа гэж хэлмээр байна Шон Крамптон и Алекса Поллитта тэдний тойм, үнэ цэнэтэй мэдээллийн төлөө.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх