
Artikli eesmÀrk on tutvustada lugejat Kubernetes'e vÔrgus kommunikatsiooni ja vÔrgu poliitikate haldamise alustega ning kolmanda osapoole plugina Calico, mis laiendab standardseid vÔimalusi. Samuti demonstreeritakse seadistamise mugavust ja mÔningaid funktsioone meie töökogemuste pÔhjal.
Kiire sissejuhatus Kubernetes'e vÔrguseadmisse
Kubernetes'e kluster on vÔimatu ette kujutada ilma vÔrguta. Oleme juba avaldanud materjale nende aluste kohta: "» ja «».
Sellest artiklist rÀÀkides on oluline mÀrkida, et konteinerite ja sÔlmede vahelise vÔrguside eest vastutab mitte K8s ise: selleks kasutatakse mitmesuguseid CNI pluginaid (Container Networking Interface). TÀiendavat teavet selle kontseptsiooni kohta oleme .
NĂ€iteks on kĂ”ige levinum selline plugin â â tagab tĂ€ielikku vĂ”rguĂŒhenduvust kĂ”igi klastris olevate sĂ”lmede vahel, luues igas sĂ”lmes sillad ja kinnitades neile alamvĂ”rgu. Siiski ei ole tĂ€ielik ja reguleerimata kĂ€ttesaadavus alati kasulik. Klastris mingisuguse minimaalsete eraldusmeetmete tagamiseks on vajalik sekkuda tulemĂŒĂŒride konfigureerimisse. Ăldiselt on see usaldatud sama CNI haldusesse, mistĂ”ttu vĂ”ivad kĂ”ik vĂ€lised sekkumised iptablesâisse olla vale tĂ”lgendusega vĂ”i sootuks ignoreeritud.
Ja "kastist vĂ€lja" pakub Kubernetes klastris vĂ”rgu poliitikate juhtimiseks . See ressurss, mida rakendatakse valitud nime ruumides, vĂ”ib sisaldada reegleid juurdepÀÀsu eraldamiseks ĂŒhe rakenduse ja teise vahel. See vĂ”imaldab samuti seadistada juurdepÀÀsu konkreetsete podâide, keskkondade (nime ruumide) vĂ”i IP-aadresside plokkide vahel:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: 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: 5978See esemest saysi caso non primari. VĂ”ib jÀÀda mulje, et see vĂ”iks igaveseks Ă€ra murda huvi vĂ”rgu poliitikate loogika mĂ”istmise vastu. Siiski pĂŒĂŒame me siiski mĂ”ista pĂ”hialuseid ja meetodeid liikluse voogude töötlemiseks vĂ”rgu poliitikate abil...
On loogiline, et on olemas 2 tĂŒĂŒpi liiklust: pod'i sisene (Ingress) ja pod'ist vĂ€ljuv (Egress).

Tegelikult jaotatakse poliitika nende 2 kategooria jÀrgi suuna jÀrgi.
JĂ€rgmine kohustuslik atribuut on selektor; see, kellele reegel kehtib. See vĂ”ib olla pod (vĂ”i pod'ide grupp) vĂ”i keskkond (st nimede ruum). Oluline detail: mĂ”lemad tĂŒĂŒbid peavad sisaldama mĂ€rgist (silt Kubernetes'i terminoloogias) - just neid kasutatakse poliitikates.
Lisaks lĂ”plikule valikule, mis on ĂŒhendatud mĂ”ne mĂ€rgisega, on vĂ”imalik kirjutada reegleid nagu "Luba / keela kĂ”ik / kĂ”igile" erinevates variatsioonides. Selleks kasutatakse konstruktsioone, nagu:
podSelector: {}
ingress: []
policyTypes:
- Ingressâ sel juhul suletakse kĂ”igi pod'ide sisenemine keskkonda. Vastupidist kĂ€itumist saab saavutada sellise konstruktsiooniga:
podSelector: {}
ingress:
- {}
policyTypes:
- IngressSama kehtib ka vÀljuva liikluse kohta:
podSelector: {}
policyTypes:
- Egressâ selle keelamiseks. Ja siin on see, kuidas seda lubada:
podSelector: {}
egress:
- {}
policyTypes:
- EgressTagasi tulles CNI-lisa valikku klastrile, tasub mĂ€rkida, et kĂ”ik vĂ”rgu lisad ei toeta NetworkPolicy tööd. NĂ€iteks juba mainitud Flannel ei oska vĂ”rgu poliitikaid seadistada, millest ametlikus hoidlas. Seal mainitakse ka alternatiivi â avatud lĂ€htekoodiga projekt , mis laianeb oluliselt Kubernetes'e vĂ”rgu poliitilisi API-sid.

