Calico барои шабака дар Кубернетес: муқаддима ва таҷрибаи каме

Calico барои шабака дар Кубернетес: муқаддима ва таҷрибаи каме

Мақсади мақола муаррифии хонанда бо асосҳои шабакавӣ ва идоракунии сиёсатҳои шабакавӣ дар Kubernetes, инчунин плагини Calico тарафи сеюм, ки қобилиятҳои стандартиро васеъ мекунад. Дар баробари ин, осонии конфигуратсия ва баъзе хусусиятҳо бо истифода аз мисолҳои воқеии таҷрибаи амалии мо нишон дода мешаванд.

Муқаддимаи зуд ба дастгоҳи шабакавии Kubernetes

Кластери Кубернетесро бе шабака тасаввур кардан мумкин нест. Мо аллакай дар бораи асосҳои онҳо мавод нашр кардем: «Дастури тасвирӣ барои шабака дар Кубернетес"Ва"Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният".

Дар заминаи ин мақола, қайд кардан муҳим аст, ки худи K8s барои пайвастшавӣ ба шабака байни контейнерҳо ва гиреҳҳо масъул нест: барои ин, гуногун Плагинҳои CNI (Интерфейси шабакавии контейнерӣ). Бештар дар бораи ин консепсия мо ба ман хам гуфтанд.

Масалан, маъмултарини ин плагинҳо мебошад Flannel — пайвасти пурраи шабакаро байни ҳамаи гиреҳҳои кластер тавассути баланд бардоштани пулҳо дар ҳар як гиреҳ ва таъин кардани зершабакаи ба он таъмин мекунад. Аммо, дастрасии пурра ва танзимнашаванда на ҳамеша фоидаовар аст. Барои таъмини як навъ изолятсияи ҳадди ақал дар кластер, ба конфигуратсияи девори девор дахолат кардан лозим аст. Дар сурати умумӣ, он таҳти назорати ҳамон CNI ҷойгир карда мешавад, аз ин рӯ ҳама гуна дахолати тарафи сеюм ба iptables метавонад нодуруст шарҳ дода шавад ё тамоман нодида гирифта шавад.

Ва "аз қуттӣ" барои ташкили идоракунии сиёсати шабака дар кластери Kubernetes пешбинӣ шудааст API NetworkPolicy. Ин манбаъ, ки дар фазои номҳои интихобшуда паҳн шудааст, метавонад дорои қоидаҳо барои фарқ кардани дастрасӣ аз як барнома ба дигараш бошад. Он инчунин ба шумо имкон медиҳад, ки дастрасиро байни подкастҳои мушаххас, муҳитҳо (фазоҳои номҳо) ё блокҳои суроғаҳои 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

Ин мисоли ибтидоӣ нест ҳуҷҷатҳои расмӣ метавонад як маротиба ва барои ҳама хоҳиши фаҳмидани мантиқи чӣ гуна кор кардани сиёсати шабакаро боздорад. Бо вуҷуди ин, мо то ҳол кӯшиш хоҳем кард, ки принсипҳо ва усулҳои асосии коркарди ҷараёни трафикро бо истифода аз сиёсатҳои шабака фаҳмем...

Мантиқӣ аст, ки ду намуди трафик вуҷуд дорад: ворид шудан ба подк (Ingress) ва берун аз он (Egress).

Calico барои шабака дар Кубернетес: муқаддима ва таҷрибаи каме

Воқеан, сиёсат аз рӯи самти ҳаракат ба ин 2 категория тақсим мешавад.

Хусусияти навбатии зарурӣ селектор аст; шахсе, ки коида ба вай дахл дорад. Ин метавонад як под (ё як гурӯҳи подкҳо) ё муҳит (яъне фазои ном) бошад. Тафсилоти муҳим: ҳарду намуди ин объектҳо бояд нишона дошта бошанд (нархнома дар истилоҳоти Кубернетес) - инҳоянд, ки сиёсатмадорон бо онҳо кор мекунанд.

