Calico għan-netwerking f'Kubernetes: introduzzjoni u ftit esperjenza

Calico għan-netwerking f'Kubernetes: introduzzjoni u ftit esperjenza

L-iskop tal-artikolu huwa li jintroduċi lill-qarrej għall-baŜi tan-netwerking u l-ġestjoni tal-politiki tan-netwerk f'Kubernetes, kif ukoll il-plugin Calico ta 'parti terza li jestendi l-kapaċitajiet standard. Tul it-triq, il-faċilità tal-konfigurazzjoni u xi karatteristiċi se jintwerew bl-użu ta 'eżempji reali mill-esperjenza operattiva tagħna.

Introduzzjoni ta' malajr għall-apparat tan-netwerking Kubernetes

Raggruppament Kubernetes ma jistax jiġi immaġinat mingħajr netwerk. Diġà ppubblikajna materjali dwar l-affarijiet bażiċi tagħhom: “Gwida illustrata għan-netwerking f'Kubernetes"U"Introduzzjoni għall-Politiki tan-Netwerk ta' Kubernetes għall-Professjonisti tas-Sigurtà".

Fil-kuntest ta’ dan l-artikolu, huwa importanti li wieħed jinnota li K8s innifsu mhuwiex responsabbli għall-konnettività tan-netwerk bejn il-kontenituri u n-nodi: għal dan, diversi Plugins tas-CNI (Kontenitur Netwerking Interface). Aktar dwar dan il-kunċett aħna qaluli wkoll.

Pereżempju, l-aktar komuni minn dawn il-plugins huwa Flannel — jipprovdi konnettività sħiħa tan-netwerk bejn in-nodi tal-clusters kollha billi jgħolli l-pontijiet fuq kull nodu, u jassenjalu subnet. Madankollu, aċċessibbiltà kompluta u mhux regolata mhux dejjem tkun ta’ benefiċċju. Biex tipprovdi xi tip ta 'iżolament minimu fil-cluster, huwa meħtieġ li jintervjeni fil-konfigurazzjoni tal-firewall. Fil-każ ġenerali, titqiegħed taħt il-kontroll tal-istess CNI, u huwa għalhekk li kwalunkwe interventi ta 'partijiet terzi f'iptables jistgħu jiġu interpretati ħażin jew injorati għal kollox.

U "barra mill-kaxxa" għall-organizzazzjoni tal-ġestjoni tal-politika tan-netwerk fi cluster Kubernetes hija pprovduta NetworkPolicy API. Din ir-riżorsa, imqassma fuq spazji tal-isem magħżula, jista' jkun fiha regoli biex jiddifferenzjaw l-aċċess minn applikazzjoni għal oħra. Jippermettilek ukoll tikkonfigura l-aċċessibbiltà bejn pods, ambjenti (ispazji tal-isem) jew blokki ta’ indirizzi IP speċifiċi:

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

Dan mhuwiex l-aktar eżempju primittiv ta dokumentazzjoni uffiċjali jista' darba għal dejjem jiskoraġġixxi x-xewqa li wieħed jifhem il-loġika ta' kif jaħdmu l-politiki tan-netwerk. Madankollu, xorta se nippruvaw nifhmu l-prinċipji bażiċi u l-metodi tal-ipproċessar tal-flussi tat-traffiku bl-użu ta’ politiki tan-netwerk...

Huwa loġiku li hemm 2 tipi ta 'traffiku: id-dħul fil-pod (Dħul) u l-ħruġ minnu (Egress).

Calico għan-netwerking f'Kubernetes: introduzzjoni u ftit esperjenza

Fil-fatt, il-politika hija maqsuma f'dawn iż-żewġ kategoriji bbażati fuq id-direzzjoni tal-moviment.

L-attribut meħtieġ li jmiss huwa selettur; dak li għalih tapplika r-regola. Dan jista’ jkun pod (jew grupp ta’ imżiewed) jew ambjent (jiġifieri namespace). Dettall importanti: iż-żewġ tipi ta' dawn l-oġġetti għandu jkun fihom tikketta (tikketta fit-terminoloġija Kubernetes) - dawn huma dawk li jaħdmu magħhom il-politiċi.

Minbarra għadd finit ta 'seletturi magħquda b'xi tip ta' tikketta, huwa possibbli li tikteb regoli bħal "Ħalli / iċħad kollox / kulħadd" f'varjazzjonijiet differenti. Għal dan il-għan, jintużaw kostruzzjonijiet tal-forma:

  podSelector: {}
  ingress: []
  policyTypes:
  - Ingress

— f'dan l-eżempju, il-miżwed kollha fl-ambjent huma mblukkati mit-traffiku li jkun dieħel. L-imġiba opposta tista 'tinkiseb bil-kostruzzjoni li ġejja:

  podSelector: {}
  ingress:
  - {}
  policyTypes:
  - Ingress

