Calico Kubernetes'i vÔrgu jaoks: sissejuhatus ja veidi kogemust

Calico Kubernetes'i vÔrgu jaoks: sissejuhatus ja veidi kogemust

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: "Illustreeritud juhend Kubernetes'e vÔrgu struktuuri kohta» ja «Kubernetes'e vÔrgupoliitikas tutvumine turvaekspertidele».

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

NĂ€iteks on kĂ”ige levinum selline plugin — Flannel — 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 NetworkPolicy API. 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: 5978

See esemest saysi caso non primari. ametlikus dokumentatsioonis 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).

Calico Kubernetes'i vÔrgu jaoks: sissejuhatus ja veidi kogemust

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:
  - Ingress

Sama kehtib ka vÀljuva liikluse kohta:

  podSelector: {}
  policyTypes:
  - Egress

— selle keelamiseks. Ja siin on see, kuidas seda lubada:

  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Egress

Tagasi 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 on selgelt mĂ€rgitud ametlikus hoidlas. Seal mainitakse ka alternatiivi — avatud lĂ€htekoodiga projekt Calico, mis laianeb oluliselt Kubernetes'e vĂ”rgu poliitilisi API-sid.

Calico Kubernetes'i vÔrgu jaoks: sissejuhatus ja veidi kogemust

Tutvume Calicoga: teooria

Calico plugin saab kasutada Flanneliga koos (alaprojekt Canal) 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. mida viis lĂ€bi The New Stack.:

Calico Kubernetes'i vÔrgu jaoks: sissejuhatus ja veidi kogemust

Paljud suured K8s-i hallatud lahendused, nagu Amazon EKS, Azure AKS,, Google GKE 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 oli vĂ€lja öeldud 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. Piemēram:

Calico Kubernetes'i vÔrgu jaoks: sissejuhatus ja veidi kogemust

Projekt areneb vÀga kiiresti, toetades töötlust populaarsetes hallatud K8s-i lahendustes, OpenShiftis, OpenStackis ning on vÔimalik kasutada Calicot klastrite juurutamisel kops, kohtab viiteid Service Mesh-vÔrkude ehitamisele (Siin on nÀide koostööst Istio'ga).

Praktika Calicoga

Üldjuhul sisaldab vanilje Kubernetes'i installatsiooni CNI kohaldamine faili calico.yaml, ametlikult saidilt alla laadida., 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:

Calico Kubernetes'i vÔrgu jaoks: sissejuhatus ja veidi kogemust

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: 6379

PÔ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 samanimelist ressurssi Calico tarnest. 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:

Calico Kubernetes'i vÔrgu jaoks: sissejuhatus ja veidi kogemust

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: 9100

Ja 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 ametlikus dokumentatsioonis (sama lÀhenemist jÀrgivad ka teised, sealhulgas juba mainitud artiklis).

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:

Calico Kubernetes'i vÔrgu jaoks: sissejuhatus ja veidi kogemust

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:

  1. VPN Pod'id plaanitakse sĂ”lmele reĆŸiimis hostNetwork, st tegelikule IP-le.
  2. 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).
  3. 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:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster