Мақсади мақола муаррифии хонанда бо асосҳои шабакавӣ ва идоракунии сиёсатҳои шабакавӣ дар Kubernetes, инчунин плагини Calico тарафи сеюм, ки қобилиятҳои стандартиро васеъ мекунад. Дар баробари ин, осонии конфигуратсия ва баъзе хусусиятҳо бо истифода аз мисолҳои воқеии таҷрибаи амалии мо нишон дода мешаванд.
Муқаддимаи зуд ба дастгоҳи шабакавии Kubernetes
Кластери Кубернетесро бе шабака тасаввур кардан мумкин нест. Мо аллакай дар бораи асосҳои онҳо мавод нашр кардем: «
Дар заминаи ин мақола, қайд кардан муҳим аст, ки худи K8s барои пайвастшавӣ ба шабака байни контейнерҳо ва гиреҳҳо масъул нест: барои ин, гуногун Плагинҳои CNI (Интерфейси шабакавии контейнерӣ). Бештар дар бораи ин консепсия мо
Масалан, маъмултарини ин плагинҳо мебошад
Ва "аз қуттӣ" барои ташкили идоракунии сиёсати шабака дар кластери Kubernetes пешбинӣ шудааст
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).
Воқеан, сиёсат аз рӯи самти ҳаракат ба ин 2 категория тақсим мешавад.
Хусусияти навбатии зарурӣ селектор аст; шахсе, ки коида ба вай дахл дорад. Ин метавонад як под (ё як гурӯҳи подкҳо) ё муҳит (яъне фазои ном) бошад. Тафсилоти муҳим: ҳарду намуди ин объектҳо бояд нишона дошта бошанд (нархнома дар истилоҳоти Кубернетес) - инҳоянд, ки сиёсатмадорон бо онҳо кор мекунанд.
Илова ба шумораи ниҳоии селекторҳо, ки бо ягон намуди тамға муттаҳид шудаанд, мумкин аст, ки қоидаҳоро ба мисли "Иҷозат додан/инкор кардан/ҳама" дар вариантҳои гуногун навиштан мумкин аст. Бо ин мақсад конструкцияҳои шакл истифода мешаванд:
podSelector: {}
ingress: []
policyTypes:
- Ingress
- дар ин мисол, ҳамаи подкҳо дар муҳити зист аз трафики воридотӣ баста шудаанд. Рафтори муқобилро бо сохти зерин ба даст овардан мумкин аст:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress
Ба ҳамин монанд барои содирот:
podSelector: {}
policyTypes:
- Egress
- барои хомӯш кардани он. Ва ин аст он чизе ки бояд дохил карда шавад:
podSelector: {}
egress:
- {}
policyTypes:
- Egress
Бозгашт ба интихоби плагини CNI барои кластер, бояд қайд кард, ки на ҳама плагинҳои шабакавӣ NetworkPolicy -ро дастгирӣ мекунанд. Масалан, Flannel дар боло зикршуда намедонад, ки чӣ тавр танзим кардани сиёсати шабакаро, ки
Шинос шудан ба Калико: назария
Васлкунаки Calico-ро метавон дар ҳамгироӣ бо Flannel истифода бурд (subproject
Истифодаи ҳалли "қуттӣ" K8s ва маҷмӯи API аз Calico кадом имкониятҳоро фароҳам меорад?
Ин аст он чизе ки дар NetworkPolicy сохта шудааст:
- сиёсатмадоронро муҳит маҳдуд мекунад;
- сиёсатҳо ба қуттиҳои бо тамғакоғазҳо ишорашуда татбиқ карда мешаванд;
- қоидаҳо метавонанд ба pods, муҳитҳо ё зершабақаҳо татбиқ карда шаванд;
- қоидаҳо метавонанд дорои протоколҳо, мушаххасоти портҳои номдор ё рамзӣ бошанд.
Ин аст, ки чӣ тавр Calico ин функсияҳоро васеъ мекунад:
- сиёсатҳоро ба ҳама гуна объект татбиқ кардан мумкин аст: pod, контейнер, мошини виртуалӣ ё интерфейс;
- қоидаҳо метавонанд амали мушаххасро дар бар гиранд (манъ, иҷозат, сабт);
- ҳадаф ё манбаи қоидаҳо метавонад порт, як қатор портҳо, протоколҳо, атрибутҳои HTTP ё ICMP, IP ё зершабакаи (насли 4 ё 6), ҳама гуна селекторҳо (гиреҳҳо, ҳостҳо, муҳитҳо);
- Илова бар ин, шумо метавонед бо истифода аз танзимоти DNAT ва сиёсати интиқоли трафик гузариши трафикро танзим кунед.
Аввалин ӯҳдадориҳо дар GitHub дар анбори Calico ба моҳи июли соли 2016 рост меояд ва пас аз як сол лоиҳа дар ташкили пайвасти шабакаи Kubernetes мавқеи пешсафро ишғол кард - ин, масалан, аз натиҷаҳои пурсиш шаҳодат медиҳад,
Бисёре аз қарорҳои калони идорашаванда бо K8s, ба монанди
Дар мавриди иҷроиш, дар ин ҷо ҳама чиз олӣ аст. Ҳангоми озмоиши маҳсулоти худ, гурӯҳи таҳиягари Calico нишондиҳандаҳои астрономӣ нишон дод, ки беш аз 50000 контейнерро дар 500 гиреҳи физикӣ бо суръати офариниши 20 контейнер дар як сония кор мекард. Ҳеҷ гуна мушкилот бо миқёс муайян карда нашуд. Чунин натичахо
Лоиҳа хеле зуд инкишоф меёбад, он корро дар ҳалли маъмули идорашавандаи K8s, OpenShift, OpenStack дастгирӣ мекунад, ҳангоми ҷойгиркунии кластер бо истифода аз Calico имконпазир аст.
Бо Calico машқ кунед
Дар сурати умумии истифодаи ванили Кубернетес, насб кардани CNI ба истифодаи файл рост меояд calico.yaml
, kubectl apply -f
.
Чун қоида, версияи ҷории плагин бо 2-3 версияи охирини Kubernetes мувофиқ аст: кор дар версияҳои кӯҳна санҷида нашудааст ва кафолат дода намешавад. Ба гуфтаи таҳиягарон, Calico дар ядроҳои Linux аз 3.10 бо CentOS 7, Ubuntu 16 ё Debian 8 дар болои iptables ё IPVS кор мекунад.
Изолятсия дар дохили муҳити зист
Барои фаҳмиши умумӣ, биёед як мисоли оддиро дида бароем, то бифаҳмем, ки чӣ гуна сиёсатҳои шабакавӣ дар қайди 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 аз қуттӣ берун аст, аммо ҳеҷ чиз ба шумо аз истифодаи он халал намерасонад
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 тавлид мекунад. Боргузорӣ метавонад дорои маълумоти ҳассос бошад, ки бо нобаёнӣ боз ба таври оммавӣ дидан мумкин аст. Биёед ин маълумотро аз чашмони бегона пинҳон кунем:
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-ро истифода мебаранд ва ин дастрасӣ ба таври қатъӣ назорат карда мешавад ва бо рӯйхати мушаххаси хидматҳое, ки барои истифода иҷозат дода шудаанд, маҳдуд аст:
Мизоҷон ба VPN тавассути бандари стандартии UDP 1194 пайваст мешаванд ва ҳангоми пайвастшавӣ ба зершабакаҳои кластерии подкастҳо ва хидматҳо масирҳо мегиранд. Тамоми зершабакаҳо тела дода мешаванд, то хидматҳоро ҳангоми бозоғозӣ ва тағир додани суроға аз даст надиҳанд.
Порт дар конфигуратсия стандартӣ аст, ки дар раванди конфигуратсияи барнома ва интиқоли он ба кластери Kubernetes баъзе нозукиҳо мегузорад. Масалан, дар ҳамон AWS LoadBalancer барои UDP аслан дар охири соли гузашта дар рӯйхати маҳдуди минтақаҳо пайдо шуд ва NodePort аз сабаби интиқоли он дар ҳама гиреҳҳои кластерӣ истифода намешавад ва миқёси миқёси мисолҳои сервер барои мақсадҳои таҳаммулпазирии хатогиҳо. Илова бар ин, шумо бояд диапазони пешфарзии портҳоро тағир диҳед...
Дар натиҷаи ҷустуҷӯи роҳҳои ҳалли имконпазир, инҳо интихоб карда шуданд:
- Подҳо бо VPN дар як гиреҳ ба нақша гирифта шудаанд
hostNetwork
, яъне ба IP-и воқеӣ. - Хизматрасонӣ берун аз тариқи ҷойгир карда мешавад
ClusterIP
. Дар гиреҳ порт ба таври ҷисмонӣ насб карда шудааст, ки аз берун бо қайдҳои хурд дастрас аст (мавҷудияти шартии суроғаи воқеии IP). - Муайян кардани гиреҳе, ки дар он поя бархостааст, аз доираи достони мо берун аст. Ман танҳо мегӯям, ки шумо метавонед хидматро ба гиреҳ пайваст кунед ё хидмати хурди паҳлӯӣ нависед, ки суроғаи ҷории 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
Инчунин дар блоги мо хонед:
- «
Муқаддима ба сиёсатҳои шабакаи Kubernetes барои мутахассисони амният »; - "Дастури тасвирӣ барои шабака дар Кубернетес":
қисмҳои 1 ва 2 (модели шабака, шабакаҳои фарогир) ,қисми 3 (хизматрасонӣ ва коркарди трафик) ; - «
Интерфейси шабакавии контейнерӣ (CNI) - интерфейси шабакавӣ ва стандартӣ барои контейнерҳои Linux ".
Манбаъ: will.com