Bl-istess mod għall-ħruġ:

  podSelector: {}
  policyTypes:
  - Egress

- biex titfiha. U hawn x'għandek tinkludi:

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

Nirritornaw għall-għażla ta 'plugin CNI għal cluster, ta' min jinnota li mhux kull plugin tan-netwerk jappoġġja NetworkPolicy. Pereżempju, il-Flannel diġà msemmi ma jafx kif tikkonfigura l-politiki tan-netwerk, liema huwa qal direttament fir-repożitorju uffiċjali. Hemm tissemma wkoll alternattiva - proġett Open Source Calico, li tespandi b'mod sinifikanti s-sett standard ta' Kubernetes APIs f'termini ta' politiki tan-netwerk.

Calico għan-netwerking f'Kubernetes: introduzzjoni u ftit esperjenza

Insiru nafu lil Calico: teorija

Il-plugin Calico jista 'jintuża fl-integrazzjoni ma' Flannel (sottoproġett Canal) jew b'mod indipendenti, li jkopri kemm il-konnettività tan-netwerk kif ukoll il-kapaċitajiet ta' ġestjoni tad-disponibbiltà.

X'opportunitajiet tipprovdi l-użu tas-soluzzjoni "b'kaxxa" K8s u s-sett API minn Calico?

Hawn x'inhu mibni fin-NetwerkPolicy:

  • il-politiċi huma limitati mill-ambjent;
  • politiki huma applikati għall-imżiewed immarkati b'tikketti;
  • regoli jistgħu jiġu applikati għall-imżiewed, ambjenti jew subnets;
  • ir-regoli jista' jkun fihom protokolli, speċifikazzjonijiet tal-port imsemmija jew simboliċi.

Hawn kif Calico jestendi dawn il-funzjonijiet:

  • politiki jistgħu jiġu applikati għal kwalunkwe oġġett: pod, kontenitur, magna virtwali jew interface;
  • ir-regoli jista' jkun fihom azzjoni speċifika (projbizzjoni, permess, qtugħ);
  • il-mira jew is-sors tar-regoli jista 'jkun port, firxa ta' portijiet, protokolli, attributi HTTP jew ICMP, IP jew subnet (4 jew 6 ġenerazzjoni), kwalunkwe seletturi (nodi, hosts, ambjenti);
  • Barra minn hekk, tista' tirregola l-mogħdija tat-traffiku billi tuża s-settings tad-DNAT u l-politiki tat-trażmissjoni tat-traffiku.

L-ewwel impenji fuq GitHub fir-repożitorju Calico jmorru lura għal Lulju 2016, u sena wara l-proġett ħa pożizzjoni ewlenija fl-organizzazzjoni tal-konnettività tan-netwerk Kubernetes - dan jidher, pereżempju, mir-riżultati tal-istħarriġ, immexxi minn The New Stack:

Calico għan-netwerking f'Kubernetes: introduzzjoni u ftit esperjenza

Ħafna soluzzjonijiet kbar ġestiti b'K8s, bħal Amazon EKS, Azure AKS, Google GKE u oħrajn bdew jirrakkomandawha għall-użu.

Fir-rigward tal-prestazzjoni, kollox huwa kbir hawn. Fl-ittestjar tal-prodott tagħhom, it-tim ta 'żvilupp Calico wera prestazzjoni astronomika, li jħaddem aktar minn 50000 kontenitur fuq 500 nodu fiżiku b'rata ta' ħolqien ta '20 kontenitur kull sekonda. L-ebda problemi ma ġew identifikati bl-iskala. Riżultati bħal dawn tħabbru diġà mat-tħabbira tal-ewwel verżjoni. Studji indipendenti li jiffokaw fuq il-produzzjoni u l-konsum tar-riżorsi jikkonfermaw ukoll il-prestazzjoni ta 'Calico hija kważi tajba daqs dik ta' Flannel. Per eżempju:

Calico għan-netwerking f'Kubernetes: introduzzjoni u ftit esperjenza

Il-proġett qed jiżviluppa malajr ħafna, jappoġġa xogħol f'soluzzjonijiet popolari ġestiti K8s, OpenShift, OpenStack, huwa possibbli li tuża Calico meta tuża cluster bl-użu kops, hemm referenzi għall-kostruzzjoni ta 'netwerks Service Mesh (hawn hu eżempju użata flimkien ma’ Istio).

Prattika ma Calico

Fil-każ ġenerali tal-użu ta 'vanilla Kubernetes, l-installazzjoni tas-CNI tirriżulta mill-użu tal-fajl calico.yaml, jitniżżel mill-websajt uffiċjali, billi tuża kubectl apply -f.

