ბიბლიოთეკა
00/07 · ~38 წთ
GUIDEDECK · PART 2 · ინჟინრებისთვის, ვისაც კლასტერი უკვე აქვს

გაღრმავებული
Kubernetes & მექანიკა,
რომელიც ქვეშ დევს.

38-წუთიანი ღრმა ჩაძირვა, რომელიც იქიდან იწყებს, სადაც შესავალი დეკი დასრულდა. Pod-ები, Deployment-ები და Service-ები უკვე ნაცნობად მიგვაჩნია და ერთი შრით ქვემოთ ჩავდივართ: control plane, ოპერატორები და CRD-ები, ქსელის შიდა მექანიკა, უსაფრთხოება, სერვის-მეში და ფლოტების მართვა GitOps-ით.

~38 წთსაშუალო → მოწინავეეყრდნობა ნაწილ 1-ს
გადაახვიეთ
01 · control plane, ღრმად 6 წთ

ჯადოქრობის უკან ერთი
დაუღალავი შეთანხმების ციკლია.

ნაწილ 1-ში გავეცანით იდეას, რომ თქვენ სასურველ მდგომარეობას აღწერთ, კლასტერი კი მას რეალობად აქცევს (მოკლე გამეორება შესავალ დეკშია). ახლა ყუთს გავხსნით. ყოველი „Kubernetes-მა რაღაც გააკეთა“ სინამდვილეში ესაა: რომელიღაც კონტროლერი უყურებს API server-ს, ადარებს სასურველს დაფიქსირებულს და რეალობას ერთი ნაბიჯით უახლოვებს. ცენტრალური ტვინი ბრძანებებს არ გასცემს — ათეულობით პატარა ციკლი თითო ნაჭერს ფლობს.

Control plane — კომპონენტების ნაკრები, რომელიც კლასტერზე გლობალურ გადაწყვეტილებებს იღებს: API server (ერთადერთი მთავარი კარი), etcd (მონაცემთა საცავი), scheduler (pod-ებს ნოუდებზე ანაწილებს) და controller manager (შეთანხმების ციკლების კრებული). სამუშაო ნოუდები kubelet-სა და თქვენს pod-ებს უშვებენ; ისინი მხოლოდ API server-თან საუბრობენ.

etcd-ს მხოლოდ API server კითხულობს და წერს. ყველა სხვა კომპონენტი კლიენტია, რომელიც აკვირდება და მოქმედებს.

ვინ რას აკეთებს

  • API server — მდგომარეობის გარეშე REST-ფრონტი. ის ავთენტიფიკაციას და ავტორიზაციას ატარებს, უშვებს admission-ს, ამოწმებს და ინახავს. ჰორიზონტალურად მასშტაბირებადია, რადგან მდგომარეობა etcd-ში ცხოვრობს და არა მასში.
  • etcd — განაწილებული გასაღები/მნიშვნელობის საცავი, რომელიც Raft კონსენსუსის ალგორითმს იყენებს მკაცრად თანმიმდევრული, რეპლიცირებული ლოგისთვის. ეს ის ერთადერთი ნაწილია, რომლის სარეზერვო ასლიც აუცილებლად უნდა გქონდეთ.
  • Scheduler — ეძებს pod-ებს, რომლებსაც ნოუდი არ აქვთ, ქულებს არიცხავს შესაფერის ნოუდებს და თავის არჩევანს უკან ჩაწერს. ის მხოლოდ წყვეტს; გაშვებას kubelet აკეთებს.
  • კონტროლერები — თითოეული ერთ ობიექტის ტიპს აკვირდება და მას spec-ისკენ მიაქანებს. Deployment, ReplicaSet, Job, Node — ყველა უბრალოდ ციკლია.
შეთანხმების ციკლი — ცვლილებაზე დაკვირვება, სასურველი spec-ის შედარება დაფიქსირებულ status-თან, ერთი ქმედება, გამეორება. კონტროლერები level-triggered-ია და არა edge-triggered: ისინი მიმდინარე მდგომარეობაზე მოქმედებენ და არა იმ მოვლენაზე, რომელმაც ისინი გააღვიძა. მოვლენა თუ გამოგრჩათ, შემდეგი სინქრონიზაცია მაინც გაასწორებს — სწორედ ამიტომაა Kubernetes დაკარგული შეტყობინებებისა და გადატვირთვების მიმართ ასე მდგრადი.
// every controller is this shape
while (true) {
  const obj     = await informer.next();    // woken by a watch event
  const desired = obj.spec;                // what you asked for
  const actual  = await observe(obj);      // what the world looks like
  if (!isEqual(desired, actual)) {
    await act(obj);                        // ONE step toward desired
    return;                                // requeue — re-check next loop
  }
}

