← ყველა სტატია

Calico Ready-ში იყო შეცდომების გარეშე, ყოველი ახალი პოდი კი ნახევარი წუთი მიუწვდომელი იყო

Calico-ს განახლების შემდეგ ახალი პოდები 15–42 წამი შავ ხვრელში იყვნენ. Felix XDP resync-ის ციკლში იყო ჩარჩენილი, რომელიც მხოლოდ ნოდებს შორის ახალი პოდების ტესტმა აჩვენა.

Optimacros-ის bare-metal კლასტერზე Kubernetes-ის მრავალსაფეხურიანი განახლებისას Calico ჯერ 3.29.5-დან 3.31.7-მდე უნდა აგვეყვანა. განახლება სანიმუშოდ გამოიყურებოდა: ახალი CRD-ები და RBAC აფსტრიმიდან, ახალი იმიჯები, ყველა calico-node 1/1 Ready-ში, ClusterInformation ახალ ვერსიას აჩვენებდა, Felix-ის ლოგებში არც ერთი ERROR. არსებული პოდები ერთმანეთს ესაუბრებოდნენ, DNS მუშაობდა, ingress — ასევე.

და მაინც რაღაც არ იყო რიგზე.

ტესტი, რომელმაც ეს დაიჭირა

CNI-ის ნებისმიერი ცვლილების შემდეგ ერთ კონკრეტულ შემოწმებას ვატარებ: ახალი პოდი ნოდ A-ზე, მეორე ნოდ B-ზე და ვზომავ, რამდენ ხანში გაივლის მათ შორის პირველი მოთხოვნა.

s=$(date +%s); until kubectl exec nt-src -- wget -qO- -T1 http://$IP:8080/ >/dev/null 2>&1; do :; done
echo "$(( $(date +%s)-s ))s"

ეს 15-დან 42 წამამდე გრძელდებოდა მას შემდეგ, რაც სამიზნე პოდი უკვე Ready იყო. განახლებამდე — 1–2 წამი. health-check-ები და smoke-ტესტები არსებულ პოდებზე გადიოდა: ძველი პოდების ენდპოინტები დიდი ხნის წინ იყო დაპროგრამებული. შეფერხებას მხოლოდ ახალი ენდპოინტი აჩენს.

ციკლი ERROR-ის გარეშე

ვორკერებზე Felix-ის ლოგებში იყო ხაზი, რომელიც თავიდან უგულებელვყავი, რადგან warning დონეზეა:

Applying XDP BPF actions did not succeed, will retry with resync... error=failed to remove XDP program from lo

ნოდების მიხედვით — ხუთ წუთში 250–470-ჯერ Debian 13-იან ყველა ვორკერზე და ნულჯერ მასტერებზე, სხვა ოს-ითა და ბირთვით. Calico-ს წინა ვერსიამ loopback-ზე xdpgeneric პროგრამა დატოვა, ახალი კი ამ ბირთვზე მის მოხსნას ვერ ახერხებდა. ყოველი წარუმატებელი მცდელობა dataplane-ის სრულ resync-ს აყენებდა რიგში. ახალი ენდპოინტები მხოლოდ resync-ებს შორის მოკლე პაუზებში პროგრამირდებოდა — და ყოველი ახალი პოდი ათეულობით წამს შავ ხვრელში ატარებდა.

რატომ იყო XDP-ის გამორთვა უსაფრთხო

Calico XDP-ს მხოლოდ untracked და prefilter პოლიტიკებისთვის იყენებს. ამ კლასტერში NetworkPolicy საერთოდ არ იყო, ამიტომ XDP სასარგებლოს არაფერს აკეთებდა, სამაგიეროდ აქტიურად აზიანებდა. შეკეთება — ერთი ხაზი:

kubectl patch felixconfiguration default --type=merge -p '{"spec":{"xdpEnabled":false}}'

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

გადაწყვეტილებას გადახედვის ტრიგერი აქვს: doNotTrack ან host-endpoint პოლიტიკების დანერგვამდე, რომლებსაც XDP სჭირდებათ, და Calico-ს შემდეგ minor-ზე, რომელიც DaemonSet-ს მაინც გარდაქმნის.

დასკვნები

  • „calico-node Ready, ERROR არ არის” ქსელის ჯანმრთელობა არ არის. Felix შეიძლება warning დონეზე ბეჯითად ვარდებოდეს.
  • CNI-ის ნებისმიერი ცვლილების შემდეგ შეამოწმე ახალი პოდი ↔ ახალი პოდი ნოდებს შორის, ტაიმერით. ხელახლა გამოყენებული პოდები ენდპოინტების პროგრამირების შეფერხებას სრულად მალავენ.
  • warning-ები ნოდების მიხედვით დათვალე. ციკლი, რომელიც მხოლოდ ერთ ოს-ზე ან ბირთვზეა, მიზეზზე ძლიერი მინიშნებაა.
  • გამოუყენებელი ფუნქციაც მომუშავე კოდია. თუ XDP არც ერთ პოლიტიკას არ ემსახურება, მისი გამორთვით გაუმართაობის კლასს უფასოდ აშორებ.