Calico airson lìonrachadh ann an Kubernetes: ro-ràdh agus beagan eòlais

Calico airson lìonrachadh ann an Kubernetes: ro-ràdh agus beagan eòlais

Is e adhbhar an artaigil fiosrachadh a thoirt don leughadair bunaitean lìonrachadh agus riaghladh phoileasaidhean lìonra ann an Kubernetes, a bharrachd air plugan treas-phàrtaidh Calico a leudaicheas comasan àbhaisteach. Air an t-slighe, thèid cho furasta ‘s a tha an rèiteachadh agus cuid de fheartan a thaisbeanadh le bhith a’ cleachdadh fìor eisimpleirean bhon eòlas obrachaidh againn.

Ro-ràdh sgiobalta air inneal lìonraidh Kubernetes

Chan urrainnear cruinneachadh de Kubernetes a shamhlachadh às aonais lìonra. Tha sinn mu thràth air stuthan fhoillseachadh air na bunaitean aca: “Leabhar-iùil le dealbhan air lìonrachadh ann an Kubernetes"Agus"Ro-ràdh mu phoileasaidhean lìonra Kubernetes airson Proifeasantaich Tèarainteachd".

Ann an co-theacsa an artaigil seo, tha e cudromach cuimhneachadh nach eil K8s fhèin an urra ri ceangal lìonra eadar soithichean agus nodan: airson seo, diofar Plugins airson CNI (Eadar-aghaidh Lìonra Container). Tuilleadh mun bhun-bheachd seo sinn dh'innis iad dhomh mar an ceudna.

Mar eisimpleir, is e am fear as cumanta de na plugins sin Flannel - a’ toirt seachad làn cheangal lìonra eadar a h-uile nod brabhsair le bhith a’ togail dhrochaidean air gach nód, a’ sònrachadh subnet dha. Ach, chan eil ruigsinneachd iomlan agus neo-riaghlaichte an-còmhnaidh buannachdail. Gus beagan aonaranachd a thoirt seachad sa bhuidheann, feumar eadar-theachd a dhèanamh ann an rèiteachadh a ’bhalla-teine. Anns a ’chùis choitcheann, tha e air a chuir fo smachd an aon CNI, agus is e sin as coireach gum faodar eadar-theachdan treas-phàrtaidh sam bith ann an iptables a mhìneachadh gu ceàrr no an leigeil seachad gu tur.

Agus tha “a-mach às a’ bhogsa ”airson riaghladh poileasaidh lìonra a chuir air dòigh ann am buidheann Kubernetes air a thoirt seachad API NetworkPolicy. Dh’fhaoidte gu bheil riaghailtean anns a’ ghoireas seo, a tha air a chuairteachadh thairis air ainmean taghte, gus slighe a dhealachadh bho aon iarrtas gu tagradh eile. Leigidh e leat cuideachd ruigsinneachd a rèiteachadh eadar pods sònraichte, àrainneachdan (àiteachan ainmean) no blocaichean de sheòlaidhean IP:

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

Chan e seo an eisimpleir as prìomhadaiche de sgrìobhainnean oifigeil dh’ fhaodadh e uair is uair a bhith a’ dì-mhisneachadh a’ mhiann a bhith a’ tuigsinn loidsig mar a tha poileasaidhean lìonraidh ag obair. Ach, feuchaidh sinn fhathast ri tuigse fhaighinn air na prionnsapalan bunaiteach agus na dòighean airson sruthan trafaic a ghiullachd a’ cleachdadh poileasaidhean lìonraidh ...

Tha e loidsigeach gu bheil 2 sheòrsa trafaic ann: a-steach don pod (Ingress) agus a-mach às (Egress).

Calico airson lìonrachadh ann an Kubernetes: ro-ràdh agus beagan eòlais

Gu fìrinneach, tha poilitigs air a roinn anns na 2 roinnean sin stèidhichte air stiùir gluasad.

Is e an ath fheart riatanach neach-taghaidh; an neach ris am buin an riaghailt. Faodaidh seo a bhith na pod (no buidheann de pods) no àrainneachd (i.e. ainm-àite). Mion-fhiosrachadh cudromach: feumaidh bileag a bhith anns an dà sheòrsa de na stuthan sin (label ann am briathrachas Kubernetes) - is iad sin an fheadhainn leis a bheil luchd-poilitigs ag obair.