informer watch-ნაკადს ქეშირებულ სამუშაო რიგად აქცევს; შეთანხმების ფუნქცია თითო ელემენტზე ერთხელ ეშვება და თავს ისევ რიგში აბრუნებს.

Admission control — ჭიშკარი „ავტორიზებულსა“ და „შენახულს“ შორის. ავთენტიფიკაციისა და ავტორიზაციის შემდეგ API server ჯერ mutating ვებჰუკებს უშვებს (sidecar-ის ჩასმა, ნაგულისხმევი მნიშვნელობები), შემდეგ კი validating ვებჰუკებს (აბრუნებს იმას, რაც წესებს არღვევს). სწორედ ამ კაუჭზე ებმება პოლიტიკის ყველა ძრავა და სერვის-მეში — გაიხსენეთ ეს მე-4 და მე-5 სექციაში.
02 · ოპერატორები და CRD 6 წთ

ასწავლეთ კლასტერს ახალი არსებითი სახელები
და ციკლები, რომლებიც მათ ამუშავებს.

კონტროლის ციკლი მხოლოდ ჩაშენებული ტიპებისთვის არაა. CRD-ით შეგიძლიათ საკუთარი ობიექტების ტიპები დაამატოთ და შემდეგ კონტროლერი დაწეროთ, რომელიც მათ ათანხმებს — ეს არის ოპერატორი. სწორედ ასე ხდებიან Postgres, Kafka, cert-manager და Argo სრულფასოვანი „kind“-ები, რომლებსაც kubectl apply-ით მართავთ.

CustomResourceDefinition (CRD) — სქემა, რომელიც API server-ში სრულიად ახალ ობიექტის ტიპს არეგისტრირებს. გამოყენების შემდეგ kind: Database ისეთივე რეალურია, როგორც kind: Pod: ინახება etcd-ში, მოწმდება OpenAPI-სქემით, გაიცემა REST-ით, ექვემდებარება RBAC-ს და მისი watch შესაძლებელია. CRD ამატებს არსებით სახელს; თავისით ის არაფერს აკეთებს.
ოპერატორი — CRD პლუს საკუთარი კონტროლერი, რომელშიც ექსპლუატაციის ცოდნაა ჩაწერილი. კონტროლერი თქვენს მორგებულ რესურსს აკვირდება და აკეთებს იმას, რასაც ცოცხალი SRE გააკეთებდა: ქმნის, კონფიგურაციას უწევს, სარეზერვო ასლს იღებს, ავარიისას გადართავს, განაახლებს. ის runbook-ს შეთანხმების ციკლად აქცევს.
# a custom resource — your new noun apiVersion: acme.io/v1 kind: Database metadata: name: orders spec: engine: postgres-16 replicas: 3 backup: { schedule: "0 2 * * *" } status: # written by the operator, not you phase: Ready

თქვენ წერთ Database-ს; ოპერატორი მას იმ ჩაშენებულ ობიექტებად ათანხმებს, რომლებიც Postgres-ს რეალურად უშვებენ.

ორი დეტალი, რომელიც სათამაშოს ნამდვილი ოპერატორისგან განასხვავებს

status სუბრესურსი

spec მომხმარებლისაა, status — ოპერატორის

კარგად აღზრდილი ოპერატორი spec-ს არასოდეს წერს (ის მომხმარებლისაა) და პროგრესს მხოლოდ status-ში აღწერს. /status სუბრესურსი მას საშუალებას აძლევს, status განაახლოს ობიექტის generation-ის გაზრდის გარეშე — ასე ის საკუთარ შეთანხმებას ციკლში აღარ იწვევს.

finalizer-ები

გაქრობამდე მოალაგეთ

finalizer ობიექტზე მიწერილი სტრიქონია, რომელიც წაშლას აჩერებს, სანამ ოპერატორი მას არ მოხსნის. წაშლისას ობიექტი deletionTimestamp მდგომარეობაში გადადის; ოპერატორი დასუფთავებას ატარებს (შლის ღრუბლოვან დისკს, აუქმებს DNS-ჩანაწერს), შემდეგ finalizer-ს ხსნის და Kubernetes წაშლას ასრულებს.

