د مقالې هدف دا دی چې لوستونکي ته په کوبرنیټس کې د شبکې تګلارې او مدیریت کولو اساساتو ته معرفي کړي ، په بیله بیا د دریمې ډلې کالیکو پلگ ان چې معیاري وړتیاوې غزوي. د لارې په اوږدو کې، د ترتیب کولو اسانتیا او ځینې ځانګړتیاوې به زموږ د عملیاتي تجربې څخه د اصلي مثالونو په کارولو سره وښودل شي.
د Kubernetes شبکې وسیلې ته ګړندۍ پیژندنه
د Kubernetes کلستر د شبکې پرته تصور نشي کیدی. موږ دمخه د دوی د اساساتو په اړه مواد خپاره کړي دي: "
د دې مقالې په شرایطو کې، دا مهمه ده چې یادونه وکړو چې K8s پخپله د کانټینرونو او نوډونو ترمنځ د شبکې ارتباط مسولیت نلري: د دې لپاره، مختلف د CNI پلگ ان (د کانټینر شبکې انٹرفیس). د دې مفهوم په اړه نور موږ
د مثال په توګه، د دې پلگ ان تر ټولو عام دی
او د کوبرنیټس کلستر کې د شبکې پالیسۍ مدیریت تنظیم کولو لپاره "د بکس څخه بهر" چمتو شوی
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
دا تر ټولو لومړنۍ بېلګه نه ده
دا منطقي ده چې دوه ډوله ترافیک شتون لري: پوډ ته ننوتل (انګریس) او له هغې څخه وتل (ایګریس).
په حقیقت کې، سیاست د حرکت د سمت پر بنسټ په دې دوو کټګوریو ویشل شوی دی.
راتلونکی اړین ځانګړتیا یو انتخاب کونکی دی؛ هغه څوک چې قانون پلي کیږي. دا کیدای شي یو پوډ (یا د پوډونو ډله) یا چاپیریال (د بیلګې په توګه د نوم ځای). یو مهم تفصیل: د دې شیانو دواړه ډولونه باید یو لیبل ولري (د لیبل د Kubernetes په اصطلاح کې) - دا هغه څه دي چې سیاستوال ورسره کار کوي.
د یو محدود شمیر انتخاب کونکو سربیره ، د یو ډول لیبل لخوا متحد شوي ، دا ممکنه ده چې قواعد ولیکئ لکه "هر څه ته اجازه ورکړئ / هرچا ته اجازه ورکړئ" په مختلف توپیرونو کې. د دې هدف لپاره، د فارم جوړښت کارول کیږي:
podSelector: {}
ingress: []
policyTypes:
- Ingress
- په دې مثال کې، په چاپیریال کې ټول پوډونه د راتلونکی ټرافیک څخه بند شوي دي. برعکس چلند د لاندې جوړښت سره ترلاسه کیدی شي:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress
په ورته ډول د وتلو لپاره:
podSelector: {}
policyTypes:
- Egress
- د بندولو لپاره. او دلته هغه څه دي چې پکې شامل دي:
podSelector: {}
egress:
- {}
policyTypes:
- Egress
د کلستر لپاره د CNI پلگ ان انتخاب ته راستنیدل، دا د یادولو وړ ده د شبکې هر پلگ ان د شبکې پالیسي ملاتړ نه کوي. د مثال په توګه، مخکې ذکر شوي فلانیل نه پوهیږي چې څنګه د شبکې پالیسۍ تنظیم کړي، کوم چې
د کالیکو پیژندل: تیوري
د کالیکو پلگ ان د فلانیل سره په ادغام کې کارول کیدی شي (فرعي پروژه
د K8s "بکس شوي" حل او د کالیکو څخه ټاکل شوي API کارول کوم فرصتونه چمتو کوي؟
دلته هغه څه دي چې د شبکې پالیسي کې جوړ شوي دي:
- سیاستوال د چاپیریال لخوا محدود دي؛
- پالیسي په لیبلونو نښه شوي پوډونو باندې پلي کیږي؛
- قواعد په پوډونو، چاپیریالونو یا فرعي سایټونو کې پلي کیدی شي؛
- قواعد کولی شي پروتوکولونه ولري، نومول شوي یا سمبولیک بندر مشخصات.
دلته دا دی چې کیلیکو دا دندې څنګه پراخوي:
- پالیسۍ په هر شی کې پلي کیدی شي: پوډ، کانټینر، مجازی ماشین یا انٹرفیس؛
- قواعد کولی شي یو ځانګړی عمل ولري (ممنوعیت، اجازه، ننوتل)؛
- د مقرراتو هدف یا سرچینه کیدای شي یو بندر وي، د بندرونو لړۍ، پروتوکولونه، HTTP یا ICMP ځانګړتیاوې، IP یا subnet (4th یا 6th نسل)، هر انتخاب کونکي (نوډونه، کوربه، چاپیریال)؛
- برسیره پردې، تاسو کولی شئ د DNAT ترتیباتو او د ټرافیک لیږلو پالیسیو په کارولو سره د ټرافیک تیریدل تنظیم کړئ.
د کالیکو په ذخیره کې د GitHub په اړه لومړی ژمنې د جولای 2016 ته نیټې پورې اړه لري، او یو کال وروسته پروژې د کوبرنیټس شبکې ارتباط تنظیم کولو کې مخکښ دریځ ترلاسه کړ - دا د بیلګې په توګه، د سروې پایلو لخوا ثابت شوی،
د K8s سره ډیری لوی مدیریت شوي حلونه، لکه
د فعالیت لپاره، دلته هرڅه عالي دي. د دوی د محصول په ازمایښت کې، د کالیکو پراختیایی ټیم د ستورپوهنې فعالیت وښوده، په 50000 کانټینرونو کې په 500 فزیکي نوډونو کې په هر ثانیه کې د 20 کانټینرونو د جوړولو کچه سره چلول. په اندازه کولو کې کومه ستونزه نده پیژندل شوې. داسې پایلې
پروژه خورا ګړندۍ وده کوي ، دا د K8s ، OpenShift ، OpenStack اداره شوي مشهور حلونو کې د کار ملاتړ کوي ، دا ممکنه ده چې د کلستر په کارولو سره د کلستر ځای په ځای کولو کې د کالیکو وکاروئ
د کالیکو سره تمرین وکړئ
د وینیلا کوبرنیټس کارولو عمومي قضیه کې، د CNI نصب کول د فایل کارولو لپاره راځي calico.yaml
, kubectl apply -f
.
د یوې قاعدې په توګه، د پلگ ان اوسنی نسخه د Kubernetes وروستي 2-3 نسخو سره مطابقت لري: په زړو نسخو کې عملیات ندي ازمول شوي او تضمین ندي. د پراختیا کونکو په وینا ، کیلیکو د 3.10 څخه پورته د لینکس کرنلونو چلوي CentOS 7 ، اوبنټو 16 یا Debian 8 ، د iptables یا IPVS په سر کې.
په چاپیریال کې جلا کول
د عمومي پوهاوي لپاره، راځئ چې یو ساده قضیه وګورو ترڅو پوه شي چې څنګه د کالیکو نوټیشن کې د شبکې پالیسۍ له معیاري څخه توپیر لري او څنګه د قواعدو رامینځته کولو طریقه د دوی د لوستلو وړتیا او ترتیب کولو انعطاف آسانوي:
په کلستر کې 2 ویب غوښتنلیکونه ځای پر ځای شوي دي: په Node.js او PHP کې، چې یو یې د Redis کاروي. د PHP څخه Redis ته د لاسرسي بندولو لپاره، پداسې حال کې چې د 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
په لازمي ډول موږ له Node.js څخه د ریډیس بندر ته راتلونکي ترافیک ته اجازه ورکړه. او دوی په ښکاره ډول بل څه منع نه کړل. هرڅومره ژر چې د شبکې پالیسي څرګندیږي ، ټول انتخاب کونکي په دې کې ذکر شوي جلا کول پیل کوي ، پرته لدې چې بل ډول مشخص شي. په هرصورت، د جلا کولو قواعد په نورو شیانو باندې نه پلي کیږي چې د انتخاب کونکي لخوا پوښل شوي ندي.
مثال یې کاروي 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
د منظم NetworkPolicy API له لارې د ټولو ټرافیک اجازه ورکولو یا ردولو لپاره پورته ذکر شوي جوړښتونه د قوسونو سره جوړونه لري چې پوهیدل او یادول یې ستونزمن دي. د کالیکو په قضیه کې ، د فایر وال قاعدې منطق برعکس بدلولو لپاره ، یوازې بدل کړئ action: Allow
په action: Deny
.
د چاپیریال لخوا جلا کول
اوس د داسې وضعیت تصور وکړئ چیرې چې یو غوښتنلیک په پرومیټیوس کې د راټولولو لپاره د سوداګرۍ میټریکونه رامینځته کوي او د ګرافانا په کارولو سره نور تحلیلونه. اپلوډ ممکن حساس معلومات ولري، کوم چې بیا د ډیفالټ لخوا په عامه توګه لیدل کیږي. راځئ چې دا معلومات له سترګو پټ کړو:
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
او که تاسو د کالیکو تګلارې کاروئ، ترکیب به داسې وي:
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
په عموم کې، د ځانګړو اړتیاو لپاره د دې ډول پالیسیو په اضافه کولو سره، تاسو کولی شئ په کلستر کې د غوښتنلیکونو په عملیاتو کې د ناوړه یا ناڅاپي مداخلې په وړاندې ساتنه وکړئ.
د کالیکو د جوړونکو په وینا ترټولو غوره عمل د "هر څه بند کړئ او په ښکاره ډول هغه څه چې تاسو ورته اړتیا لرئ خلاص کړئ" طریقه ده چې مستند شوي
د اضافي کالیکو شیانو کارول
اجازه راکړئ تاسو ته یادونه وکړم چې د کالیکو APIs پراخه سیټ له لارې تاسو کولی شئ د نوډونو شتون تنظیم کړئ ، نه په پوډونو پورې محدود. په لاندې مثال کې کارول GlobalNetworkPolicy
په کلستر کې د ICMP غوښتنو د انتقال وړتیا تړل شوې ده (د مثال په توګه، د پوډ څخه نوډ ته پینګ کول، د پوډونو ترمنځ، یا د نوډ څخه 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
په پورتني حالت کې، دا لاهم د کلستر نوډونو لپاره ممکنه ده چې د 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 قضیه
په نهایت کې ، زه به د نږدې کلستر تعامل قضیې لپاره د کالیکو افعال کارولو خورا ریښتیني مثال ورکړم ، کله چې د پالیسیو معیاري سیټ کافي نه وي. ویب غوښتنلیک ته د لاسرسي لپاره، پیرودونکي د VPN تونل کاروي، او دا لاسرسی په کلکه کنټرول شوی او د کارولو لپاره اجازه ورکړل شوي خدماتو ځانګړي لیست پورې محدود دی:
پیرودونکي د معیاري UDP پورټ 1194 له لارې VPN سره وصل کیږي او کله چې وصل شي ، د پوډونو او خدماتو کلستر فرعي نیټونو ته لارې ترلاسه کوي. ټول فرعي نیټونه فشار راوړل شوي ترڅو د ادرسونو د بیا پیلولو او بدلولو پرمهال خدمات له لاسه ورنکړي.
په ترتیب کې بندر معیاري دی، کوم چې د غوښتنلیک ترتیبولو او د کوبرنیټس کلستر ته لیږدولو پروسې کې ځینې لنډیزونه وضع کوي. د مثال په توګه، د UDP لپاره په ورته AWS LoadBalancer کې د تیر کال په پای کې په لفظي توګه د سیمو محدود لیست کې څرګند شو، او نوډ پورټ نشي کارول کیدی ځکه چې په ټولو کلستر نوډونو کې د هغې د لیږلو له امله او د سرور مثالونو شمیر اندازه کول ناممکن دي. د خطا زغم اهداف برسیره پردې، تاسو باید د بندرونو ډیفالټ حد بدل کړئ ...
د ممکنه حلونو د لټون په پایله کې، لاندې غوره شوي:
- د VPN سره پوډونه په هر نوډ کې ټاکل شوي
hostNetwork
، دا دی، اصلي IP ته. - خدمت له لارې بهر ځړول کیږي
ClusterIP
. یو بندر په فزیکي توګه په نوډ کې نصب شوی، کوم چې د وړو ریزرویشنونو سره د بهر څخه د لاسرسي وړ دی (د اصلي IP پتې مشروط شتون). - د نوډ ټاکل چې په کوم کې د پوډ ګلاب زموږ د کیسې له ساحې بهر دی. زه به یوازې ووایم چې تاسو کولی شئ یو نوډ ته خدمت په کلکه "نیل" کړئ یا یو کوچني سایډ کار خدمت ولیکئ چې د VPN خدمت اوسنی IP پته به وڅاري او د پیرودونکو سره ثبت شوي DNS ریکارډونه ایډیټ کړي - څوک چې کافي تصور لري.
د روټینګ لید څخه ، موږ کولی شو د VPN پیرودونکي په ځانګړي ډول د VPN سرور لخوا صادر شوي IP پتې لخوا وپیژنو. لاندې خدماتو ته د ورته پیرودونکي لاسرسي محدودولو لومړنۍ بیلګه ده ، په پورته ذکر شوي ریډیس کې ښودل شوي:
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 په کارولو سره، تاسو کولی شئ په انعطاف وړ توګه تنظیم او په متحرک ډول د کلستر دننه او شاوخوا روټینګ بدل کړئ. په عموم کې، د دې کارول کیدای شي د توپ سره د مرغیو د ډزو په څیر ښکاري، او د BGP او IP-IP تونلونو سره د L3 شبکې پلي کول په فلیټ شبکه کې د ساده Kubernetes نصبولو کې ډارونکي ښکاري ... په هرصورت، که نه نو دا وسیله خورا ګټور او ګټور ښکاري. .
د امنیت اړتیاو پوره کولو لپاره د کلستر جلا کول ممکن تل ممکن نه وي، او دا هغه ځای دی چې کیلیکو (یا ورته حل) د ژغورنې لپاره راځي. په دې مقاله کې ورکړل شوي مثالونه (د لږو تعدیلاتو سره) په AWS کې زموږ د پیرودونکو په څو تاسیساتو کې کارول کیږي.
PS
زموږ په بلاګ کې هم ولولئ:
- «
د امنیتي مسلکیانو لپاره د کوبرنیټس شبکې پالیسیو پیژندنه » - "کوبرنیټس کې د شبکې جوړولو لپاره یو انځور شوی لارښود":
1 او 2 برخې (د شبکې ماډل، پوښښ شبکې) ,دریمه برخه (خدمات او ترافیک پروسس کول) ; - «
د کانټینر شبکې انٹرفیس (CNI) - د لینکس کانټینرونو لپاره د شبکې انٹرفیس او معیاري ".
سرچینه: www.habr.com