A bharrachd air àireamh chrìochnaichte de luchd-taghaidh aonaichte le leubail de sheòrsa air choreigin, tha e comasach riaghailtean mar “Ceadaich / àich a h-uile càil / a h-uile duine” a sgrìobhadh ann an diofar atharrachaidhean. Airson an adhbhair seo, thathar a 'cleachdadh structaran togail:

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

- san eisimpleir seo, tha a h-uile pod san àrainneachd air a bhacadh bho thrafaig a’ tighinn a-steach. Faodar an giùlan eile a choileanadh leis an togail a leanas:

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

San aon dòigh airson a dhol a-mach:

  podSelector: {}
  policyTypes:
  - Egress

- gus a thionndadh dheth. Agus seo na bu chòir a thoirt a-steach:

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

A 'tilleadh gu roghainn plugan CNI airson brabhsair, is fhiach sin a thoirt fa-near chan eil a h-uile plugan lìonra a’ toirt taic do NetworkPolicy. Mar eisimpleir, chan eil fios aig an Flannel a chaidh ainmeachadh mar-thà mar a chuireas tu poileasaidhean lìonra air dòigh, a tha tha e air a ràdh gu dìreach anns an ionad-tasgaidh oifigeil. Thathas cuideachd a’ toirt iomradh air roghainn eile an sin - pròiseact Open Source Calico, a leudaicheas gu mòr an seata àbhaisteach de Kubernetes APIs a thaobh poileasaidhean lìonra.

Calico airson lìonrachadh ann an Kubernetes: ro-ràdh agus beagan eòlais

A’ faighinn eòlas air Calico: teòiridh

Faodar am plugan Calico a chleachdadh ann an amalachadh le Flannel (fo-phròiseact Mhòir) no gu neo-eisimeileach, a’ còmhdach an dà chuid ceangal lìonra agus comasan riaghlaidh ruigsinneachd.

Dè na cothroman a tha ann a bhith a’ cleachdadh fuasgladh “bogsa” K8s agus an seata API bho Calico?

Seo na tha air a thogail a-steach do NetworkPolicy:

  • tha luchd-poilitigs cuingealaichte leis an àrainneachd;
  • tha poileasaidhean air an cur an sàs ann am pods air an comharrachadh le bileagan;
  • faodar riaghailtean a chuir an sàs ann am pods, àrainneachdan no subnets;
  • faodaidh protocols a bhith ann an riaghailtean, sònrachaidhean puirt ainmichte no samhlachail.

Seo mar a tha Calico a’ leudachadh nan gnìomhan sin:

  • faodar poileasaidhean a chuir an sàs ann an nì sam bith: pod, container, inneal mas-fhìor no eadar-aghaidh;
  • faodaidh gnìomh sònraichte a bhith anns na riaghailtean (casg, cead, logadh);
  • faodaidh an targaid no stòr nan riaghailtean a bhith na phort, raon de phuirt, protocal, buadhan HTTP no ICMP, IP no subnet (4mh no 6mh ginealach), luchd-taghaidh sam bith (nodan, luchd-aoigheachd, àrainneachdan);
  • A bharrachd air an sin, faodaidh tu siubhal trafaic a riaghladh le bhith a’ cleachdadh suidheachaidhean DNAT agus poileasaidhean air adhart trafaic.

Tha a’ chiad ghealladh air GitHub ann an ionad-tasgaidh Calico a’ dol air ais chun Iuchar 2016, agus bliadhna às deidh sin ghabh am pròiseact àite air thoiseach ann a bhith a’ cur air dòigh ceangal lìonra Kubernetes - tha seo ri fhaicinn, mar eisimpleir, le toraidhean an t-suirbhidh, air a stiùireadh leis An Stac Ùr:

Calico airson lìonrachadh ann an Kubernetes: ro-ràdh agus beagan eòlais

Mòran fhuasglaidhean stiùirichte mòr le K8n, leithid Amazon EX, Azure AKS, Google GKE agus thòisich cuid eile air a mholadh airson a chleachdadh.

A thaobh coileanadh, tha a h-uile dad fìor mhath an seo. Ann a bhith a’ dèanamh deuchainn air an toradh aca, sheall sgioba leasachaidh Calico coileanadh speurail, a’ ruith còrr air 50000 soitheach air 500 nodan fiosaigeach le ìre cruthachaidh de 20 soitheach san diog. Cha deach duilgheadasan sam bith a chomharrachadh le sgèileadh. A leithid de thoraidhean air an ainmeachadh mu thràth nuair a chaidh a’ chiad dreach ainmeachadh. Tha sgrùdaidhean neo-eisimeileach a tha a’ cuimseachadh air trochur agus caitheamh ghoireasan cuideachd a’ dearbhadh gu bheil coileanadh Calico cha mhòr cho math ri coileanadh Flannel. Mar eisimpleir:

Calico airson lìonrachadh ann an Kubernetes: ro-ràdh agus beagan eòlais

Tha am pròiseact a’ leasachadh gu math luath, tha e a’ toirt taic do dh’ obair ann am fuasglaidhean mòr-chòrdte air an riaghladh K8s, OpenShift, OpenStack, tha e comasach Calico a chleachdadh nuair a bhios tu a’ cleachdadh brabhsair a’ cleachdadh cop, tha iomradh ann air togail lìonraidhean mogal seirbheis (seo eisimpleir air a chleachdadh ann an co-bhonn ri Istio).

Cleachd le Calico

Anns a 'chùis coitcheann mu bhith a' cleachdadh vanilla Kubernetes, tha stàladh CNI an urra ri bhith a 'cleachdadh an fhaidhle calico.yaml, air a luchdachadh sìos bho làrach-lìn oifigeil, le bhith cleachdadh kubectl apply -f.

Mar riaghailt, tha an dreach làithreach den plugan co-chòrdail ris na dreachan 2-3 as ùire de Kubernetes: chan eil gnìomhachd ann an dreachan nas sine air a dhearbhadh agus chan eil e cinnteach. A rèir an luchd-leasachaidh, bidh Calico a’ ruith air kernels Linux os cionn 3.10 a’ ruith CentOS 7, Ubuntu 16 no Debian 8, a bharrachd air iptables no IPVS.

Iomallach taobh a-staigh na h-àrainneachd

Airson tuigse choitcheann, leig dhuinn sùil a thoirt air cùis shìmplidh gus tuigsinn mar a tha poileasaidhean lìonra ann an comharradh Calico eadar-dhealaichte bhon fheadhainn àbhaisteach agus mar a tha an dòigh-obrach airson riaghailtean a chruthachadh a’ sìmpleachadh an sùbailteachd leughaidh agus rèiteachaidh:

Calico airson lìonrachadh ann an Kubernetes: ro-ràdh agus beagan eòlais

Tha 2 iarrtas lìn air an cleachdadh sa bhuidheann: ann an Node.js agus PHP, agus tha aon dhiubh a’ cleachdadh Redis. Gus casg a chuir air ruigsinneachd gu Redis bho PHP, fhad ‘s a chumas tu ceangal ri Node.js, dìreach cuir am poileasaidh a leanas an sàs:

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

Gu bunaiteach leig sinn le trafaic a-steach gu port Redis bho Node.js. Agus gu soilleir cha do chuir iad casg air dad sam bith eile. Cho luath ‘s a nochdas NetworkPolicy, tòisichidh a h-uile tagraiche a tha air ainmeachadh ann a bhith aonaranach, mura h-eilear ag ràdh a chaochladh. Ach, chan eil na riaghailtean aonaranachd a’ buntainn ri nithean eile nach eil còmhdaichte leis an roghnaichear.

Tha an eisimpleir a 'cleachdadh apiVersion Kubernetes a-mach às a ’bhogsa, ach chan eil dad a’ cur casg ort bho bhith ga chleachdadh goireas den aon ainm bho lìbhrigeadh Calico. Tha an co-chòrdadh ann nas mionaidiche, agus mar sin feumaidh tu an riaghailt ath-sgrìobhadh airson a 'chùis gu h-àrd anns an fhoirm a leanas:

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

Anns na togalaichean gu h-àrd airson a bhith a’ ceadachadh no a’ diùltadh a h-uile trafaic tron ​​API àbhaisteach NetworkPolicy tha togalaichean le bracaidean a tha doirbh a thuigsinn agus a chuimhneachadh. Ann an cùis Calico, gus loidsig riaghailt balla-teine ​​​​atharrachadh air a chaochladh, dìreach atharraich action: Allow air action: Deny.

Iomallach leis an àrainneachd

A-nis smaoinich air suidheachadh far am bi tagradh a’ gineadh metrics gnìomhachais airson an cruinneachadh ann am Prometheus agus tuilleadh sgrùdaidh a’ cleachdadh Grafana. Dh’ fhaodadh gum bi dàta mothachail san luchdachadh suas, a chithear a-rithist gu poblach gu bunaiteach. Feuch an cuir sinn am falach an dàta seo bho shùilean eagallach:

Calico airson lìonrachadh ann an Kubernetes: ro-ràdh agus beagan eòlais

Tha Prometheus, mar riaghailt, air a chuir ann an àrainneachd seirbheis air leth - anns an eisimpleir bidh e na àite-ainm mar seo:

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

achadh metadata.labels cha b’ e tubaist a bha seo. Mar a chaidh ainmeachadh gu h-àrd, namespaceSelector (A bharrachd air podSelector) ag obair le bileagan. Mar sin, gus an tèid meatrach a thoirt bho gach pod air port sònraichte, feumaidh tu seòrsa de leubail a chuir ris (no toirt bhon fheadhainn a th’ ann mar-thà), agus an uairsin rèiteachadh mar:

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

Agus ma chleachdas tu poileasaidhean Calico, bidh an co-chòrdadh mar seo:

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

San fharsaingeachd, le bhith a’ cur ris na seòrsaichean phoileasaidhean sin airson feumalachdan sònraichte, faodaidh tu dìon an aghaidh bacadh droch-rùnach no tubaisteach ann an gnìomhachd thagraidhean sa bhuidheann.

Is e an cleachdadh as fheàrr, a rèir luchd-cruthachaidh Calico, an dòigh-obrach “Bloc a h-uile càil agus fosgail na tha a dhìth ort gu soilleir", air a chlàradh ann an sgrìobhainnean oifigeil (Bidh cuid eile a’ leantainn dòigh-obrach coltach ris - gu sònraichte, ann an artaigil air ainmeachadh mar-thà).

A’ cleachdadh Rudan Calico a bharrachd

Leig leam do chuir nad chuimhne, tron ​​​​t-seata leudaichte de APIan Calico faodaidh tu smachd a chumail air na tha ri fhaighinn de nodan, gun a bhith cuibhrichte ri pods. Anns an eisimpleir a leanas a 'cleachdadh GlobalNetworkPolicy tha an comas air iarrtasan ICMP a thoirt seachad anns a’ bhuidheann dùinte (mar eisimpleir, pings bho pod gu nód, eadar pods, no bho nód gu 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

Anns a ’chùis gu h-àrd, tha e fhathast comasach dha nodan brabhsair“ ruighinn a-mach ”gu chèile tro ICMP. Agus tha a 'chùis seo air a rèiteachadh le dòighean GlobalNetworkPolicy, air a chur an sàs ann an eintiteas 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"]

Cùis VPN

Mu dheireadh, bheir mi fìor eisimpleir de bhith a’ cleachdadh gnìomhan Calico airson eadar-obrachadh faisg air cruinneachadh, nuair nach eil seata àbhaisteach de phoileasaidhean gu leòr. Gus faighinn chun tagradh lìn, bidh teachdaichean a’ cleachdadh tunail VPN, agus tha smachd teann air an ruigsinneachd seo agus air a chuingealachadh ri liosta sònraichte de sheirbheisean a tha ceadaichte a chleachdadh:

Calico airson lìonrachadh ann an Kubernetes: ro-ràdh agus beagan eòlais

Bidh luchd-dèiligidh a’ ceangal ris an VPN tro phort àbhaisteach UDP 1194 agus, nuair a tha iad ceangailte, a’ faighinn slighean gu na subnets cnuasach de pods agus seirbheisean. Bithear a’ putadh subnets slàn gus nach caill iad seirbheisean aig àm ath-thòiseachadh agus atharrachaidhean seòlaidh.

Tha am port san rèiteachadh àbhaisteach, a tha a’ cur cuid de nuances air a’ phròiseas airson an tagradh a rèiteachadh agus a ghluasad gu buidheann Kubernetes. Mar eisimpleir, anns an aon AWS LoadBalancer airson UDP nochd gu litireil aig deireadh na bliadhna an-uiridh ann an liosta cuibhrichte de roinnean, agus chan urrainnear NodePort a chleachdadh air sgàth gun deach a chuir air adhart air a h-uile nod brabhsair agus tha e do-dhèanta an àireamh de shuidheachaidhean frithealaiche a sgèileadh airson. adhbharan fulangas lochdan. A bharrachd air an sin, feumaidh tu an raon bunaiteach de phuirt atharrachadh ...

Mar thoradh air rannsachadh tro fhuasglaidhean comasach, chaidh na leanas a thaghadh:

  1. Tha pods le VPN clàraichte airson gach nód a-steach hostNetwork, is e sin, ris an fhìor IP.
  2. Tha an t-seirbheis air a phostadh taobh a-muigh troimhe ClusterIP. Tha port air a chuir a-steach gu corporra air an nód, a tha ruigsinneach bhon taobh a-muigh le glèidheadh ​​​​beag (làthaireachd le suidheachadh fìor sheòladh IP).
  3. Tha a bhith a’ faighinn a-mach an nód air an do dh’ èirich am pod taobh a-muigh raon na sgeòil againn. Bidh mi dìreach ag ràdh gun urrainn dhut an t-seirbheis a “thairngeadh” gu nód no seirbheis càr-taobh beag a sgrìobhadh a choimheadas seòladh IP gnàthach na seirbheis VPN agus a dheasaicheas tu na clàran DNS a tha clàraichte le teachdaichean - ge bith cò aig a bheil mac-meanmna gu leòr.

Bho shealladh slighe, is urrainn dhuinn neach-dèiligidh VPN a chomharrachadh gu sònraichte leis an t-seòladh IP a chuir am frithealaiche VPN a-mach. Gu h-ìosal tha eisimpleir prìomhadail de bhith a’ cuingealachadh ruigsinneachd teachdaiche mar sin air seirbheisean, ri fhaicinn air an Redis gu h-àrd:

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]

An seo, tha e toirmisgte ceangal a dhèanamh ri port 6379, ach aig an aon àm tha obrachadh na seirbheis DNS air a ghleidheadh, agus bidh an obrachadh gu math tric a 'fulang nuair a bhios tu a' dealbhadh riaghailtean. Air sgàth, mar a chaidh ainmeachadh roimhe, nuair a nochdas roghnaiche, thèid am poileasaidh diùltadh bunaiteach a chuir an sàs mura h-eilear ag innse a chaochladh.

Builean

Mar sin, a’ cleachdadh API adhartach Calico, faodaidh tu slighe a rèiteachadh agus atharrachadh gu dinamach timcheall air a’ bhuidheann. San fharsaingeachd, faodaidh a bhith ga chleachdadh a bhith coltach ri sparrows losgadh le canan, agus tha a bhith a’ cur an gnìomh lìonra L3 le tunailean BGP agus IP-IP a’ coimhead uamhasach ann an stàladh Kubernetes sìmplidh air lìonra rèidh... Ach, air dhòigh eile tha an inneal a’ coimhead gu math obrachail agus feumail .

Is dòcha nach bi e an-còmhnaidh comasach cruinneachadh brabhsair gus coinneachadh ri riatanasan tèarainteachd, agus seo far a bheil Calico (no fuasgladh coltach ris) a’ tighinn gu teasairginn. Tha na h-eisimpleirean a tha air an toirt seachad san artaigil seo (le mion-atharrachaidhean) air an cleachdadh ann an grunn ionadan de ar teachdaichean ann an AWS.

PS

Leugh cuideachd air ar blog:

Source: www.habr.com

Cuir beachd ann