ინსტრუმენტები — ოპერატორის აგება

Kubebuilder

SIG-ის მშობლიური სკაფოლდერი

საზოგადოების პროექტი, რომელიც controller-runtime-ს ახვევს: აგენერირებს CRD-ტიპებს, მენეჯერსა და შემთანხმებლებს Go-ზე.

  • დადებითი: ყველაზე ახლოს upstream-თან, მინიმალური ჯადოქრობა, ფაქტობრივი საფუძველი, რომელზეც დანარჩენი ყველაფერი შენდება.
  • უარყოფითი: მხოლოდ Go და უფრო დაბალი დონე; მეტი რამ თავად უნდა შეაერთოთ.
Operator SDK

სრული კომპლექტი ყველაფრით

Red Hat-ის ინსტრუმენტარიუმი, აშენებული Kubebuilder-ის თავზე: ამატებს Helm-სა და Ansible-ზე დაფუძნებულ ოპერატორებს, OLM-შეფუთვასა და scorecard-ტესტებს.

  • დადებითი: Go-ს გარეშე გზები (Helm/Ansible) და უფრო მდიდარი რელიზის ისტორია.
  • უარყოფითი: მეტი შრე და მეტი კონვენცია შესასწავლი.

როგორ აირჩიოთ: კაპოტის ქვეშ ორივე ერთსა და იმავე controller-runtime შემთანხმებელს აწარმოებს. აირჩიეთ Kubebuilder, თუ გინდათ მჭლე Go-ოპერატორი upstream-თან ახლოს; აირჩიეთ Operator SDK, თუ Helm/Ansible გზა ან OLM-ით გავრცელება გჭირდებათ. ნებისმიერი ოპერატორის დაწერამდე შეამოწმეთ, ხომ არ არსებობს უკვე მზა — პოპულარულ პროგრამებს უმეტესად აქვთ.

03 · ქსელის შიდა მექანიკა 6 წთ

როგორ აღწევს პაკეტი
სინამდვილეში pod-მდე.

ნაწილ 1-ში ითქვა: „ყოველი pod იღებს IP-ს და Service მათზე დატვირთვას ანაწილებს“. სწორია — მაგრამ ვინ ანიჭებს ამ IP-ებს და რა აქცევს Service-ის ვირტუალურ IP-ს რეალურ pod-ად? პასუხები ასეთია: CNI — pod-ების ქსელისთვის, kube-proxy (ან მისი eBPF-ჩამნაცვლებლები) — Service-ებისთვის და NetworkPolicy — ფაიერვოლისთვის.

CNI — Container Network Interface — დანამატის სპეციფიკაცია, რომელსაც kubelet იძახებს, რომ ყოველ pod-ს ქსელი მისცეს. როცა pod ნოუდზე თავსდება, kubelet იძახებს CNI-დანამატს (Calico, Cilium ან თავად ღრუბლისა), რომ IP გამოყოს და pod ბრტყელ ქსელში ჩააბას, სადაც ყოველი pod ყოველ სხვა pod-ს პირდაპირ წვდება, NAT-ის გარეშე. სწორედ დანამატშივე წყდება, overlay იქნება თუ მშობლიური მარშრუტიზაცია.
kube-proxy & Service-ის VIP — Service-ის ClusterIP ვირტუალურია; მას არავინ უსმენს. kube-proxy თითოეული ნოუდის ბირთვს (iptables ან IPVS) ისე აპროგრამებს, რომ VIP-ზე მიმავალი ტრაფიკი EndpointSlice-იდან აღებულ რეალურ pod-ის IP-ზე გადაწეროს. თანამედროვე data plane-ები, როგორიცაა Cilium, kube-proxy-ს სრულად ცვლიან eBPF-პროგრამებით, რომ დიდ მასშტაბზე შეყოვნება შეამცირონ.

Service-ის პროცესი არ არსებობს. ნოუდის ბირთვი VIP-ს ერთ ჯანმრთელ ენდპოინტზე გადაწერს — დატვირთვის განაწილება data plane-ში ხდება.

