Calico fun Nẹtiwọọki ni Kubernetes: ifihan ati iriri diẹ

Calico fun Nẹtiwọọki ni Kubernetes: ifihan ati iriri diẹ

Idi ti nkan naa ni lati ṣafihan oluka si awọn ipilẹ ti Nẹtiwọọki ati iṣakoso awọn eto imulo nẹtiwọọki ni Kubernetes, bakanna bi ohun itanna Calico ẹni-kẹta ti o fa awọn agbara boṣewa. Ni ọna, irọrun ti iṣeto ati diẹ ninu awọn ẹya yoo ṣe afihan nipa lilo awọn apẹẹrẹ gidi lati iriri iṣẹ wa.

Ifihan iyara si ohun elo Nẹtiwọọki Kubernetes

Akopọ Kubernetes ko le ni ero laisi nẹtiwọki kan. A ti ṣe atẹjade awọn ohun elo tẹlẹ lori awọn ipilẹ wọn: “Itọsọna alaworan si Nẹtiwọọki ni Kubernetes"Ati"Ifihan si Awọn ilana Nẹtiwọọki Kubernetes fun Awọn akosemose Aabo».

Ninu ọrọ ti nkan yii, o ṣe pataki lati ṣe akiyesi pe K8s funrararẹ ko ṣe iduro fun isopọmọ nẹtiwọọki laarin awọn apoti ati awọn apa: fun eyi, ọpọlọpọ CNI afikun (Eiyan Nẹtiwọki Interface). Diẹ ẹ sii nipa yi Erongba a wọn tun sọ fun mi.

Fun apẹẹrẹ, wọpọ julọ ti awọn afikun wọnyi jẹ Flannel - pese Asopọmọra nẹtiwọọki ni kikun laarin gbogbo awọn apa iṣupọ nipa gbigbe awọn afara soke lori ipade kọọkan, fi ipin subnet kan si. Sibẹsibẹ, pipe ati iraye si ilana kii ṣe anfani nigbagbogbo. Lati rii daju diẹ ninu iru ipinya ti o kere ju ninu iṣupọ, o jẹ dandan lati laja ni iṣeto ni ogiriina. Ni ọran gbogbogbo, o wa labẹ iṣakoso ti CNI kanna, eyiti o jẹ idi ti eyikeyi awọn ilowosi ẹnikẹta ni awọn iptables le tumọ ni aṣiṣe tabi foju parẹ lapapọ.

Ati “lati inu apoti” fun siseto iṣakoso eto imulo nẹtiwọọki ni iṣupọ Kubernetes ti pese Ilana Nẹtiwọki API. Orisun yii, ti a pin kaakiri lori awọn aaye orukọ ti a yan, le ni awọn ofin ninu lati ṣe iyatọ iraye si lati ohun elo kan si omiiran. O tun gba ọ laaye lati tunto iraye si laarin awọn adarọ-ese kan pato, awọn agbegbe (awọn aaye orukọ) tabi awọn bulọọki ti awọn adirẹsi 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

Eyi kii ṣe apẹẹrẹ akọkọ julọ ti osise iwe aṣẹ le ni ẹẹkan ati fun gbogbo irẹwẹsi ifẹ lati ni oye ọgbọn ti bii awọn eto imulo nẹtiwọọki ṣe n ṣiṣẹ. Bibẹẹkọ, a yoo tun gbiyanju lati loye awọn ipilẹ ipilẹ ati awọn ọna ti sisẹ ṣiṣan ijabọ nipa lilo awọn eto imulo nẹtiwọọki…

O jẹ ọgbọn pe awọn iru ijabọ 2 wa: titẹ sinu podu (Ingress) ati ti njade lati ọdọ rẹ (Egress).

Calico fun Nẹtiwọọki ni Kubernetes: ifihan ati iriri diẹ

Lootọ, iṣelu ti pin si awọn ẹka 2 wọnyi ti o da lori itọsọna ti gbigbe.

Ẹya ti o nilo atẹle jẹ oluyan; ẹni tí òfin náà kàn. Eyi le jẹ adarọ-ese kan (tabi ẹgbẹ awọn adarọ-ese) tabi agbegbe kan (ie aaye orukọ). Alaye pataki: awọn oriṣi mejeeji ti awọn nkan wọnyi gbọdọ ni aami ninu (aami ni Kubernetes terminology) - iwọnyi ni awọn ti awọn oloselu ṣiṣẹ pẹlu.

Ni afikun si nọmba ti o pari ti awọn oluyanju ti iṣọkan nipasẹ iru aami kan, o ṣee ṣe lati kọ awọn ofin bi "Gba / kọ ohun gbogbo / gbogbo eniyan" ni awọn iyatọ oriṣiriṣi. Fun idi eyi, awọn ikole ti fọọmu ti wa ni lilo:

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

- ni apẹẹrẹ yii, gbogbo awọn adarọ-ese ni ayika ti dina fun ijabọ ti nwọle. Iwa idakeji le ṣee ṣe pẹlu ikole atẹle:

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

Bakanna fun ti njade:

  podSelector: {}
  policyTypes:
  - Egress

- lati pa a. Ati pe eyi ni kini lati pẹlu:

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

Pada si yiyan ohun itanna CNI fun iṣupọ, o tọ lati ṣe akiyesi pe kii ṣe gbogbo ohun itanna nẹtiwọọki ṣe atilẹyin NetworkPolicy. Fun apẹẹrẹ, Flannel ti a mẹnuba tẹlẹ ko mọ bi o ṣe le tunto awọn eto imulo nẹtiwọọki, eyiti o ti sọ taara ninu awọn osise ibi ipamọ. Omiiran tun mẹnuba nibẹ - iṣẹ akanṣe orisun orisun kan Calico, eyi ti o ṣe pataki ti o ṣe pataki ti iṣeto boṣewa ti Kubernetes API ni awọn ofin ti awọn ilana nẹtiwọki.

Calico fun Nẹtiwọọki ni Kubernetes: ifihan ati iriri diẹ

Ngba lati mọ Calico: yii

Ohun itanna Calico le ṣee lo ni iṣọpọ pẹlu Flannel (iṣẹ-ṣiṣe lila) tabi ni ominira, ni wiwa mejeeji Asopọmọra nẹtiwọki ati awọn agbara iṣakoso wiwa.

Awọn anfani wo ni lilo ojutu “apoti” K8s ati ṣeto API lati Calico pese?

Eyi ni ohun ti a kọ si NetworkPolicy:

  • Awọn oloselu ni opin nipasẹ ayika;
  • Awọn eto imulo ti wa ni lilo si awọn adarọ-ese ti samisi pẹlu awọn aami;
  • awọn ofin le ṣee lo si awọn pods, awọn agbegbe tabi awọn subnets;
  • awọn ofin le ni awọn ilana, ti a npè ni tabi awọn pato ibudo aami.

Eyi ni bii Calico ṣe faagun awọn iṣẹ wọnyi:

  • awọn eto imulo le ṣee lo si eyikeyi nkan: podu, eiyan, ẹrọ foju tabi wiwo;
  • Awọn ofin le ni igbese kan pato (idinamọ, igbanilaaye, gedu);
  • ibi-afẹde tabi orisun ti awọn ofin le jẹ ibudo, ibiti awọn ebute oko oju omi, awọn ilana, HTTP tabi awọn abuda ICMP, IP tabi subnet (iran 4th tabi 6th), eyikeyi awọn yiyan (awọn apa, awọn ogun, awọn agbegbe);
  • Ni afikun, o le ṣe ilana gbigbe ti ijabọ nipa lilo awọn eto DNAT ati awọn eto imulo gbigbe ijabọ.

Ni igba akọkọ ti ṣe lori GitHub ni Calico ibi ipamọ ọjọ pada si Keje 2016, ati ki o kan odun nigbamii ise agbese na si mu a asiwaju ipo ni jo Kubernetes nẹtiwọki Asopọmọra - yi ni eri, fun apẹẹrẹ, nipasẹ awọn esi iwadi, waiye nipasẹ The New Stack:

Calico fun Nẹtiwọọki ni Kubernetes: ifihan ati iriri diẹ