Bħala regola, il-verżjoni attwali tal-plugin hija kompatibbli mal-aħħar 2-3 verżjonijiet ta 'Kubernetes: it-tħaddim f'verżjonijiet eqdem mhuwiex ittestjat u mhux garantit. Skont l-iżviluppaturi, Calico jaħdem fuq qlub Linux 'il fuq minn 3.10 li jaħdem CentOS 7, Ubuntu 16 jew Debian 8, fuq iptables jew IPVS.

Iżolament fl-ambjent

Għal fehim ġenerali, ejja nħarsu lejn każ sempliċi biex nifhmu kif il-politiki tan-netwerk fin-notazzjoni Calico huma differenti minn dawk standard u kif l-approċċ biex jinħolqu regoli jissimplifika l-leġibbiltà u l-flessibilità tal-konfigurazzjoni tagħhom:

Calico għan-netwerking f'Kubernetes: introduzzjoni u ftit esperjenza

Hemm 2 applikazzjonijiet tal-web skjerati fil-cluster: f'Node.js u PHP, li waħda minnhom tuża Redis. Biex timblokka l-aċċess għal Redis minn PHP, filwaqt li żżomm il-konnettività ma 'Node.js, applika biss il-politika li ġejja:

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

Essenzjalment ippermettejna traffiku deħlin lejn il-port ta 'Redis minn Node.js. U b'mod ċar ma pprojbixxewx xi ħaġa oħra. Hekk kif tidher NetworkPolicy, is-seletturi kollha msemmija fiha jibdew ikunu iżolati, sakemm ma jkunx speċifikat mod ieħor. Madankollu, ir-regoli tal-iżolament ma japplikawx għal oġġetti oħra mhux koperti mis-selettur.

L-eżempju juża apiVersion Kubernetes barra mill-kaxxa, iżda xejn ma jżommek milli tużah riżorsa bl-istess isem mill-kunsinna Calico. Is-sintassi hemm hija aktar dettaljata, għalhekk ser ikollok bżonn tikteb mill-ġdid ir-regola għall-każ ta 'hawn fuq fil-forma li ġejja:

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

Il-kostruzzjonijiet imsemmija hawn fuq biex jippermettu jew jiċħdu t-traffiku kollu permezz tal-API NetworkPolicy regolari fihom kostruzzjonijiet b'parentesi li huma diffiċli biex jinftiehmu u jiftakru. Fil-każ ta 'Calico, biex tibdel il-loġika ta' regola tal-firewall għall-oppost, ibdel biss action: Allow fuq action: Deny.

Iżolament mill-ambjent

Issa immaġina sitwazzjoni fejn applikazzjoni tiġġenera metriċi tan-negozju għall-ġbir fi Prometheus u analiżi ulterjuri bl-użu ta’ Grafana. It-tlugħ jista' jkun fih dejta sensittiva, li għal darb'oħra tista' tara pubblikament b'mod awtomatiku. Ejja naħbu din id-dejta minn għajnejhom:

Calico għan-netwerking f'Kubernetes: introduzzjoni u ftit esperjenza

Prometheus, bħala regola, jitqiegħed f'ambjent ta 'servizz separat - fl-eżempju se jkun namespace bħal dan:

apiVersion: v1
kind: Namespace
metadata:
  labels:
    module: prometheus
  name: kube-prometheus

Qasam metadata.labels dan irriżulta li ma kienx inċident. Kif imsemmi hawn fuq, namespaceSelector (kif ukoll podSelector) topera b'tikketti. Għalhekk, biex tippermetti li jittieħdu metriċi mill-imżiewed kollha fuq port speċifiku, ikollok iżżid xi tip ta' tikketta (jew tieħu minn dawk eżistenti), u mbagħad tapplika konfigurazzjoni bħal:

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

U jekk tuża politiki Calico, is-sintassi tkun bħal din:

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

B'mod ġenerali, billi żżid dawn it-tipi ta 'politiki għal bżonnijiet speċifiċi, tista' tipproteġi kontra interferenza malizzjuża jew aċċidentali fl-operat tal-applikazzjonijiet fil-cluster.

L-aħjar prattika, skont il-ħallieqa ta' Calico, hija l-approċċ "Bblokka kollox u iftaħ b'mod espliċitu dak li għandek bżonn", iddokumentat f' dokumentazzjoni uffiċjali (oħrajn isegwu approċċ simili - b'mod partikolari, fi artiklu diġà msemmi).

Bl-użu ta 'Oġġetti Calico Addizzjonali

Ħa nfakkarkom li permezz tas-sett estiż ta' Calico APIs tista' tirregola d-disponibbiltà tan-nodi, mhux limitata għall-imżiewed. Fl-eżempju li ġej bl-użu GlobalNetworkPolicy l-abbiltà li tgħaddi talbiet ICMP fil-cluster hija magħluqa (per eżempju, pings minn pod għal node, bejn pods, jew minn node għal pod IP):

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