Tutvume Calicoga: teooria
Calico plugin saab kasutada Flanneliga koos (alaprojekt ) vĂ”i iseseisvalt, katab nii vĂ”rguĂŒhenduse tagamise funktsioonid kui ka kĂ€ttesaadavuse haldamise vĂ”imalused.
Milliseid vĂ”imalusi pakub âkarbiâ K8s lahenduse ja Calico API komplekti kasutamine?
Siin on, mis on NetworkPolicy sisse ehitatud:
- poliitikad on piiratud keskkonnaga;
- poliitikad rakendatakse siltidega pod'idele;
- reeglid vÔivad kehtida pod'idele, keskkondadele vÔi alamvÔrkudele;
- reeglid vĂ”ivad sisaldada protokolle, nimetatud vĂ”i sĂŒmboolseid portide viiteid.
Ja nii laiendab Calico neid funktsioone:
- poliitikad vÔivad kehtida igasugustele objektidele: pod, konteiner, virtuaalmasin vÔi liides;
- reeglid vÔivad sisaldada konkreetset tegevust (keeldumine, lubamine, logimine);
- reeglite sihtmÀrgiks vÔi allikaks vÔivad olla port, portide vahemik, protokollid, HTTP- vÔi ICMP-attribuudid, IP vÔi alamvÔrk (4. vÔi 6. pÔlvkond), kÔik valijad (sÔlmed, hostid, keskkonnad);
- lisaks on vÔimalik reguleerida liikluse lÀbimist DNAT-i seadete ja liikluse suunamise poliitikate abil.
Calico hoidlate esimesed commitid GitHubis pĂ€rinevad 2016. aasta juulist, ja juba aasta hiljem saavutas projekt juhtiva positsiooni Kubernetes'i vĂ”rgutootmise organisatsioonis â nĂ€iteks kinnitavad seda kĂŒsitluse tulemused. :

Paljud suured K8s-i hallatud lahendused, nagu , , ning teised, on hakanud seda soovitama.
Mis puutub jĂ”udlusesse, siis on kĂ”ik suurepĂ€rane. Calico arendustiim demonstreeris oma toote testimisel astronoomilisi nĂ€itajaid, kĂ€ivitades enam kui 50000 konteinerit 500 fĂŒĂŒsilisel sĂ”lmel kiirusel 20 konteinerit sekundis. Skaleerimisega ei esinenud probleeme. Sellised tulemused juba esimese versiooni vĂ€ljakuulutamisel. Olenematu teadusuuringud, mis on suunatud lĂ€bilaskevĂ”ime ja ressursitarbimise mahtude mÀÀramisele, kinnitavad samuti Calico jĂ”udlust, mis praktiliselt ei jÀÀ Flannelile alla. :