გზა თავიდან ბოლომდე

  • კლიენტი api-ს კლასტერის DNS-ით (CoreDNS) Service-ის ClusterIP-ად ამოიცნობს.
  • პაკეტი pod-ს ტოვებს; ნოუდის ბირთვი VIP-ს ცნობს და DNAT-ით EndpointSlice-იდან არჩეულ რეალურ pod-ის IP-ზე გადაწერს.
  • EndpointSlice-ები (Endpoints-ის მასშტაბირებადი მემკვიდრე) — სწორედ მათ არედაქტირებს საბოლოოდ მზადყოფნის პრობი: მზადყოფნა თუ ჩავარდა, თქვენი IP სწორედ აქედან ქრება.
  • HTTP-სთვის Ingress-კონტროლერი ან უფრო ახალი Gateway API TLS-ს წყვეტს და ჰოსტის/გზის მიხედვით მარშრუტიზაციას აკეთებს, სანამ ეს ყველაფერი დაიწყებოდეს.
NetworkPolicy — pod-ის დონის ფაიერვოლი, რომელიც სამიზნეს ლეიბლებით ირჩევს. ნაგულისხმევად ყოველ pod-ს ყოველ სხვა pod-თან საუბარი შეუძლია. როგორც კი რომელიმე NetworkPolicy pod-ს შეარჩევს, ეს pod თქვენ მიერ მითითებული მიმართულებისთვის default-deny-ზე გადადის — მხოლოდ ნებადართული ტრაფიკი გადის. წესებს CNI-დანამატი აღასრულებს, ამიტომ თქვენი CNI მათ უნდა უჭერდეს მხარს (Calico და Cilium უჭერენ; ზოგი მარტივი დანამატი — არა).
# ჯერ ყველა შემომავალი აიკრძალოს, შემდეგ ვიწრო ნებართვები apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: { name: db-lockdown } spec: podSelector: matchLabels: { app: db } policyTypes: [Ingress] ingress: - from: - podSelector: matchLabels: { app: api } # მხოლოდ api → db

რატომ არის ეს მნიშვნელოვანი

  • ბრტყელი ქსელი ნიშნავს, რომ დარღვეულ ფრონტენდს ნაგულისხმევად თქვენს მონაცემთა ბაზამდე მიუწვდება ხელი. NetworkPolicy სწორედ ის საშუალებაა, რომლითაც სეგმენტაციას აბრუნებთ.
  • საუკეთესო პრაქტიკა: მთელ namespace-ზე default-deny, შემდეგ კი ცალსახა ნებართვები თითო დამოკიდებულებაზე — მინიმალური უფლებები ქსელის შრეზე.
  • წესები, როგორც აქ ყველაფერი, ლეიბლებზეა აგებული, ამიტომ pod-ებს გადანაწილებისას თან მიჰყვება — IP-ების დევნა საჭირო არაა.
  • L7-წესებისთვის (HTTP-გზისა და მეთოდის მიხედვით) Cilium-ის მსგავსი CNI ან სერვის-მეში დაგჭირდებათ — ჩვეულებრივი NetworkPolicy მხოლოდ L3/L4-ია.
04 · უსაფრთხოება 5 წთ

მინიმალური უფლებები ბოლომდე —
RBAC-იდან იმიჯამდე.

კლასტერს ბევრი გზა აქვს, ზედმეტად ლმობიერი იყოს: იდენტობები, რომლებსაც ყველაფერი შეუძლიათ, pod-ები, რომლებიც root-ით ეშვება, secret-ები ღია ტექსტად და იმიჯები, რომლებიც არავის შეუმოწმებია. დაცვა შრეებად ეწყობა: RBAC — ვის; Pod Security — რა შეუძლია pod-ს; დაშიფრული secret-ები; და მიწოდების ჯაჭვის შემოწმებები იმისთვის, რასაც საერთოდ უშვებთ.

RBAC — Role-Based Access Control — მიეცი სუბიექტს ზმნები კონკრეტულ რესურსებზე და მეტი არაფერი. Role (namespace-ის ფარგლებში) ან ClusterRole (მთელ კლასტერზე) ჩამოთვლის ნებადართულ ზმნებს (get, list, create) რესურსების ტიპებზე. RoleBinding ამ როლს სუბიექტს — მომხმარებელს, ჯგუფს ან ServiceAccount-ს — მიაბამს. RBAC მხოლოდ დამატებითია: აკრძალვის წესები არ არსებობს, ამიტომ უფლებებს ნულიდან ზემოთ ანიჭებთ.
ServiceAccount — pod-ის და არა ადამიანის იდენტობა. ყოველი pod ერთი მათგანით ეშვება; მისი API-გამოძახებები მოკლევადიან, პროეცირებულ ტოკენს ატარებს, რომელიც ამ pod-ის სიცოცხლეზეა მიბმული (თანამედროვე კლასტერებმა ძველი, ვადაგაუსვლელი ტოკენები მიატოვეს). დააწყვილეთ ცალკე ServiceAccount მჭიდრო Role-თან, რომ თითოეულ დატვირთვას მხოლოდ საჭირო რამეზე მიუწვდებოდეს ხელი და არა მთელ კლასტერზე.

სუბიექტი + Role = RoleBinding. ზმნები და რესურსები Role-ში ცხოვრობს; მიბმა მხოლოდ ამბობს, რომ „ამ იდენტობას მისი გამოყენება შეუძლია“.

Pod Security & secret-ები

  • Pod Security Admission ძველი PodSecurityPolicy-ის ჩამნაცვლებელია. ის namespace-ზე სამ დონეს აღასრულებს — privileged, baseline, restricted — უბრალო ლეიბლით. მიზნად restricted დაისახეთ: root არა, უფლებების ესკალაცია არა, capabilities მოხსნილი.
  • Secret-ები etcd-ში ნაგულისხმევად მხოლოდ base64-ია. ჩართეთ დაშიფვრა მოსვენებულ მდგომარეობაში (KMS-პროვაიდერი) და RBAC-ით შეზღუდეთ get secrets — ან secret-ები გარე საცავში გაიტანეთ (Vault, ღრუბლის secret-მენეჯერები) External Secrets ოპერატორით.
  • გამორთეთ automountServiceAccountToken იქ, სადაც pod API-ს საერთოდ არ იძახებს.
მიწოდების ჯაჭვის უსაფრთხოება — დაამტკიცე, რომ იმიჯი სწორედ ის არის, რომელიც ააგე და ენდობი, სანამ ის გაეშვება. მოაწერეთ იმიჯებს ხელი Sigstore/cosign-ით, დააგენერირეთ SBOM (პროგრამული უზრუნველყოფის შემადგენლობის ნუსხა) და admission-პოლიტიკამ უარი თქვას ხელმოუწერელ ან შეუმოწმებელ იმიჯებზე. პოლიტიკის ძრავა, რომელიც ამას აღასრულებს, იმავე admission-კაუჭზეა შემოკიდებული, რაზეც პირველ სექციაში ვისაუბრეთ.

ინსტრუმენტები — პოლიტიკის აღსრულება

OPA / Gatekeeper

ზოგადი პოლიტიკა Rego-ზე

Open Policy Agent Gatekeeper admission-კონტროლერთან ერთად. შეზღუდვები Rego-ზე იწერება — ეს სპეციალურად პოლიტიკისთვის შექმნილი ენაა, რომელიც Kubernetes-ს ბევრად სცდება.

  • დადებითი: უკიდურესად გამომსახველი; ერთი პოლიტიკის ძრავა CI-ზე, API-ებსა და კლასტერებზე.
  • უარყოფითი: Rego-ს შესწავლა რეალურ დროს მოითხოვს.
Kyverno

პოლიტიკა YAML-ად

Kubernetes-ისთვის მშობლიური ძრავა, სადაც პოლიტიკები YAML-ზე დაწერილი CRD-ებია — ამოწმებს, ცვლის და ქმნის რესურსებს ახალი ენის გარეშე.

  • დადებითი: DSL არ არის; მუტაცია და გენერაცია ჩაშენებულია; მაშინვე ნაცნობია.
  • უარყოფითი: მხოლოდ Kubernetes-ისთვისაა და რთული ლოგიკისთვის ნაკლებად გამომსახველი.

როგორ აირჩიოთ: გინდათ პოლიტიკა, რომელიც Kubernetes-ს სცდება, ან ნამდვილად რთული წესები? OPA/Gatekeeper. გინდათ დამცავი მოაჯირები დღესვე გაუშვათ ჩვეულებრივ YAML-ზე, მუტაციის ჩათვლით? Kyverno. ორივე validating/mutating ვებჰუკად მუშაობს — არჩევანი ენაზეა და არა მექანიზმზე.

05 · სერვის-მეში და ტრაფიკი 5 წთ

გაიტანეთ mTLS და მარშრუტიზაცია
აპლიკაციის გარეთ.

როცა ბევრი სერვისი გყავთ, გინდათ დაშიფრული ტრაფიკი სერვისებს შორის, ხელახალი მცდელობები და ტრაფიკის ზუსტი დაყოფა — ისე, რომ ეს ყოველ აპლიკაციაში არ ჩააშენოთ. სერვის-მეში თითოეული დატვირთვის გვერდით პროქსის აყენებს და ამ ყველაფერს პლატფორმის შრიდან მართავს.

სერვის-მეში — გამოყოფილი პროქსი-შრე, რომელიც სერვისებს შორის ქსელს უვლის. პროქსების data plane (კლასიკურად თითო pod-ზე ერთი Envoy-sidecar) ტრაფიკს ატარებს; control plane კი მათ აკონფიგურირებს. თქვენი აპლიკაცია ისევე იძახებს http://orders-ს, როგორც ადრე — პროქსი კი გამჭვირვალედ ამატებს mTLS-ს, ხელახალ მცდელობებს, ტაიმაუტებსა და მეტრიკებს.
mTLS — ორმხრივი TLS — ორივე მხარე სერტიფიკატს წარადგენს, ამიტომ ტრაფიკი დაშიფრულია და იდენტობა დამოწმებული. მეში თითო დატვირთვის იდენტობაზე მოკლევადიან სერტიფიკატს გასცემს (ხშირად SPIFFE-ს სტილში) და ავტომატურად ანახლებს. კლასტერშიდა ტრაფიკზე zero-trust გეძლევათ აპლიკაციის კოდის შეცვლის გარეშე.

პროქსი ყოველ ნახტომს შიფრავს და ტრაფიკს წონის მიხედვით ყოფს — 90% სტაბილურზე, 10% canary-ზე — აპლიკაციის ცვლილების გარეშე.

Canary & ტრაფიკის დაყოფა

  • canary რეალური ტრაფიკის მცირე ნაწილს ახალ ვერსიაზე უშვებს, მის მეტრიკებს აკვირდება და მხოლოდ ამის შემდეგ ზრდის წილს — ან ავტომატურად აბრუნებს უკან.
  • მეში ტრაფიკს წონით ან მოთხოვნის ატრიბუტებით (ჰედერი, მომხმარებელი) ყოფს, რეპლიკების რაოდენობისგან დამოუკიდებლად — ეს Deployment-ის rolling განახლებაზე ბევრად უფრო ზუსტია.
  • ხელახალი მცდელობები, ტაიმაუტები და დენის გამთიშველი პროქსში გადადის, ამიტომ ყოველი სერვისი მათ ერთნაირად იღებს.
  • უფრო ახალი არქიტექტურა — Istio-ს ambient რეჟიმი — თითო pod-ის sidecar-ს თმობს და ნოუდის დონის პროქსზე გადადის, არასავალდებულო L7-waypoint-ებით, რაც ზედნადებს ამცირებს.

ინსტრუმენტები — თავად მეში

Istio

სრულფუნქციური მეში

Envoy-ზეა აგებული, ღრმა ტრაფიკის მართვით, პოლიტიკითა და მრავალკლასტერული მხარდაჭერით; ახლა უკვე გთავაზობთ sidecar-იან და sidecar-ის გარეშე ambient რეჟიმებს.

  • დადებითი: ყველაზე მდიდარი შესაძლებლობებით; უმკლავდება რთულ მარშრუტიზაციასა და დიდ, მრავალკლასტერულ კონფიგურაციებს.
  • უარყოფითი: დიდი ზედაპირი და რეალური საექსპლუატაციო წონა.
Linkerd

მსუბუქი მეში

CNCF-ის დამთავრებული პროექტი, აგებული სპეციალურად შექმნილ Rust-მიკროპროქსზე, ოპტიმიზებული სიმარტივესა და დაბალ ზედნადებზე.

  • დადებითი: მარტივი, სწრაფი, ადვილად სამართავი; mTLS ნაგულისხმევად ჩართული.
  • უარყოფითი: ტრაფიკის რთული ფუნქციები Istio-ზე ნაკლები აქვს.