Илова ба шумораи ниҳоии селекторҳо, ки бо ягон намуди тамға муттаҳид шудаанд, мумкин аст, ки қоидаҳоро ба мисли "Иҷозат додан/инкор кардан/ҳама" дар вариантҳои гуногун навиштан мумкин аст. Бо ин мақсад конструкцияҳои шакл истифода мешаванд:

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

- дар ин мисол, ҳамаи подкҳо дар муҳити зист аз трафики воридотӣ баста шудаанд. Рафтори муқобилро бо сохти зерин ба даст овардан мумкин аст:

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

Ба ҳамин монанд барои содирот:

  podSelector: {}
  policyTypes:
  - Egress

- барои хомӯш кардани он. Ва ин аст он чизе ки бояд дохил карда шавад:

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

Бозгашт ба интихоби плагини CNI барои кластер, бояд қайд кард, ки на ҳама плагинҳои шабакавӣ NetworkPolicy -ро дастгирӣ мекунанд. Масалан, Flannel дар боло зикршуда намедонад, ки чӣ тавр танзим кардани сиёсати шабакаро, ки бевосита гуфта мешавад дар анбори расмӣ. Дар он ҷо як алтернатива низ зикр шудааст - лоиҳаи кушодаасос Калико, ки маҷмӯи стандартии API-ҳои Kubernetes-ро аз ҷиҳати сиёсатҳои шабака ба таври назаррас васеъ мекунад.

Calico барои шабака дар Кубернетес: муқаддима ва таҷрибаи каме

Шинос шудан ба Калико: назария

Васлкунаки Calico-ро метавон дар ҳамгироӣ бо Flannel истифода бурд (subproject канал) ё мустақилона, ҳам пайвасти шабака ва ҳам қобилияти идоракунии дастрасиро дар бар мегирад.

Истифодаи ҳалли "қуттӣ" K8s ва маҷмӯи API аз Calico кадом имкониятҳоро фароҳам меорад?

Ин аст он чизе ки дар NetworkPolicy сохта шудааст:

  • сиёсатмадоронро муҳит маҳдуд мекунад;
  • сиёсатҳо ба қуттиҳои бо тамғакоғазҳо ишорашуда татбиқ карда мешаванд;
  • қоидаҳо метавонанд ба pods, муҳитҳо ё зершабақаҳо татбиқ карда шаванд;
  • қоидаҳо метавонанд дорои протоколҳо, мушаххасоти портҳои номдор ё рамзӣ бошанд.

Ин аст, ки чӣ тавр Calico ин функсияҳоро васеъ мекунад:

  • сиёсатҳоро ба ҳама гуна объект татбиқ кардан мумкин аст: pod, контейнер, мошини виртуалӣ ё интерфейс;
  • қоидаҳо метавонанд амали мушаххасро дар бар гиранд (манъ, иҷозат, сабт);
  • ҳадаф ё манбаи қоидаҳо метавонад порт, як қатор портҳо, протоколҳо, атрибутҳои HTTP ё ICMP, IP ё зершабакаи (насли 4 ё 6), ҳама гуна селекторҳо (гиреҳҳо, ҳостҳо, муҳитҳо);
  • Илова бар ин, шумо метавонед бо истифода аз танзимоти DNAT ва сиёсати интиқоли трафик гузариши трафикро танзим кунед.

Аввалин ӯҳдадориҳо дар GitHub дар анбори Calico ба моҳи июли соли 2016 рост меояд ва пас аз як сол лоиҳа дар ташкили пайвасти шабакаи Kubernetes мавқеи пешсафро ишғол кард - ин, масалан, аз натиҷаҳои пурсиш шаҳодат медиҳад, Аз ҷониби The New Stack гузаронида мешавад:

Calico барои шабака дар Кубернетес: муқаддима ва таҷрибаи каме

Бисёре аз қарорҳои калони идорашаванда бо K8s, ба монанди Amazon EKS, Azure AKS, Google GKE ва дигарон барои истифода тавсия кардан гирифтанд.