Ọpọlọpọ awọn solusan iṣakoso nla pẹlu awọn K8, gẹgẹbi Amazon EKS, Azure AKS, Google GKE ati awọn miran bẹrẹ lati so o fun lilo.

Bi fun iṣẹ, ohun gbogbo jẹ nla nibi. Ni idanwo ọja wọn, ẹgbẹ idagbasoke Calico ṣe afihan iṣẹ astronomical, nṣiṣẹ diẹ sii ju awọn apoti 50000 lori awọn apa ti ara 500 pẹlu iwọn ẹda ti awọn apoti 20 fun iṣẹju-aaya. Ko si awọn iṣoro ti a ṣe idanimọ pẹlu irẹjẹ. Iru esi won kede tẹlẹ ni fii ti akọkọ ti ikede. Awọn ijinlẹ olominira ti o dojukọ iṣelọpọ ati lilo awọn orisun tun jẹrisi iṣẹ ṣiṣe Calico ti fẹrẹ dara bi ti Flannel. Fun apẹẹrẹ:

Calico fun Nẹtiwọọki ni Kubernetes: ifihan ati iriri diẹ

Ise agbese na ni idagbasoke ni kiakia, o ṣe atilẹyin iṣẹ ni awọn iṣeduro olokiki ti iṣakoso K8s, OpenShift, OpenStack, o ṣee ṣe lati lo Calico nigbati o nlo iṣupọ kan nipa lilo kops, awọn itọkasi wa si ikole ti awọn nẹtiwọki Mesh Service (apẹẹrẹ ni eyi lo ni apapo pẹlu Istio).

Ṣiṣe pẹlu Calico

Ninu ọran gbogbogbo ti lilo fanila Kubernetes, fifi sori CNI wa si isalẹ lati lo faili naa calico.yaml, gbaa lati ayelujara lati awọn osise aaye ayelujara, nipa lilo kubectl apply -f.

Gẹgẹbi ofin, ẹya lọwọlọwọ ti ohun itanna jẹ ibamu pẹlu awọn ẹya 2-3 tuntun ti Kubernetes: iṣẹ ni awọn ẹya agbalagba ko ni idanwo ati pe ko ṣe iṣeduro. Gẹgẹbi awọn olupilẹṣẹ, Calico nṣiṣẹ lori awọn ekuro Linux loke 3.10 nṣiṣẹ CentOS 7, Ubuntu 16 tabi Debian 8, lori oke iptables tabi IPVS.

Ipinya laarin ayika

Fun oye gbogbogbo, jẹ ki a wo ọran ti o rọrun lati ni oye bii awọn eto imulo nẹtiwọọki ninu akiyesi Calico ṣe yatọ si awọn boṣewa ati bii ọna si ṣiṣẹda awọn ofin ṣe irọrun kika wọn ati irọrun iṣeto ni:

Calico fun Nẹtiwọọki ni Kubernetes: ifihan ati iriri diẹ

Awọn ohun elo wẹẹbu meji lo wa ninu iṣupọ: ni Node.js ati PHP, ọkan ninu eyiti o nlo Redis. Lati dènà iraye si Redis lati PHP, lakoko mimu asopọ pọ pẹlu Node.js, kan lo eto imulo atẹle yii:

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

Ni pataki a gba laaye ijabọ ti nwọle si ibudo Redis lati Node.js. Ati pe wọn ko ṣe idiwọ ohunkohun miiran. Ni kete ti NetworkPolicy ba han, gbogbo awọn yiyan ti a mẹnuba ninu rẹ bẹrẹ lati ya sọtọ, ayafi bibẹẹkọ pato. Sibẹsibẹ, awọn ofin ipinya ko kan awọn ohun miiran ti ko ni aabo nipasẹ yiyan.

Awọn apẹẹrẹ lo apiVersion Kubernetes jade kuro ninu apoti, ṣugbọn ko si ohun ti o ṣe idiwọ fun ọ lati lo orisun ti orukọ kanna lati ifijiṣẹ Calico. Sintasi ti o wa nibẹ ni alaye diẹ sii, nitorinaa iwọ yoo nilo lati tun ofin kọ fun ọran ti o wa loke ni fọọmu atẹle:

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

