ჩემი სახლის ლაბორატორია — შვიდი ნოდის kubeadm კლასტერია, სადაც ოჯახისა და ჩემი პროექტების რეალური სერვისები მუშაობს. აგვისტოში ის კედელს მიადგა, რომელსაც მალე ბევრი პროდაქშენ კლასტერიც მიადგება, ამიტომ რეპეტიციად გამოვიყენე.
სამი პრობლემა, რომლებიც ერთმანეთს ბლოკავდა
- Kubernetes 1.33-ის მხარდაჭერა დასრულდა 2026 წლის ივნისში.
- Community ingress-nginx შეწყდა (დაარქივდა 2026 წლის მარტში, უსაფრთხოების პატჩები აღარ იქნება), და მისი ბოლო ვერსია 1.33-ზე ახალს არ უჭერდა მხარს. ანუ განახლების ყოველ ნაბიჯს ბლოკავდა.
- kubespray-ის საწყისი ინვენტარი დაკარგული იყო, ამიტომ დეკლარაციულად ვერაფერს გადავატარებდით. კლასტერი ჩუმად ჩვეულებრივ kubeadm კლასტერად იქცა.
ამ პრობლემებს სათითაოდ ვერ მოაგვარებ: ingress ბლოკავს განახლებას, განახლება კი ingress-ის შეცვლის მიზეზია. ამიტომ გეგმა ერთ დღეში ჩაეტია: Calico → Cilium (eBPF, kube-proxy-ის გარეშე), ingress-nginx → Gateway API და 1.33 → 1.34 → 1.35 → 1.36.
რატომ Cilium, თუმცა ის უფრო სარისკო იყო
უსაფრთხო, CNI-დამოუკიდებელი არჩევანი იყო Gateway API-ის ცალკე იმპლემენტაცია, მაგალითად Envoy Gateway. მაინც Cilium ავირჩიე და ჩავიწერე რატომ: Gateway API-ის რესურსები გადატანადია. დღეს დაწერილი HTTPRoute-ები GatewayClass-ის შეცვლასაც გადაურჩება. სარისკო ვარიანტი ჩიხი არ არის — განსხვავებით შეწყვეტილი ingress-კონტროლერის კიდევ ერთი განახლებისგან, რომელიც მაინც 1.35-ზე გაჩერდებოდა.
ჩაწერილმა არგუმენტმა თავი გაამართლა: როცა იგივე არჩევანი სამუშაო კლასტერზე დადგა, პასუხი უკვე მზად იყო.
ცოცხალი მიგრაცია: ვცადე და ფაქტებზე დაყრდნობით უარი ვთქვი
Cilium-ს აქვს დოკუმენტირებული მიგრაცია ნოდ-ნოდ, როცა Calico და Cilium გვერდიგვერდ მუშაობს. ის კონკრეტული მიზეზით ჩავარდა: Calico VXLAN-ს Always რეჟიმში იყენებდა და Calico-ს ნოდებს Cilium-ის pod CIDR-მდე მარშრუტი არ ჰქონდა. მიგრირებული ნოდის პოდები დანარჩენ ნოდებზე ვერაფერს აღწევდა — CoreDNS-საც კი. ორი კუნძული — ზუსტად ის, რასაც ჰიბრიდული რეჟიმი უნდა აცილებდეს.
ამიტომ გადავედი კონტროლირებად big-bang-ზე: ყველა ნოდის მონიშვნა, Cilium-ის CNI კონფიგის ჩაწერა, მთელი კლასტერის გადატვირთვა (დაახლოებით 2,5 წუთი შეფერხება), შემდეგ კიდევ ერთი გადატვირთვა Calico-ს წაშლის შემდეგ, რათა მისი iptables წესები და VXLAN ინტერფეისი გაწმენდილიყო.
თანმიმდევრობა, რომელსაც მნიშვნელობა ჰქონდა
- kube-proxy-ის ჩანაცვლება NodeLocal DNSCache-ის წაშლასთან ერთად უნდა მომხდარიყო და
clusterDNSისევ CoreDNS-ზე დაბრუნებულიყო. როგორც კი Cilium ClusterIP-ს eBPF-ში თარგმნის, ნოდის ლოკალური კეში ვეღარ იმუშავებს. - Cilium და kube-proxy IPVS რეჟიმში ერთად — გატეხილი შუალედური მდგომარეობაა, არა გაჩერება გზაზე. პოდები ვერცერთ ClusterIP-ს ვერ აღწევს.
- ingress-ის გადართვა ყველაზე ნაკლებად სარისკო ნაწილი იყო. Gateway ingress-nginx-ის გვერდით მუშაობდა, ყოველი ჰოსტი
Host:ჰედერით მოწმდებოდა, სანამ რეალური ტრაფიკი ძველი გზით მიდიოდა, შემდეგ ჰოსტები სათითაოდ გადაირთო მყისიერი დაბრუნების შესაძლებლობით. მხოლოდ ამის შემდეგ წაიშალა ingress-nginx.
ხაფანგები, რომლებიც წინასწარ უნდა წაიკითხოთ
- ჩარტის pod CIDR ნაგულისხმევად
10.0.0.0/8-ია. ქსელში, სადაც10.xკერძო მარშრუტებია, ის ჩუმად ყლაპავს LAN-ს და VPN-ის ყველა მარშრუტს. - თუ
/opt/cni/binroot-ს არ ეკუთვნის, Cilium-ის init კონტეინერი ვარდება: ისDAC_OVERRIDE-ს უარყოფს. - kube-proxy-ის გარეშე აგენტს
k8sServiceHostლოკალურ API-ზე სჭირდება, თორემ საკუთარ eBPF-ზე იჭედება. helm upgradeCilium-ს არ გადატვირთავს, თუ მხოლოდ ConfigMap შეიცვალა. აგენტსაც და ოპერატორსაცrollout restartსჭირდება.TLSRouteGateway API-ის ექსპერიმენტულ CRD ნაკრებშია.- SNI-ის გარეშე პროქსი TLS passthrough-ს 502-ით ტეხავს.
kubeadm upgrade nodeბოლო control-plane ნოდაზე kube-proxy-ის დამატებას ყოველ ნაბიჯზე აბრუნებდა, რადგან--skip-phasesარ მემკვიდრეობს. ყოველი ნაბიჯის შემდეგ შეამოწმეთ kube-proxy.
შედეგი
შვიდიდან შვიდი ნოდა Ready 1.36-ზე, ნული პრობლემური პოდი, საცავის ყველა ტომი ჯანმრთელია, Argo CD-ის ყველა აპლიკაცია Synced და Healthy. გაკვეთილი, რომელიც სამუშაო კლასტერებში მიმაქვს, არის არა „big-bang ნორმალურია", არამედ „ჯერ გაზომე, მერე აირჩიე მიგრაციის ფორმა": ცოცხალი მიგრაცია ქაღალდზე უფრო უსაფრთხოდ გამოიყურებოდა და სწორედ ის გატეხდა ყველაფერს.