Дар мавриди иҷроиш, дар ин ҷо ҳама чиз олӣ аст. Ҳангоми озмоиши маҳсулоти худ, гурӯҳи таҳиягари Calico нишондиҳандаҳои астрономӣ нишон дод, ки беш аз 50000 контейнерро дар 500 гиреҳи физикӣ бо суръати офариниши 20 контейнер дар як сония кор мекард. Ҳеҷ гуна мушкилот бо миқёс муайян карда нашуд. Чунин натичахо эълон карда шуданд аллакай дар эълони версияи якум. Тадқиқотҳои мустақил, ки ба интиқол ва истеъмоли захираҳо тамаркуз мекунанд, инчунин тасдиқ мекунанд, ки иҷрои Calico тақрибан ба мисли Flannel хуб аст. Барои мисол:

Calico барои шабака дар Кубернетес: муқаддима ва таҷрибаи каме

Лоиҳа хеле зуд инкишоф меёбад, он корро дар ҳалли маъмули идорашавандаи K8s, OpenShift, OpenStack дастгирӣ мекунад, ҳангоми ҷойгиркунии кластер бо истифода аз Calico имконпазир аст. коп, истинод ба сохтмони шабакаҳои Service Mesh вуҷуд дорад (инак як мисол дар якҷоягӣ бо Истио истифода мешавад).

Бо Calico машқ кунед

Дар сурати умумии истифодаи ванили Кубернетес, насб кардани CNI ба истифодаи файл рост меояд calico.yaml, аз вебсайти расмӣ зеркашӣ карда шудааст, бо истифода аз kubectl apply -f.

Чун қоида, версияи ҷории плагин бо 2-3 версияи охирини Kubernetes мувофиқ аст: кор дар версияҳои кӯҳна санҷида нашудааст ва кафолат дода намешавад. Ба гуфтаи таҳиягарон, Calico дар ядроҳои Linux аз 3.10 бо CentOS 7, Ubuntu 16 ё Debian 8 дар болои iptables ё IPVS кор мекунад.

Изолятсия дар дохили муҳити зист

Барои фаҳмиши умумӣ, биёед як мисоли оддиро дида бароем, то бифаҳмем, ки чӣ гуна сиёсатҳои шабакавӣ дар қайди Calico аз стандартҳои стандартӣ фарқ мекунанд ва чӣ гуна равиш ба эҷоди қоидаҳо хониш ва чандирии конфигуратсияи онҳоро содда мекунад:

Calico барои шабака дар Кубернетес: муқаддима ва таҷрибаи каме

Дар кластер 2 веб-барнома ҷойгир карда шудааст: дар Node.js ва PHP, ки яке аз онҳо Redis-ро истифода мебарад. Барои бастани дастрасӣ ба Redis аз PHP, ҳангоми нигоҳ доштани пайвастшавӣ бо Node.js, танҳо сиёсати зеринро татбиқ кунед:

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

Аслан мо ба трафики воридотӣ ба бандари Redis аз Node.js иҷозат додем. Ва онҳо ба таври возеҳ чизи дигареро манъ накардаанд. Ҳамин ки NetworkPolicy пайдо мешавад, ҳамаи селекторҳои дар он зикршуда ҷудо карда мешаванд, агар тартиби дигаре пешбинӣ нашуда бошад. Аммо, қоидаҳои ҷудокунӣ ба объектҳои дигаре, ки аз ҷониби селектор фаро гирифта нашудаанд, татбиқ намегардад.

Мисол истифода мебарад apiVersion Kubernetes аз қуттӣ берун аст, аммо ҳеҷ чиз ба шумо аз истифодаи он халал намерасонад манбаи ҳамон ном аз таҳвили Calico. Синтаксиси он ҷо муфассалтар аст, бинобар ин ба шумо лозим меояд, ки қоидаи ҳолати дар боло зикршударо дар шакли зерин аз нав нависед:

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

Конструксияҳои дар боло зикршуда барои иҷозат додан ё рад кардани ҳама трафик тавассути API-и муқаррарии NetworkPolicy дорои конструксияҳое мебошанд, ки дарк кардан ва дар хотир доштан душвор аст. Дар мавриди Calico, барои тағир додани мантиқи қоидаи девор ба муқобил, танҳо тағир диҳед action: Allow ба action: Deny.

Изолятсия аз рӯи муҳити зист

Акнун вазъиятеро тасаввур кунед, ки барнома барои ҷамъоварӣ дар Prometheus ченакҳои тиҷорӣ ва таҳлили минбаъда бо истифода аз Grafana тавлид мекунад. Боргузорӣ метавонад дорои маълумоти ҳассос бошад, ки бо нобаёнӣ боз ба таври оммавӣ дидан мумкин аст. Биёед ин маълумотро аз чашмони бегона пинҳон кунем:

Calico барои шабака дар Кубернетес: муқаддима ва таҷрибаи каме

Prometheus, чун қоида, дар муҳити хидматрасонии алоҳида ҷойгир карда мешавад - дар мисол он фазои номӣ хоҳад буд:

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

соҳа metadata.labels ин тасодуфй набуд. Тавре дар боло зикр гардид, namespaceSelector (инчунин podSelector) бо тамгахо амал мекунад. Аз ин рӯ, барои гирифтани иҷозат додани ченакҳо аз ҳама подкҳо дар бандари мушаххас, шумо бояд як навъ нишона илова кунед (ё аз нишонҳои мавҷуда) ва сипас конфигуратсияеро ба мисли:

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

Ва агар шумо сиёсатҳои Calico -ро истифода баред, синтаксис чунин хоҳад буд:

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

Умуман, бо илова кардани ин гуна сиёсатҳо барои эҳтиёҷоти мушаххас, шумо метавонед аз дахолати бадқасдона ё тасодуфӣ дар кори замимаҳо дар кластер муҳофизат кунед.

Таҷрибаи беҳтарин, ба гуфтаи созандагони Calico, равиши "Ҳама чизро маҳкам кунед ва он чизеро, ки ба шумо лозим аст, кушоед" мебошад, ки дар ҳуҷҷатгузорӣ шудааст. ҳуҷҷатҳои расмӣ (дигарон бо чунин равиш пайравӣ мекунанд - аз ҷумла, дар мақолаи аллакай зикршуда).

Истифодаи объектҳои иловагии Calico

Ёдовар мешавам, ки тавассути маҷмӯи васеъи API-ҳои Calico шумо метавонед мавҷудияти гиреҳҳоро танзим кунед, на танҳо бо pods. Дар мисоли зерин бо истифода аз GlobalNetworkPolicy қобилияти интиқоли дархостҳои ICMP дар кластер баста аст (масалан, пингҳо аз як гиреҳ ба гиреҳ, байни подкҳо ё аз гиреҳ ба IP pod):

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

Дар ҳолати боло, ҳоло ҳам имкон дорад, ки гиреҳҳои кластер тавассути ICMP ба ҳамдигар "дастрас шаванд". Ва ин масъала ба воситаи воситахо хал карда мешавад GlobalNetworkPolicy, ба субъект муроҷиат кардааст 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"]

Парвандаи VPN

Дар ниҳоят, ман як мисоли воқеии истифодаи функсияҳои Calico-ро барои ҳамкории наздики кластер медиҳам, вақте ки маҷмӯи стандартии сиёсатҳо кофӣ нест. Мизоҷон барои дастрасӣ ба веб-барнома нақби VPN-ро истифода мебаранд ва ин дастрасӣ ба таври қатъӣ назорат карда мешавад ва бо рӯйхати мушаххаси хидматҳое, ки барои истифода иҷозат дода шудаанд, маҳдуд аст:

Calico барои шабака дар Кубернетес: муқаддима ва таҷрибаи каме