Fil-każ ta 'hawn fuq, xorta huwa possibbli li n-nodi tal-cluster "jilħqu" lil xulxin permezz tal-ICMP. U din il-kwistjoni tissolva permezz ta 'mezzi GlobalNetworkPolicy, applikat għal entità 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"]

Il-Każ VPN

Fl-aħħarnett, se nagħti eżempju reali ħafna tal-użu tal-funzjonijiet Calico għall-każ ta 'interazzjoni qrib cluster, meta sett standard ta' politiki ma jkunx biżżejjed. Il-klijenti jużaw mina VPN biex jaċċessaw l-applikazzjoni tal-web, u dan l-aċċess huwa kkontrollat ​​sewwa u limitat għal lista speċifika ta’ servizzi permessi għall-użu:

Calico għan-netwerking f'Kubernetes: introduzzjoni u ftit esperjenza

Il-klijenti jikkonnettjaw mal-VPN permezz tal-port standard UDP 1194 u, meta konnessi, jirċievu rotot għas-subnets tal-clusters tal-imżiewed u s-servizzi. Subnets sħaħ huma mbuttati sabiex ma jitilfux is-servizzi waqt il-bidu mill-ġdid u l-bidliet fl-indirizz.

Il-port fil-konfigurazzjoni huwa standard, li jimponi xi sfumaturi fuq il-proċess tal-konfigurazzjoni tal-applikazzjoni u t-trasferiment tagħha lill-cluster Kubernetes. Pereżempju, fl-istess AWS LoadBalancer għal UDP deher litteralment fl-aħħar tas-sena li għaddiet f'lista limitata ta 'reġjuni, u NodePort ma jistax jintuża minħabba t-twassil tiegħu fuq in-nodi kollha tal-clusters u huwa impossibbli li tiskala n-numru ta' istanzi tas-server għal skopijiet ta' tolleranza għal ħtija. Barra minn hekk, ser ikollok tibdel il-firxa default tal-portijiet...

Bħala riżultat ta 'tfittxija permezz ta' soluzzjonijiet possibbli, intgħażel dan li ġej:

  1. Il-miżwed b'VPN huma skedati għal kull nodu fi hostNetwork, jiġifieri, għall-IP attwali.
  2. Is-servizz huwa stazzjonat barra permezz ClusterIP. Port huwa fiżikament installat fuq in-nodu, li huwa aċċessibbli minn barra b'riżervi minuri (preżenza kondizzjonali ta 'indirizz IP reali).
  3. Id-determinazzjoni tan-nodu li fuqu tela 'l-pows huwa lil hinn mill-ambitu tal-istorja tagħna. Ngħid biss li tista '"dwiefer" sewwa s-servizz f'node jew tikteb servizz sidecar żgħir li se jimmonitorja l-indirizz IP attwali tas-servizz VPN u jeditja r-rekords DNS reġistrati mal-klijenti - min għandu immaġinazzjoni biżżejjed.

Mill-perspettiva tar-rotta, nistgħu nidentifikaw b'mod uniku klijent VPN mill-indirizz IP tiegħu maħruġ mis-server VPN. Hawn taħt hawn eżempju primittiv ta’ restrizzjoni tal-aċċess ta’ tali klijent għas-servizzi, illustrat fuq ir-Redis imsemmija hawn fuq:

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]

Hawnhekk, il-konnessjoni mal-port 6379 hija strettament ipprojbita, iżda fl-istess ħin it-tħaddim tas-servizz DNS huwa ppreservat, li l-funzjonament tiegħu ta 'spiss ibati meta jfassal ir-regoli. Minħabba li, kif issemma qabel, meta selettur jidher, il-politika ta' ċaħda default tiġi applikata għalih sakemm ma jkunx speċifikat mod ieħor.

Riżultati ta '

Għalhekk, billi tuża l-API avvanzata ta 'Calico, tista' tikkonfigura b'mod flessibbli u tbiddel b'mod dinamiku r-rotot ġewwa u madwar il-cluster. B'mod ġenerali, l-użu tiegħu jista 'jidher qisu sparrows b'kanun, u l-implimentazzjoni ta' netwerk L3 b'mini BGP u IP-IP tidher mostruża f'installazzjoni Kubernetes sempliċi fuq netwerk ċatt... Madankollu, inkella l-għodda tidher pjuttost vijabbli u utli .

L-iżolament ta 'cluster biex jissodisfa r-rekwiżiti tas-sigurtà jista' mhux dejjem ikun fattibbli, u dan huwa fejn Calico (jew soluzzjoni simili) tiġi salvata. L-eżempji mogħtija f'dan l-artikolu (b'modifiki minuri) jintużaw f'diversi installazzjonijiet tal-klijenti tagħna fl-AWS.

PS

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment