Argo CD აჩვენებდა Synced-ს, API სერვერმა კი ჩუმად გადააგდო ჩემი შესწორება
თვეობით არ იყო მეტრიკები, შესწორება უკვე git-ში იდო და სტატუსი მწვანე Synced იყო. ველი CRD-ის სქემაში არ არსებობდა, API სერვერმა მოჭრა და არავინ იჩივლა.
ჩემს სახლის ლაბორატორიაში პეტ-პროექტის აპლიკაციას თვეობით არც ერთი მეტრიკა არ ჰქონდა. Postgres იქ CloudNativePG-ზე მუშაობს, ოპერატორმა PodMonitor შექმნა, GitOps რეპოში კი დაკარგული სკრეიპის შესწორება უკვე იდო. Argo CD აჩვენებდა Synced / Healthy-ს სწორედ იმ კომიტზე, სადაც შესწორება იყო. ამასობაში რეპლიკის გაუმართაობა 23 საათი შეუმჩნეველი დარჩა — მას უბრალოდ არავინ უყურებდა.
ჯერ ბრმა ლაქის გაზომვა
სანამ რამეს შევეხებოდი, დავთვალე. Prometheus-ს 46 აქტიური target ჰქონდა და ამ namespace-ში არც ერთი. არა „მოსალოდნელზე ნაკლები“, არამედ ნული. ამ ციფრმა ბუნდოვანი შეგრძნება კონკრეტულ კითხვად აქცია: რატომ არავინ სკრეიპავს PodMonitor-ს, რომელიც აშკარად არსებობს?
ორი დეფექტი, თითოეული ცალკე უწყინარად გამოიყურება
ლეიბლების შეუსაბამობა. kube-prometheus-stack ჩარტის ნაგულისხმევი პარამეტრებით მხოლოდ იმ მონიტორებს ირჩევს, რომლებსაც მისი release ლეიბლი აქვთ. CNPG ოპერატორის მიერ შექმნილ PodMonitor-ს აქვს app.kubernetes.io/* და cnpg.io/cluster — და მეტი არაფერი. ობიექტი არსებობს, დათვალიერებისას დაფარვას ჰგავს, მაგრამ მას არც ერთი Prometheus არ კითხულობს. იმავე ნაგულისხმევმა ჩუმად გამოტოვა cert-manager-ის ServiceMonitor-იც.
ველი, რომელიც არ არსებობს. git-ში არსებული შესწორება ამის გადაჭრას CNPG-ის მხრიდან ცდილობდა — ლეიბლების დამატებას spec.monitoring.podMonitorMetadata.labels-ით. ეს ველი ჩემი CNPG ვერსიის CRD სქემაში არ არის. სტრუქტურული სქემების დროს API სერვერი apply-ზე უცნობ ველებს ჭრის. არც შეცდომა, არც გაფრთხილება Argo CD-ში. Argo-მ მოჭრილი ცოცხალი ობიექტი მოჭრილ სასურველ მდგომარეობას შეადარა, ტოლად მიიჩნია და Synced თქვა.
მთავარი ნაბიჯი იყო თავად CRD-ის კითხვა, არსებობს თუ არა ასეთი ველი:
kubectl get crd clusters.postgresql.cnpg.io -o json \
| jq -r '.spec.versions[0].schema.openAPIV3Schema.properties.spec.properties.monitoring.properties | keys[]'
podMonitorMetadata სიაში არ იყო. საქმე დახურულია.
შეაკეთე მომხმარებელი და არა ყველა მწარმოებელი
იმის ნაცვლად, რომ ყველა ოპერატორის მონიტორზე ლეიბლებს დავდევნებოდი, Prometheus შევცვალე: ჩარტში *SelectorNilUsesHelmValues ოფციები false-ზე დავაყენე, სელექტორები ცარიელი გახდა და Prometheus კლასტერის ყველა ServiceMonitor-სა და PodMonitor-ს იღებს. ერთმა ცვლილებამ შეაკეთა CNPG, cert-manager და ყველა მონიტორი, რომელსაც მომავალი ჩარტი შექმნის. სინქის შემდეგ მაშინვე გამოჩნდა cnpg_collector_up Postgres-ის ყველა პოდისთვის.
ruleSelector შეგნებულად მკაცრი დავტოვე. ზედმეტი შეგროვებული მეტრიკა უვნებელია, ზედმეტი ალერტი — ხმაური. ფასი: ყველა PrometheusRule-ს release ლეიბლი უნდა ჰქონდეს, თორემ არსად ჩაიტვირთება — იგივე ხაფანგი, ერთი ფენით ზემოთ, ამიტომ წესების დამატებისას ყოველთვის ვამოწმებ.
დაბრუნება მარტივია: ორი ხაზის წაშლა და Prometheus მკაცრ სელექტორს უბრუნდება მონაცემების დაკარგვის გარეშე.
დასკვნები
- მწვანე
Syncedნიშნავს „ის, რაც API სერვერმა შეინახა, git-ს ემთხვევა — შენახვის შემდეგ“. გზაში მოჭრილ ველებზე ის არაფერს ამბობს. - თუ GitOps ცვლილებამ არაფერზე იმოქმედა, ჯერ CRD-ის სქემას ჰკითხე, არსებობს თუ არა ველი, და მხოლოდ შემდეგ გამართე კონტროლერი.
- არსებული ობიექტი ჯერ კიდევ არ არის დაფარვა. დათვალე აქტიური target-ები.
- სჯობს ერთხელ შეასწორო სელექტორი მომხმარებლის მხარეს, ვიდრე სამუდამოდ ყველა მწარმოებელს გადაუკიდო ლეიბლები.