Projekt areneb vÀga kiiresti, toetades töötlust populaarsetes hallatud K8s-i lahendustes, OpenShiftis, OpenStackis ning on vÔimalik kasutada Calicot klastrite juurutamisel , kohtab viiteid Service Mesh-vÔrkude ehitamisele ( koostööst Istio'ga).
Praktika Calicoga
Ăldjuhul sisaldab vanilje Kubernetes'i installatsiooni CNI kohaldamine faili calico.yaml, , kasutades kubectl apply -f.
Reeglina on plugina uusim versioon ĂŒhilduv 2-3 viimase Kubernetes'i versiooniga: vanemates versioonides ei testita ja ei garanteerita toimimist. Arendajate vĂ€itel töötab Calico Linuxi kerneliga, mis on suurem kui 3.10, CentOS 7, Ubuntu 16 vĂ”i Debian 8 all, iptables'i vĂ”i IPVS'i peal.
Isolatsioon keskkonnas
Ăldise arusaamise huvides kaalume lihtsat juhtumit, et mĂ”ista, kuidas Calico vorminduse vĂ”rgu poliitikad erinevad standardsetest ning kuidas reeglite koostamise lĂ€henemine lihtsustab nende loetavust ja konfigureerimise paindlikkust:

Klastris on juurutatud 2 veebirakendust: Node.js ja PHP, millest ĂŒks kasutab Redis't. Et sulgeda juurdepÀÀs Redis'ele PHP-st, jĂ€ttes samal ajal ĂŒhenduse Node.js-iga, piisab jĂ€rgmisest poliitika rakendamisest:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-redis-nodejs
spec:
podSelector:
matchLabels:
service: redis
ingress:
- from:
- podSelector:
matchLabels:
service: nodejs
ports:
- protocol: TCP
port: 6379PÔhimÔtteliselt oleme lubanud sissetuleva liikluse Redis pordile Node.js-st. Ja me ei ole selgelt midagi muud keelanud. Kui NetworkPolicy ilmub, hakkavad kÔik selles mainitud selektorid isoleeruma, kui pole teisiti mÀrgitud. Samuti ei laiene isolatsioonieeskirjad muudele objektidele, mida selektor ei kata.
NĂ€ites kasutatakse apiVersion Kubernetes'e "vĂ€lja kastist", kuid miski ei takista kasutamast . SĂŒntaks on seal keerulisem, seega tuleb ĂŒlaltoodud juhtumi eeskirja kirjutada jĂ€rgmisel kujul:
apiVersion: crd.projectcalico.org/v1
kind: NetworkPolicy
metadata:
name: allow-redis-nodejs
spec:
selector: service == 'redis'
ingress:
- action: Allow
protocol: TCP
source:
selector: service == 'nodejs'
destination:
ports:
- 6379 Ălalmainitud konstruktsioonid, et lubada vĂ”i keelata kogu liiklust tavapĂ€rase NetworkPolicy API kaudu, sisaldavad keerulisi ja meeldejÀÀvaid konstruktsioone sulgudes. Calico puhul piisab tulemĂŒĂŒri reegli logika muutmiseks vastupidiseks, kui muuta action: Allow jĂ€rgnevaga action: Deny.
Isolatsioon keskkondade kaupa
Kujutage nĂŒĂŒd olukorda, kus rakendus genereerib Ă€rimetreid nende kogumiseks Prometheuses ja edasisteks analĂŒĂŒsideks Grafanas. VĂ€ljavĂ”ttes vĂ”ivad olla tundlikud andmed, mis vaikimisi on taas kergesti kĂ€tte saadavad. Kaitseme need andmed vÔÔraste silmade eest:

Prometheus on tavaliselt eraldi teenusekeskkonnas â nĂ€ites on see nimede ruum jĂ€rgmise nimega:
apiVersion: v1
kind: Namespace
metadata:
labels:
module: prometheus
name: kube-prometheus VÀli metadata.labels see ei juhtunud juhuslikult. Nagu eespool juba mainitud, namespaceSelector'iga (nagu ka podSelector) opereerib etiketiga. SeetÔttu, et lubada metrikate hankimist kÔigilt pod'idelt teatud pordil, tuleb lisada mÔni silt (vÔi vÔtta olemasolevatest), seejÀrel rakendada konfiguratsioon nagu:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-metrics-prom
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
module: prometheus
ports:
- protocol: TCP
port: 9100Ja Calico poliitikate kasutamise korral nĂ€eb sĂŒntaks vĂ€lja jĂ€rgmine:
apiVersion: crd.projectcalico.org/v1
kind: NetworkPolicy
metadata:
name: allow-metrics-prom
spec:
ingress:
- action: Allow
protocol: TCP
source:
namespaceSelector: module == 'prometheus'
destination:
ports:
- 9100Ăldiselt saab selliste poliitikate kohandamisel konkreetsete vajadustega kaitsta rakenduste tööd klastris pahatahtliku vĂ”i juhusliku sekkumise eest.
Parim praktika Calico looja arvates on lÀhenemine "Keela kÔik ja ava selgelt vajalik", mis on dokumenteeritud (sama lÀhenemist jÀrgivad ka teised, sealhulgas ).
Lisaressursside Calico rakendamine
Tuletan meelde, et Calico laiendatud API komplekti kaudu saab reguleerida sĂ”lmede kĂ€ttesaadavust, mitte ainult podâide osas. JĂ€rgmises nĂ€ites aitab see GlobalNetworkPolicy blokeerida ICMP-pĂ€ringute lĂ€bimise klastris (nĂ€iteks podâist sĂ”lmele, podâide vahel vĂ”i sĂ”lmelt podâi IP-le):
apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
name: block-icmp
spec:
order: 200
selector: all()
types:
- Ingress
- Egress
ingress:
- action: Deny
protocol: ICMP
egress:
- action: Deny
protocol: ICMP Eeltoodud juhul jÀÀb klastris olevatele sĂ”lmedele vĂ”imalus ĂŒksteisega ICMP kaudu ĂŒhendust vĂ”tta. Ja see probleem lahendatakse GlobalNetworkPolicy, mis on rakendatud objekti HostEndpoint:
apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
name: deny-icmp-kube-02
spec:
selector: "role == 'k8s-node'"
order: 0
ingress:
- action: Allow
protocol: ICMP
egress:
- action: Allow
protocol: ICMP
---
apiVersion: crd.projectcalico.org/v1
kind: HostEndpoint
metadata:
name: kube-02-eth0
labels:
role: k8s-node
spec:
interfaceName: eth0
node: kube-02
expectedIPs: ["192.168.2.2"]VPNi juhtum
Toon lĂ”puks ĂŒsna reaalset nĂ€idet Calico funktsioonide kasutamisest, kui standardne poliitikakogum ei piisa klastritevahelise suhtluse juhtimiseks. Klientide juurdepÀÀs veebirakendusele toimub VPN-tunneli kaudu, kusjuures juurdepÀÀs on rangelt reguleeritud ja piiratud kindla lubatud teenuste nimekirjaga:

Kliendid ĂŒhenduvad VPN-i kaudu tavalise UDP-pordi 1194 kaudu ja saavad ĂŒhendamisel marsruudid klastrite pods ja teenuste alamvĂ”rkudesse. AlamvĂ”rgud pushâitakse tervikuna, et teenused ei kaoks taaskĂ€ivituste ja aadresside muutmise korral.
Konfiguratsioonis on port standardne, mis seab rakenduse konfigureerimise protsessile ja selle viimiseks Kubernetes klastrisse mÔned eripÀrad. NÀiteks, AWS LoadBalanceris ilmus UDP eelmisel aastal piiratud piirkondade loetelus, kuid NodePorti ei saa kasutada, kuna see suunatakse kÔikidele klastris olevatele sÔlmedele ja ei ole vÔimalik skaleerida serveri instantside arvu töökindluse saavutamiseks. Lisaks tuleb muuta vaikimisi valitud portide vahemikku...
VĂ”imalike lahenduste ĂŒlesseadmise tulemusel valiti jĂ€rgnev:
- VPN Pod'id plaanitakse sĂ”lmele reĆŸiimis
hostNetwork, st tegelikule IP-le. - Teenust vÀljapoole suunatakse lÀbi
ClusterIP. SĂ”lmel tĂ”stetakse fĂŒĂŒsiliselt port, mis on kergelt vĂ€ljastpoolt kergesti ligipÀÀsetav (tingimuslik olemasolek reaalse IP-aadressiga). - SĂ”lme mÀÀramise, kuhu pod on ĂŒles tĂ”stetud, jÀÀb meie jutustuse piiridest vĂ€lja. Ătlen vaid, et teenust saab kindlalt "kinni haakida" sĂ”lmele vĂ”i kirjutada vĂ€ikese sidecar-teenuse, mis jĂ€lgib VPN-teenuse praegust IP-aadressi ja muudab kliente registreeritud DNS-kirjeid â kellel on kujutlust.
VPN-i IP-aadressi kaudu saame kliendi selgelt tuvastada. Allpool on primitiivne nÀide selle kliendi juurdepÀÀsu piirangust, kasutades eespool mainitud Redis't:
apiVersion: crd.projectcalico.org/v1
kind: HostEndpoint
metadata:
name: vpnclient-eth0
labels:
role: vpnclient
environment: production
spec:
interfaceName: "*"
node: kube-02
expectedIPs: ["172.176.176.2"]
---
apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
name: vpn-rules
spec:
selector: "role == 'vpnclient'"
order: 0
applyOnForward: true
preDNAT: true
ingress:
- action: Deny
protocol: TCP
destination:
ports: [6379]
- action: Allow
protocol: UDP
destination:
ports: [53, 67]Siin on port 6379 ĂŒhendamine rangelt keelatud, kuid samal ajal on DNS-teenus sĂ€ilinud, mille toimivus kannatab sageli reeglite koostamisel. Sest nagu eelnevalt mainitud, rakendatakse sĂ€ttega seoses vaikimisi keelu poliitikat, kui pole öeldud teisiti.
KokkuvÔte
Seega saab Calico laiendatud API abil paindlikult konfigureerida ja dĂŒnaamiliselt muuta marsruutimist klastris ja selle ĂŒmber. Ăldiselt vĂ”ib selle kasutamine tunduda nagu pĂŒssist varblaste peale laskmine, ning L3-vĂ”rgu juurutamine BGP- ja IP-IP-tunnelitega nĂ€eb vĂ€lja monstrueus lihtsas Kubernetes'i tasandatud vĂ”rgus⊠Siiski nĂ€eb muu tööriist vĂ€lja ĂŒsna elujĂ”uline ja kasulik.
Klastri isoleerimine turvanÔuete tÀitmiseks ei pruugi alati olla teostatav, ja just sellistel juhtudel tulebki appi Calico (vÔi sarnane lahendus). Artiklis toodud nÀidiseid (veidi kohandatuna) kasutatakse mitmes meie klientide AWS-i paigalduses.
P.S.
Lugege ka meie blogist:
- «»;
- âIllustreeritud juhend Kuberneteses olevate vĂ”rkude seadistamiseksâ: , ;
- «».
Allikas: habr.com