Мизоҷон ба VPN тавассути бандари стандартии UDP 1194 пайваст мешаванд ва ҳангоми пайвастшавӣ ба зершабакаҳои кластерии подкастҳо ва хидматҳо масирҳо мегиранд. Тамоми зершабакаҳо тела дода мешаванд, то хидматҳоро ҳангоми бозоғозӣ ва тағир додани суроға аз даст надиҳанд.

Порт дар конфигуратсия стандартӣ аст, ки дар раванди конфигуратсияи барнома ва интиқоли он ба кластери Kubernetes баъзе нозукиҳо мегузорад. Масалан, дар ҳамон AWS LoadBalancer барои UDP аслан дар охири соли гузашта дар рӯйхати маҳдуди минтақаҳо пайдо шуд ва NodePort аз сабаби интиқоли он дар ҳама гиреҳҳои кластерӣ истифода намешавад ва миқёси миқёси мисолҳои сервер барои мақсадҳои таҳаммулпазирии хатогиҳо. Илова бар ин, шумо бояд диапазони пешфарзии портҳоро тағир диҳед...

Дар натиҷаи ҷустуҷӯи роҳҳои ҳалли имконпазир, инҳо интихоб карда шуданд:

  1. Подҳо бо VPN дар як гиреҳ ба нақша гирифта шудаанд hostNetwork, яъне ба IP-и воқеӣ.
  2. Хизматрасонӣ берун аз тариқи ҷойгир карда мешавад ClusterIP. Дар гиреҳ порт ба таври ҷисмонӣ насб карда шудааст, ки аз берун бо қайдҳои хурд дастрас аст (мавҷудияти шартии суроғаи воқеии IP).
  3. Муайян кардани гиреҳе, ки дар он поя бархостааст, аз доираи достони мо берун аст. Ман танҳо мегӯям, ки шумо метавонед хидматро ба гиреҳ пайваст кунед ё хидмати хурди паҳлӯӣ нависед, ки суроғаи ҷории IP-и хидмати VPN-ро назорат мекунад ва сабтҳои DNS-ро, ки дар муштариён сабти ном шудаанд, таҳрир мекунад - ҳар касе, ки тасаввуроти кофӣ дорад.

Аз нуқтаи назари масир, мо метавонем муштарии VPN-ро аз рӯи суроғаи IP-и он, ки сервери VPN додааст, ба таври беназир муайян кунем. Дар зер намунаи ибтидоии маҳдуд кардани дастрасии муштарӣ ба хидматҳо оварда шудааст, ки дар Redis-и дар боло зикршуда тасвир шудааст:

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]

Дар ин ҷо пайвастшавӣ ба порти 6379 қатъиян манъ аст, аммо дар айни замон кори хидмати DNS нигоҳ дошта мешавад, ки фаъолияти он ҳангоми таҳияи қоидаҳо аксар вақт осеб мерасонад. Зеро, тавре ки қаблан зикр гардид, вақте ки селектор пайдо мешавад, сиёсати радкунии пешфарз ба он татбиқ мешавад, агар тартиби дигаре пешбинӣ нашуда бошад.

Натиҷаҳо

Ҳамин тариқ, бо истифода аз API пешрафтаи Calico, шумо метавонед масирро дар дохили кластер ва атрофи он чандир танзим ва динамикӣ тағир диҳед. Умуман, истифодаи он метавонад ба тирпарронии гунҷишкҳо бо туп монанд бошад ва татбиқи шабакаи L3 бо нақбҳои BGP ва IP-IP дар насби оддии Kubernetes дар шабакаи ҳамвор даҳшатовар ба назар мерасад... Аммо, дар акси ҳол, асбоб хеле қобили ҳаёт ва муфид ба назар мерасад. .

Ҷудо кардани кластер барои қонеъ кардани талаботи амният на ҳамеша имконпазир аст ва дар ин ҷо Calico (ё ҳалли шабеҳ) ба наҷот меояд. Намунаҳои дар ин мақола овардашуда (бо тағйироти хурд) дар якчанд насби мизоҷони мо дар AWS истифода мешаванд.

PS

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