38-წუთიანი სამუშაო სესია იმაზე, როგორ გადახვიდეთ ლეპტოპზე გაშვებული ერთი კონტეინერიდან მთელ ფლოტამდე, რომელიც თავად ანაწილებს, მასშტაბირებს და ირჩენს თავს — Pod-ები, Deployment-ები, Service-ები, კონფიგურაცია & საცავი, ავტომასშტაბირება და ის ინსტრუმენტები, რომლებიც ამ ყველაფერს ერთად კრავს.
ერთ კონტეინერს ხელითაც გაუშვებთ, docker run-ით. მაგრამ რეალურ სისტემებს სჭირდება ათეულობით ასლი ბევრ სერვერზე გაბნეული, გადატვირთული მაშინ, როცა ჩავარდება, ჩანაცვლებული მაშინ, როცა მანქანა კვდება, და განახლებული მოცდენის გარეშე. ამის ხელით კეთება სრული განაკვეთის სამუშაოა. Kubernetes ის რობოტია, რომელიც ამას თქვენ მაგივრად აკეთებს — მთელი დღე, ყოველდღე.
სასურველი და ფაქტიური, სამუდამოდ. სწორედ ამ სხვაობის დახურვას უთმობს Kubernetes მთელ სიცოცხლეს.
თვითგანკურნება. ჩავარდნილი კონტეინერი ან მკვდარი მანქანა? ავტომატურად ჩანაცვლდება.
მასშტაბირება. ღამით 3 ასლი, პიკზე 30 — ხელით ან ავტომატურად.
განახლება მოცდენის გარეშე. ახალი ვერსია თანდათან გამოდის; თუ ცუდად იქცევა, უკან დააბრუნებთ.
სერვისების აღმოჩენა. აპლიკაციები ერთმანეთს სახელით პოულობენ მაშინაც კი, როცა ასლები მოდიან და მიდიან.
თითქმის ყველაფერი, რასაც უშვებთ, ობიექტების მცირე ნაკრებით აღიწერება, რომლებიც ერთმანეთზე ეწყობა. დროის 90%-ს სამ მათგანთან გაატარებთ: Pod (რა მუშაობს), ReplicaSet (რამდენი) და Deployment (როგორ იცვლება ის დროთა განმავლობაში).
ერთი pod-ის კონტეინერები ერთ IP-ს იზიარებენ და localhost-ით ესაუბრებიან ერთმანეთს. pod არის განთავსების ერთეული.
თქვენ წერთ Deployment-ს; ის ქმნის ReplicaSet-ს; ReplicaSet კი pod-ებს იმ რაოდენობაზე ინახავს, რაც მოითხოვეთ.
replicas: 3 სურვილია; template კი ის pod-ია, რომელიც სამჯერ იბეჭდება. გაუშვით apply და დანარჩენს ციკლი გააკეთებს.
app=api“, ხოლო Service მოგვიანებით სწორედ იმავე ლეიბლზე აგზავნის ტრაფიკს. არაფერია მიბმული ჩაშენებულ იდენტიფიკატორებზე — ყველაფერი ლეიბლებით თანხვდება.თითოეულ pod-ს თავისი IP აქვს, მაგრამ pod-ები მუდმივად იცვლება — ანუ ეს IP მოძრავი სამიზნეა. მას კოდში ვერ ჩააწერთ. Service გაძლევთ სტაბილურ სახელსა და მისამართს, რომელიც ყოველთვის მის უკან მდგარ ჯანმრთელ pod-ებზე მიუთითებს, რამდენჯერაც არ უნდა შეიცვალონ ისინი.
http://api-ს (სერვისის სახელს) მიმართავენ და არასოდეს ფიქრობენ იმაზე, რომელი pod ან რომელი ნოუდი პასუხობს. Service მოთხოვნებს იმ pod-ებზე ანაწილებს, რომლებიც ამჟამად ჯანმრთელია.Service ლეიბლით ირჩევს pod-ებს და დატვირთვას ჯანმრთელებზე ანაწილებს — pod-ები შეიძლება შეიცვალოს ისე, რომ გამომძახებლებმა ვერც შენიშნონ.
იგივე app: api ლეიბლი, რაც Deployment-ს აქვს — სხვა კავშირი საჭირო არ არის.
ნაგულისხმევი. ვირტუალური IP, რომელიც მხოლოდ კლასტერის შიგნით არის ხელმისაწვდომი. იდეალურია, როცა ერთი აპლიკაცია მეორეს იძახებს (frontend → api → db).
ხსნის ერთსა და იმავე მაღალ პორტს თითოეული ნოუდის IP-ზე. მარტივია, მაგრამ უხეში და პროდაქშენში პირდაპირ იშვიათად გამოიყენება — ძირითადად სამშენებლო ბლოკია.
თქვენს ღრუბელს სთხოვს გარე დატვირთვის ბალანსერს საჯარო IP-ით. ეს ჩვეულებრივი გზაა, ერთი TCP სერვისი ინტერნეტში გამოაჩინოთ.
shop.acme.com → web, shop.acme.com/api → api. ის ასევე ერთ ადგილას ამთავრებს TLS-ს (HTTPS).ერთი შესასვლელი, ბევრი ბექენდი. გზისა და ჰოსტის წესები წყვეტს, რომელ Service-მდე მიდის თითოეული მოთხოვნა.
კონტეინერის იმიჯი ყველა გარემოში ერთი და იგივე უნდა იყოს — მხოლოდ მისი პარამეტრები იცვლება. Kubernetes ამას გამოყოფს: ConfigMap-ები და Secret-ები ინახავს პარამეტრებს; Volume-ები და PVC-ები კი იმ მონაცემებს, რომლებმაც ცალკეულ pod-ზე დიდხანს უნდა იცოცხლოს.
გასაღები/მნიშვნელობის კონფიგი — ლოგირების დონე, ფუნქციონალის ფლაგები, სერვისის URL — pod-ში შედის როგორც გარემოს ცვლადები ან მიმაგრდება როგორც ფაილები. კონფიგს ცვლით იმიჯის ხელახლა აგების გარეშე.
იგივე იდეა პაროლების, ტოკენებისა და TLS გასაღებებისთვის. ინახება base64 კოდირებით და ცალკე დევს, რომ წვდომა შეიზღუდოს და მათი დაშიფვრა მოსვენებულ მდგომარეობაში გახდეს შესაძლებელი. base64 არ არის დაშიფვრა — კლასტერის საიდუმლოებების საცავს ფრთხილად მოეპყარით.
ერთი და იგივე იმიჯი პარამეტრებს გარემოს ცვლადებიდან ან ფაილებიდან კითხულობს — ისინი ყოველ გარემოში ცალკე მიეწოდება.
კონფიგი მითითებით შემოდის — არასოდეს იწვება იმიჯში და არასოდეს კომიტდება ღია ტექსტად.
pod ითხოვს საცავს ზომისა და ტიპის მიხედვით; კლასტერი ამ მოთხოვნას რეალურ დისკს აბამს და pod-ის გადაადგილებისას ხელახლა მიამაგრებს.
StatefulSet + PVC-ები უზრუნველყოფს.სწორედ აქ ამართლებს კონტროლის ციკლი თავის თავს. პრობები ეუბნება Kubernetes-ს, ჯანმრთელია თუ არა pod, ავტოსკეილერი რეპლიკების რაოდენობას დატვირთვას უსადაგებს, rolling განახლებები კი ვერსიებს რამდენიმე pod-ის ბიჯით ცვლის.
პერიოდული შემოწმება (HTTP, TCP ან ბრძანება). თუ ის რამდენჯერმე ჩავარდება, Kubernetes კონტეინერს გადატვირთავს — ეს არის წამალი ჩამოკიდებული ან ჩაკეტილი პროცესისთვის.
ამოწმებს, შეუძლია თუ არა pod-ს ახლავე მომსახურება. სანამ ის ჩავარდნილია, pod Service-იდან ამოდის — მოთხოვნები აღარ ეგზავნება — მაგრამ არ გადაიტვირთება. შესანიშნავია გახურებისა და დროებითი გადატვირთვისთვის.
იცავს ნელა მოსტარტავ აპლიკაციებს: აჩერებს liveness შემოწმებას, სანამ აპლიკაცია გაშვებას არ დაასრულებს, რომ ნელი ჩატვირთვა ჩავარდნაში არ აგერიოთ.
requests ეუბნება scheduler-ს, რამდენი ადგილი დაჯავშნოს; limits კი ზღუდავს, რამდენის გამოყენება შეუძლია pod-ს. ავტოსკეილერიც სწორედ ამათ მიმართ ზომავს დატვირთვას.
ახალი pod-ები ჯერ ეშვება და მზადყოფნის შემოწმებას გადის, მხოლოდ ამის შემდეგ ითიშება ძველები — ასე სიმძლავრე არასოდეს ეცემა და ცუდი ვერსია უკან დაბრუნებადია.
kubectl rollout undo წინა ReplicaSet-ზე გაბრუნებთ, თუ ახალი ვერსია ცუდად იქცევა.ღილაკებს იშვიათად აჭერთ. YAML-ს CLI-ით უშვებთ, შაბლონად აქცევთ, რომ ყველგან კოპირებული არ დაგროვდეს, და სულ უფრო ხშირად Git-ს აქცევთ ჭეშმარიტების წყაროდ. თავად კლასტერი კი ჩვეულებრივ მართული პროვაიდერისგან მოდის. აი წამყვანი ინსტრუმენტები და თითოეულის კომპრომისი.
ოფიციალური ბრძანების ხაზის ინსტრუმენტი — მანიფესტების გაშვება, ყველაფრის დათვალიერება და გამართვა.
მანიფესტებს კრავს ხელახლა გამოსაყენებელ, პარამეტრიზებულ ჩარტებად — Postgres-ს ან თქვენს აპლიკაციას ერთი ბრძანებითა და values-ფაილით აყენებთ.
ჩაშენებულია kubectl-ში. ინახავთ მარტივ ბაზას და შემდეგ თითოეული გარემოსთვის ოვერლეებით აპაჩავთ — შაბლონების ენის გარეშე.
როგორ აირჩიოთ: დაიწყეთ kubectl + Kustomize-ით — ახალი ენები საერთოდ არ გჭირდებათ და გუნდების უმეტესობას ეს სრულად ჰყოფნის. Helm-ს მაშინ მიმართეთ, როცა აპლიკაციის შეფუთვა და გაზიარება გჭირდებათ ან მესამე მხარის პროგრამის დაყენება. ბევრი გუნდი ორივეს იყენებს: Helm-ს გარე დამოკიდებულებებისთვის, Kustomize-ს კი საკუთარი აპლიკაციებისთვის.
control plane-ის (ტვინის) თავად მართვა რთულია და იშვიათად ღირს. მართული სერვისები მას თქვენ მაგივრად უშვებენ; თქვენ მხოლოდ თქვენს დატვირთვებს მოიტანთ.
როგორ აირჩიოთ: გამოიყენეთ იმ ღრუბლის მართული სერვისი, სადაც უკვე ხართ — უმეტესობისთვის სწორედ ეს არის სწორი პასუხი. თავად მართეთ მხოლოდ მაშინ, თუ on-prem გჭირდებათ, მკაცრი რეგულაციები გაქვთ ან სპეციალური აპარატურა. სასწავლად ლოკალური კლასტერი (kind, k3d ან minikube) უფასო და მყისიერია.
kubectl apply-ს ხელით აღარ უშვებთ; სამაგიეროდ, pull request-ს მერჯავთ და აგენტი მას სინქრონიზაციაში მოიყვანს.კონტროლერი მდიდარი დაშბორდით, რომელიც აჩვენებს სინქრონიზაციის სტატუსს და სხვაობებს Git-სა და ცოცხალ კლასტერს შორის.
მცირე კონტროლერების ნაკრები, Git-ზე და CLI-ზე აგებული, რომელიც კარგად ეწყობა Helm-სა და Kustomize-თან.
როგორ აირჩიოთ: გინდათ დაშბორდი და რბილი შესვლა? Argo CD. გინდათ მინიმალური, აწყობადი, CLI-ზე ორიენტირებული სისტემა? Flux. ორივე შემთხვევაში მოგება ერთია: Git ხდება თქვენი აუდიტის ლოგიც და როლბექის ღილაკიც.
apply-დან ცოცხალ გაშვებამდე, ხუთი ბრძანებით.ყველაფერი, რაც აქამდე ითქვა, ერთ მოკლე ვორქფლოუში იყრის თავს: აღწერეთ, გაუშვით, გარეთ გამოიტანეთ, დაამასშტაბირეთ და ნახეთ, როგორ იკურნება.
შენიშნეთ, რომ ყოველი ნაბიჯი აღწერს იმას, რაც გინდათ. პირველი სექციის კონტროლის ციკლი ამას რეალობად აქცევს და რეალობად ინარჩუნებს.
ხუთი სწრაფი კითხვა კონტროლის ციკლზე, ძირითად ობიექტებზე, ქსელზე, კონფიგსა და მასშტაბირებაზე — მყისიერი პასუხი, ავტორიზაციის გარეშე.
ნავიგაცია ← → ღილაკებით ან სქროლით · ნაწილი 2: გაღრმავებული Kubernetes → · უკან ბიბლიოთეკაში