Awọn itumọ ti a mẹnuba loke fun gbigba tabi kọ gbogbo awọn ijabọ nipasẹ Nẹtiwọọki Ilana deede API ni awọn iṣelọpọ pẹlu awọn akọmọ ti o nira lati ni oye ati ranti. Ninu ọran ti Calico, lati yi ọgbọn ti ofin ogiriina pada si idakeji, yipada kan action: Allow on action: Deny.

Ipinya nipasẹ ayika

Bayi fojuinu ipo kan nibiti ohun elo n ṣe awọn metiriki iṣowo fun gbigba ni Prometheus ati itupalẹ siwaju nipa lilo Grafana. Irùsókè le ni data ifarabalẹ ninu, eyiti o tun jẹ wiwo ni gbangba nipasẹ aiyipada. Jẹ ki a tọju data yii lati awọn oju prying:

Calico fun Nẹtiwọọki ni Kubernetes: ifihan ati iriri diẹ

Prometheus, gẹgẹbi ofin, ni a gbe sinu agbegbe iṣẹ lọtọ - ninu apẹẹrẹ o yoo jẹ aaye orukọ bii eyi:

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

Aaye metadata.labels eyi yipada lati jẹ ijamba. Gẹgẹbi a ti sọ loke, namespaceSelector (si be e si podSelector) nṣiṣẹ pẹlu akole. Nitorinaa, lati gba awọn metiriki lati mu gbogbo awọn adarọ-ese lori ibudo kan pato, iwọ yoo ni lati ṣafikun iru aami kan (tabi mu lati awọn ti o wa tẹlẹ), lẹhinna lo iṣeto bi:

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

Ati pe ti o ba lo awọn ilana Calico, sintasi naa yoo dabi eyi:

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

Ni gbogbogbo, nipa fifi iru awọn eto imulo wọnyi kun fun awọn iwulo kan pato, o le daabobo lodi si irira tabi kikọlu lairotẹlẹ ninu iṣẹ awọn ohun elo ninu iṣupọ.

Iwa ti o dara julọ, ni ibamu si awọn olupilẹṣẹ ti Calico, ni “Dina ohun gbogbo ki o ṣii ni gbangba ohun ti o nilo” ọna, ti a ṣe akọsilẹ ni osise iwe aṣẹ (awọn miiran tẹle ọna kanna - ni pataki, ni tẹlẹ darukọ article).

Lilo Awọn Ohun elo Calico Afikun