როგორ აირჩიოთ: გინდათ მაქსიმალური კონტროლი, რთული მარშრუტიზაცია ან რამდენიმე კლასტერი? Istio (ზედნადების შესამცირებლად ambient რეჟიმიც განიხილეთ). გინდათ mTLS და ოქროს მეტრიკები მინიმალური საექსპლუატაციო ტვირთით? Linkerd. და გახსოვდეთ: მეში უფასო არაა — მიმართეთ მას მხოლოდ მაშინ, როცა აპლიკაციის დონის ქსელური ტკივილი პროქსებს ამართლებს.

06 · GitOps და მასშტაბირება 5 წთ

მართეთ ფლოტი ისე, როგორც
ერთ კლასტერს მართავთ.

მასშტაბზე ორი პრობლემა დომინირებს: ბევრი კლასტერის ცნობილ, აუდიტირებად მდგომარეობაში შენარჩუნება და pod-ებისა და ნოუდების სწორად გაზომვა დატვირთვის მოძრაობისას. პირველზე პასუხობს GitOps; მეორეზე — ავტოსკეილერების სტეკი.

GitOps — Git არის სასურველი მდგომარეობა, კლასტერშიდა აგენტი კი კლასტერს განუწყვეტლივ ათანხმებს მასთან. ეს პირველი სექციის შეთანხმების ციკლია, გამოყენებული თქვენს მთელ კონფიგზე: შეაერთეთ PR, აგენტი მას დაასინქრონებს და ხელით შეტანილი ნებისმიერი გადახრა უკან დაბრუნდება. Git ხდება თქვენი აუდიტის ლოგიც და როლბექის ღილაკიც.

აგენტი Git-იდან წამოიღებს და განუწყვეტლივ ათანხმებს — ხელით შეტანილი ცვლილება გადახრად იქცევა და შემდეგ რეპოზიტორიის შესაბამისად უკან ბრუნდება.

სამი ავტოსკეილერი

  • HPA (ჰორიზონტალური) — ამატებს ან აკლებს pod-რეპლიკებს, რომ მეტრიკა სამიზნესთან ახლოს დარჩეს. ყოველდღიური ვარიანტი (ნაწილი 1).
  • VPA (ვერტიკალური) — თითოეული pod-ის CPU/მეხსიერების requests-ს სწორ ზომაზე მიჰყავს. კარგია ძნელად პარალელიზებადი დატვირთვებისთვის; ნუ გაუშვებთ იმავე მეტრიკაზე, რომელზეც HPA მუშაობს.
  • Cluster Autoscaler / Karpenter — ამატებს ან აშორებს ნოუდებს, როცა pod-ები ვერ თავსდება ან უსაქმოდ დგას. Karpenter სწორი ზომის ნოუდებს ზუსტად საჭირო მომენტში ქმნის.
  • ერთად: HPA pod-ებს ამასშტაბებს, ნოუდების ავტოსკეილერი კლასტერს მათ ქვეშ ზრდის, VPA კი ზომებს არეგულირებს.
პროგრესული მიწოდება & მრავალი კლასტერი — canary-ების ავტომატიზება და ბევრი კლასტერის ერთ ფლოტად მოპყრობა. Argo Rollouts-ისა და Flagger-ის მსგავსი ინსტრუმენტები მე-5 სექციის მეტრიკებით შემოწმებულ canary-ებს დეკლარაციულად მართავს. ბევრი კლასტერისთვის Cluster API კლასტერის სასიცოცხლო ციკლს Kubernetes-ის ობიექტებად მართავს, GitOps-ის „app-of-apps“ და ფლოტის შაბლონები კი კონფიგს ყველგან ავრცელებს.

ინსტრუმენტები — GitOps-ძრავები

Argo CD

GitOps ინტერფეისით

კონტროლერი მდიდარი დაშბორდით, რომელიც სინქრონიზაციის სტატუსსა და ცოცხალი მდგომარეობის Git-თან სხვაობებს აჩვენებს; პროგრესული მიწოდებისთვის Argo Rollouts-თან წყვილდება.

  • დადებითი: შესანიშნავი ხილვადობა; რბილი შესვლა; ძლიერი ინტერფეისი.
  • უარყოფითი: კიდევ ერთი დიდი სისტემა, რომელიც უნდა უშვათ და დაიცვათ.
Flux

მსუბუქი GitOps

