ჩემი სახლის ლაბორატორია — შვიდი ნოდის 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/bin root-ს არ ეკუთვნის, Cilium-ის init კონტეინერი ვარდება: ის DAC_OVERRIDE-ს უარყოფს.
  • kube-proxy-ის გარეშე აგენტს k8sServiceHost ლოკალურ API-ზე სჭირდება, თორემ საკუთარ eBPF-ზე იჭედება.
  • helm upgrade Cilium-ს არ გადატვირთავს, თუ მხოლოდ ConfigMap შეიცვალა. აგენტსაც და ოპერატორსაც rollout restart სჭირდება.
  • TLSRoute Gateway 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 ნორმალურია", არამედ „ჯერ გაზომე, მერე აირჩიე მიგრაციის ფორმა": ცოცხალი მიგრაცია ქაღალდზე უფრო უსაფრთხოდ გამოიყურებოდა და სწორედ ის გატეხდა ყველაფერს.