Jẹ ki n leti pe nipasẹ eto ti o gbooro ti Calico API o le ṣe ilana wiwa awọn apa, kii ṣe opin si awọn adarọ-ese. Ni awọn wọnyi apẹẹrẹ lilo GlobalNetworkPolicy agbara lati kọja awọn ibeere ICMP ninu iṣupọ ti wa ni pipade (fun apẹẹrẹ, awọn pings lati podu si ipade kan, laarin awọn adarọ-ese, tabi lati oju ipade si adarọ-ese 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

Ninu ọran ti o wa loke, o tun ṣee ṣe fun awọn apa iṣupọ lati “de ọdọ” si ara wọn nipasẹ ICMP. Ati pe a yanju ọrọ yii nipasẹ ọna GlobalNetworkPolicy, ti a lo si nkan kan 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"]

Awọn ọran VPN

Nikẹhin, Emi yoo fun apẹẹrẹ gidi gidi ti lilo awọn iṣẹ Calico fun ọran ti ibaraenisepo-iṣupọ, nigbati ipilẹ awọn eto imulo ko to. Lati wọle si ohun elo wẹẹbu, awọn alabara lo oju eefin VPN kan, ati pe iraye si ni iṣakoso ni wiwọ ati ni opin si atokọ kan ti awọn iṣẹ ti a gba laaye fun lilo:

Calico fun Nẹtiwọọki ni Kubernetes: ifihan ati iriri diẹ

Awọn alabara sopọ si VPN nipasẹ boṣewa UDP ibudo 1194 ati, nigba ti a ba sopọ, gba awọn ipa-ọna si awọn akojọpọ iṣupọ ti awọn adarọ-ese ati awọn iṣẹ. Gbogbo awọn subnets ti wa ni titari ki o ma ṣe padanu awọn iṣẹ nigbati o tun bẹrẹ ati yi awọn adirẹsi pada.

Ibudo ti o wa ninu iṣeto jẹ boṣewa, eyiti o fa diẹ ninu awọn nuances lori ilana ti atunto ohun elo ati gbigbe si iṣupọ Kubernetes. Fun apẹẹrẹ, ni AWS LoadBalancer kanna fun UDP han gangan ni opin ọdun to kọja ni atokọ lopin ti awọn agbegbe, ati pe NodePort ko le ṣee lo nitori gbigbe siwaju lori gbogbo awọn apa iṣupọ ati pe ko ṣee ṣe lati ṣe iwọn nọmba awọn apẹẹrẹ olupin fun ẹbi ifarada ìdí. Pẹlupẹlu, iwọ yoo ni lati yi iwọn aiyipada ti awọn ebute oko oju omi pada…

Bi abajade wiwa nipasẹ awọn solusan ti o ṣeeṣe, atẹle ni a yan:

  1. Pods pẹlu VPN ti wa ni eto fun ipade ni hostNetwork, iyẹn, si IP gangan.
  2. Iṣẹ naa wa ni ita nipasẹ ClusterIP. A fi sori ẹrọ ibudo ti ara lori ipade, eyiti o wa lati ita pẹlu awọn ifiṣura kekere (iwaju ipo ti adiresi IP gidi kan).
  3. Ti npinnu ipade lori eyiti adarọ ese ti kọja opin ti itan wa. Emi yoo kan sọ pe o le ni wiwọ “àlàfo” iṣẹ naa si ipade kan tabi kọ iṣẹ ẹgbẹ kekere kan ti yoo ṣe abojuto adiresi IP lọwọlọwọ ti iṣẹ VPN ati ṣatunkọ awọn igbasilẹ DNS ti o forukọsilẹ pẹlu awọn alabara - ẹnikẹni ti o ni oju inu to.

Lati irisi ipa-ọna, a le ṣe idanimọ ni iyasọtọ ti alabara VPN nipasẹ adiresi IP ti o funni nipasẹ olupin VPN. Ni isalẹ ni apẹẹrẹ alakoko ti ihamọ iru iraye si alabara si awọn iṣẹ, ti a fihan lori Redis ti a mẹnuba loke:

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]

Nibi, sisopọ si ibudo 6379 ti ni idinamọ muna, ṣugbọn ni akoko kanna iṣẹ ti iṣẹ DNS ti wa ni fipamọ, iṣẹ ṣiṣe eyiti o jiya pupọ nigbagbogbo nigbati awọn ofin dide. Nitoripe, gẹgẹbi a ti sọ tẹlẹ, nigbati oluyan kan ba han, eto imulo sẹ aiyipada ni a lo si ayafi bibẹẹkọ pato.

Awọn esi

Nitorinaa, ni lilo API ti ilọsiwaju ti Calico, o le ṣe atunto ni irọrun ati yi iyipada ipa-ọna sinu ati ni ayika iṣupọ naa. Ni gbogbogbo, lilo rẹ le dabi awọn ologoṣẹ titu pẹlu Kanonu kan, ati imuse nẹtiwọọki L3 kan pẹlu BGP ati awọn tunnels IP-IP dabi ohun ibanilẹru ni fifi sori Kubernetes ti o rọrun lori nẹtiwọọki alapin… .

Iyasọtọ iṣupọ kan lati pade awọn ibeere aabo le ma ṣee ṣe nigbagbogbo, ati pe eyi ni ibiti Calico (tabi ojutu ti o jọra) wa si igbala. Awọn apẹẹrẹ ti a fun ni nkan yii (pẹlu awọn iyipada kekere) ni a lo ni ọpọlọpọ awọn fifi sori ẹrọ ti awọn alabara wa ni AWS.

PS

Ka tun lori bulọọgi wa:

orisun: www.habr.com

Fi ọrọìwòye kun