პატარა, აწყობადი კონტროლერების ნაკრები, Git-ისთვის მშობლიური და CLI-ზე ორიენტირებული, რომელიც სუფთად ინტეგრირდება Helm-სა და Kustomize-თან.

  • დადებითი: მინიმალური, მოდულური, ავტომატიზაციაში ადვილად ჩასაშენებელი.
  • უარყოფითი: Argo-სნაირად მდიდარი ჩაშენებული ინტერფეისი არ აქვს.

როგორ აირჩიოთ: გინდათ დაშბორდი და მარტივი დასაწყისი? Argo CD. გინდათ მინიმალური, აწყობადი, ავტომატიზაციაზე ორიენტირებული სისტემა? Flux. ორივე Git-ს ჭეშმარიტების წყაროდ აქცევს; სხვაობა ზედაპირშია და არა იდეაში.

07 · ოპერატორი და შეჯამება 5 წთ

ერთი CRD, ერთი ციკლი —
დანარჩენი ყველაფერი დეტალია.

შევკრათ ყველაფერი პატარა ოპერატორის ფორმით, რომელიც ერთ წესს აღწერს: „ყოველ Database-ს გარე სარეზერვო ასლი უნდა ჰქონდეს“. ეს იგივე შეთანხმების ციკლია პირველი სექციიდან, ოღონდ ახლა თქვენს არსებით სახელზე მუშაობს.

// the heart of an operator — controller-runtime
async reconcile(ctx: Context, req: Request): Promise<Result> {
  const db = await this.get<Database>(req.namespacedName);

  if (!db.spec.backup) {                  // enforce policy
    return this.reject("backup is required");
  }
  await this.ensureStatefulSet(ctx, db);  // converge built-ins
  await this.ensureBackupCronJob(ctx, db);
  db.status.phase = "Ready";
  await this.updateStatus(ctx, db);       // status, never spec
  return this.requeue();                  // level-triggered, forever
}

დაკვირვება რესურსზე, წესის აღსრულება, ჩაშენებული ობიექტების დაახლოება, status-ის დაფიქსირება, რიგში დაბრუნება. ეს ერთი შაბლონი კვებავს კლასტერის ყოველ კონტროლერს.

ხუთი წესი, რომელიც თან უნდა წაიღოთ

1ბოლომდე ციკლებია. API server განზრახვას ინახავს; level-triggered კონტროლერები კი მას სამუდამოდ ათანხმებენ.
2გააფართოვეთ CRD-ებითა და ოპერატორებით. ახალი არსებითი სახელი პლუს შეთანხმების ციკლი runbook-ს პროგრამად აქცევს.
3ქსელი დაპროგრამებადია. CNI pod-ებს IP-ებს აძლევს, kube-proxy/eBPF Service-ებს ხსნის, NetworkPolicy კი მათ სეგმენტებად ყოფს.
4მინიმალური უფლებები, შრეებად. RBAC, restricted დონის Pod Security, დაშიფრული secret-ები, ხელმოწერილი იმიჯები — და პოლიტიკა admission-ზე.
5პლატფორმის საზრუნავი ქვემოთ ჩასწიეთ. მეში — mTLS-სა და ტრაფიკს, GitOps — მდგომარეობას, ავტოსკეილერები — ზომას.
  • ოპერატორი მხოლოდ მაშინ, როცა არსებული აღარ გამოდგება — პროგრამების უმეტესობას ის უკვე მოჰყვება.
  • მეში მხოლოდ მაშინ, როცა აპლიკაციის დონის ქსელური ტკივილი რეალურია; პროქსები შეყოვნებასაც და ექსპლუატაციასაც ღირს.
  • რამდენიმე კლასტერი მხოლოდ მაშინ, როცა ერთი კლასტერი ნამდვილად ვერ აკმაყოფილებს დაზიანების რადიუსის ან ლოკაციის მოთხოვნებს.
  • მოწინავე ინსტრუმენტები თავს დიდ მასშტაბზე ამართლებს — მანამდე კი მხოლოდ წონას ამატებს.
ცოდნის შემოწმება

დაგამახსოვრდათ?

ხუთი კითხვა control plane-ზე, ოპერატორებზე, ქსელის შიდა მექანიკაზე, უსაფრთხოებასა და მეშზე — მყისიერი პასუხი, ავტორიზაციის გარეშე.

შეაფასეთ ეს დასტა
იყავით პირველი

ნავიგაცია ← → ღილაკებით ან სქროლით · უკან ბიბლიოთეკაში