Kubernetes uchun operatorlar: davlat dasturlarini qanday ishga tushirish kerak

Kubernetesdagi statistik ilovalar bilan bog'liq muammo

Ilovalar va xizmatlarni sozlash, ishga tushirish va keyinchalik masshtablash fuqaroligi bo'lmagan deb tasniflangan holatlarga kelganda oson, ya'ni. ma'lumotlarni saqlamasdan. Kubernetes-da bunday xizmatlarni standart API-laridan foydalangan holda ishga tushirish qulay, chunki hamma narsa "qutidan tashqarida" sodir bo'ladi: standart konfiguratsiyalar bo'yicha, hech qanday o'ziga xoslik yoki sehrsiz.

Oddiy qilib aytganda, konteynerlar klasterida PHP/Ruby/Python-da backendning yana besh nusxasini ishga tushirish uchun siz atigi 5 marta yangi server o'rnatishingiz va manbalarni nusxalashingiz kerak. Rasmda manba kodi ham, init skripti ham bo'lgani uchun fuqaroligi bo'lmagan ilovani masshtablash butunlay oddiy holga aylanadi. Konteynerlar va mikroservis arxitekturasining muxlislari yaxshi bilishadi, qiyinchilik shundan boshlanadi davlat ilovalari, ya'ni. ma'lumotlar bazalari va keshlar (MySQL, PostgreSQL, Redis, ElasticSearch, Cassandra...) kabi ma'lumotlarning barqarorligi bilan. Bu kvorum klasterini mustaqil ravishda amalga oshiradigan dasturiy ta'minotga (masalan, Percona XtraDB va Cassandra) va alohida boshqaruv utilitlarini talab qiladigan dasturiy ta'minotga (masalan, Redis, MySQL, PostgreSQL...) taalluqlidir.

Qiyinchiliklar paydo bo'ladi, chunki manba kodi va xizmatni ishga tushirish endi etarli emas - siz yana bir necha qadamlarni bajarishingiz kerak. Hech bo'lmaganda ma'lumotlarni nusxalash va/yoki klasterga qo'shilish. Aniqrog'i, ushbu xizmatlar ma'lumotlarni yo'qotmasdan yoki vaqtinchalik mavjud bo'lmasdan qanday qilib to'g'ri o'lchash, yangilash va qayta sozlashni tushunishni talab qiladi. Ushbu ehtiyojlarni hisobga olish "operatsion bilim" deb ataladi.

CoreOS operatorlari

Operatsion bilimlarni "dasturlash" uchun o'tgan yilning oxirida CoreOS loyihasi tanishtirdi Kubernetes platformasi uchun "yangi dasturiy ta'minot sinfi" - Operatorlar (inglizcha "operatsiya", ya'ni "operatsiya" dan).

Kubernetesning asosiy imkoniyatlaridan foydalanadigan va kengaytiruvchi operatorlar (jumladan. Stateful Sets, quyidagi farqni ko'ring) DevOps mutaxassislariga dastur kodiga operatsion bilimlarni qo'shishga ruxsat bering.

Operatorning maqsadi — foydalanuvchiga Kubernetes klasteridagi bir nechta statistik dastur ob'ektlarini boshqarish imkonini beruvchi API bilan ta'minlang, bu kaput ostida nima borligi haqida o'ylamasdan (qanday ma'lumotlar va u bilan nima qilish kerak, klasterni saqlash uchun hali qanday buyruqlar bajarilishi kerak) ). Aslida, Operator klaster ichidagi dastur bilan ishlashni iloji boricha soddalashtirish, ilgari qo'lda hal qilinishi kerak bo'lgan operatsion vazifalarni bajarishni avtomatlashtirish uchun mo'ljallangan.

Operatorlar qanday ishlaydi

Replicasets Kubernetes ishlayotgan podkastlarning kerakli sonini belgilash imkonini beradi va kontrollerlar ularning soni saqlanishini ta'minlaydi (podkalarni yaratish va o'chirish orqali). Operator shunga o'xshash tarzda ishlaydi, standart Kubernetes resursiga va nazoratchiga operatsion bilimlar to'plamini qo'shib, kerakli miqdordagi ilova ob'ektlarini qo'llab-quvvatlash uchun qo'shimcha harakatlarni amalga oshirish imkonini beradi.

Bu qanday farq qiladi Stateful Sets, klasterdan ma'lumotlarni saqlash yoki statik IP kabi holatni ko'rsatadigan resurslar bilan ta'minlashni talab qiladigan ilovalar uchun mo'ljallanganmi? Bunday ilovalar uchun Operatorlar foydalanishi mumkin Stateful Sets (o'rniga Replicasets) asos sifatida, taklif qo'shimcha avtomatlashtirish: buzilish holatlarida kerakli harakatlarni bajarish, zaxira nusxalarini yaratish, konfiguratsiyani yangilash va h.k.

Va shunday qilib, bularning barchasi qanday ishlaydi? Operator boshqaruvchi demon bo'lib, u:

  1. Kubernetes-dagi voqea API-ga obuna bo'ladi;
  2. undan tizim haqidagi ma'lumotlarni oladi (uning Replicasets, Donali, xizmatlar va h.k.);
  3. haqida ma’lumotlarni oladi Uchinchi tomon manbalari (quyidagi misollarga qarang);
  4. tashqi ko'rinishga / o'zgarishlarga javob beradi Uchinchi tomon manbalari (masalan, o'lchamni o'zgartirish, versiyani o'zgartirish va hokazo);
  5. tizim holatidagi o'zgarishlarga munosabat bildiradi (u haqida Replicasets, Donali, xizmatlar va h.k.);
  6. eng asosiysi:
    1. Kubernetes API-ni unga kerak bo'lgan hamma narsani yaratish uchun chaqiradi (yana o'zining Replicasets, Donali, xizmatlar...),
    2. ba'zi sehrlarni amalga oshiradi (soddalashtirish uchun siz Operatorning o'zi podkastlarga kiradi va buyruqlarni chaqiradi deb o'ylashingiz mumkin, masalan, klasterga qo'shilish yoki versiyani yangilashda ma'lumotlar formatini yangilash).

Kubernetes uchun operatorlar: davlat dasturlarini qanday ishga tushirish kerak
Aslida, rasmdan ko'rinib turibdiki, Kubernetes-ga alohida dastur oddiygina qo'shiladi (muntazam Tarqatish с ReplicaSet), Operator deb ataladi. U oddiy podada yashaydi (odatda bitta) va, qoida tariqasida, faqat uning uchun javobgardir Ism maydoni. Ushbu operator ilovasi o'zining API-ni to'g'ridan-to'g'ri emas, balki orqali amalga oshiradi Uchinchi tomon manbalari Kubernetesda.

Shunday qilib, biz yaratganimizdan keyin Ism maydoni Operator, biz unga qo'shishimiz mumkin Uchinchi tomon manbalari.

etcd uchun misol (batafsil ma'lumot uchun pastga qarang):

apiVersion: etcd.coreos.com/v1beta1
kind: Cluster
metadata:
  name: example-etcd-cluster
spec:
  size: 3
  version: 3.1.0

Elasticsearch uchun misol:

apiVersion: enterprises.upmc.com/v1
kind: ElasticsearchCluster
metadata:
  name: example-es-cluster
spec:
  client-node-replicas: 3
  master-node-replicas: 2
  data-node-replicas: 3
  zones:
  - us-east-1c
  - us-east-1d
  - us-east-1e
  data-volume-size: 10Gi
  java-options: "-Xms1024m -Xmx1024m"
  snapshot:
    scheduler-enabled: true
    bucket-name: elasticsnapshots99
    cron-schedule: "@every 2m"
  storage:
    type: gp2
    storage-class-provisioner: kubernetes.io/aws-ebs

Operatorlarga qo'yiladigan talablar

CoreOS operatorlar ustida ishlashda muhandislar tomonidan olingan asosiy naqshlarni ishlab chiqdi. Barcha Operatorlar individual bo'lishiga qaramay (o'ziga xos xususiyatlar va ehtiyojlarga ega bo'lgan ma'lum bir dastur uchun yaratilgan), ularni yaratish quyidagi talablarni qo'yadigan o'ziga xos asosga asoslanishi kerak:

  1. O'rnatish bitta orqali amalga oshirilishi kerak Tarqatish: kubectl create -f SOME_OPERATOR_URL/deployment.yaml - va qo'shimcha harakatlarni talab qilmaydi.
  2. Kubernetes-da Operatorni o'rnatishda yangi uchinchi tomon turi yaratilishi kerak (ThirdPartyResource). Ilova namunalarini (klaster misollarini) ishga tushirish va ularni keyingi boshqarish (versiyalarni yangilash, o'lchamini o'zgartirish va h.k.) uchun foydalanuvchi ushbu turdan foydalanadi.
  3. Iloji bo'lsa, Kubernetes-ga o'rnatilgan primitivlardan foydalaning, masalan xizmatlar и Replicasetsyaxshi sinovdan o'tgan va tushunarli koddan foydalanish.
  4. Operatorlarning orqaga qarab muvofiqligini va foydalanuvchi tomonidan yaratilgan resurslarning eski versiyalarini qo'llab-quvvatlashni talab qiladi.
  5. Operator o'chirilgan bo'lsa, dasturning o'zi o'zgarishsiz ishlashda davom etishi kerak.
  6. Foydalanuvchilar dasturning kerakli versiyasini aniqlay olishi va dastur versiyasi yangilanishlarini boshqarishi kerak. Dasturiy ta'minot yangilanishlarining etishmasligi operatsion va xavfsizlik muammolarining keng tarqalgan manbaidir, shuning uchun Operatorlar foydalanuvchilarga bu masalada yordam berishlari kerak.
  7. Operatorlar Chaos Monkey kabi asbob bilan sinovdan o'tkazilishi kerak, u podalar, konfiguratsiyalar va tarmoqdagi mumkin bo'lgan nosozliklarni aniqlaydi.

etcd operatori

Operatorni amalga oshirish misoli - etcd operatori, tayyorlangan ushbu kontseptsiya e'lon qilingan kuni. etcd klaster konfiguratsiyasi kvorumni saqlash zarurati, klaster a'zoligini qayta sozlash, zaxira nusxalarini yaratish va hokazolar tufayli murakkab bo'lishi mumkin. Masalan, etcd klasterini qo‘lda masshtablash yangi klaster a’zosi uchun DNS nomini yaratish, yangi etcd ob’ektini ishga tushirish va klasterni yangi a’zo haqida ogohlantirish (etcdctl a'zosi qo'shing). Operatorga kelsak, foydalanuvchi faqat klaster hajmini o'zgartirishi kerak bo'ladi - qolgan hamma narsa avtomatik ravishda sodir bo'ladi.

Va etcd CoreOS-da yaratilganligi sababli, birinchi navbatda uning Operatorini ko'rish juda mantiqiy edi. U qanday ishlaydi? Operator mantig'i va boshqalar uchta komponent bilan belgilanadi:

  1. Kuzatib ko'ring. Operator Kubernetes API yordamida klaster holatini nazorat qiladi.
  2. Tahlil. Joriy holat va kerakli holat o'rtasidagi farqlarni topadi (foydalanuvchi konfiguratsiyasi bilan belgilanadi).
  3. Harakat. Aniqlangan farqlarni etcd va/yoki Kubernetes xizmat API-lari yordamida hal qiladi.

Kubernetes uchun operatorlar: davlat dasturlarini qanday ishga tushirish kerak

Ushbu mantiqni amalga oshirish uchun Operatorda funksiyalar tayyorlangan Yaratish/yo'q qilish (etcd klaster a'zolarini yaratish va o'chirish) va Kattalashtirish (klaster a'zolari sonining o'zgarishi). Uning ishlashining to'g'riligi Netflix-dan Chaos Monkey o'xshashligida yaratilgan yordamchi dastur yordamida tekshirildi, ya'ni. etcd podlarni tasodifiy o'ldirish.

etcd to'liq ishlashi uchun Operator qo'shimcha funktsiyalarni taqdim etadi: zaxira (foydalanuvchilarga avtomatik va ko'rinmas tarzda zaxira nusxalarini yaratish - konfiguratsiyada ularni qanchalik tez-tez qilish va qancha saqlash kerakligini aniqlash kifoya - va ulardan ma'lumotlarni keyinchalik tiklash) va Upgrade (to'xtab qolmasdan va hokazo o'rnatishlarni yangilash).

Operator bilan ishlash nimaga o'xshaydi?

$ kubectl create -f https://coreos.com/operators/etcd/latest/deployment.yaml
$ kubectl create -f https://coreos.com/operators/etcd/latest/example-etcd-cluster.yaml
$ kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
etcd-cluster-0000                1/1       Running   0          23s
etcd-cluster-0001                1/1       Running   0          16s
etcd-cluster-0002                1/1       Running   0          8s
etcd-cluster-backup-tool-rhygq   1/1       Running   0          18s

etcd operatorining joriy holati beta-versiya boʻlib, uning ishlashi uchun Kubernetes 1.5.3+ va etcd 3.0+ talab qilinadi. Manba kodi va hujjatlar (jumladan, foydalanish bo'yicha ko'rsatmalar) quyidagi manzilda mavjud GitHub.

CoreOS-dan yana bir misol ilovasi yaratildi - Prometey operatori, lekin u hali ham alfa versiyasida (barcha rejalashtirilgan funksiyalar amalga oshirilmagan).

Holati va istiqbollari

Kubernetes Operatorlari e'lon qilinganidan beri 5 oy o'tdi. Rasmiy CoreOS omborida hali ham ikkita dastur mavjud (etcd va Prometey uchun). Ikkalasi ham hali barqaror versiyalariga etib bormagan, ammo majburiyatlar har kuni kuzatiladi.

Ishlab chiquvchilar “foydalanuvchilar Postgres operatorlari, Cassandra operatorlari yoki Redis operatorlarini o‘zlarining Kubernetes klasterlariga o‘rnatadigan va ushbu ilovalarning kengaytiriladigan ob’ektlari bilan bugungi kunda fuqaroligi bo‘lmagan veb-ilovalarning nusxalarini o‘rnatish kabi osonlik bilan ishlaydigan kelajakni” nazarda tutadi. Birinchidan Uchinchi tomon dasturchilaridan operatorlar haqiqatan ham paydo bo'la boshladi:

2017 yil fevral oyida Bryusselda bo'lib o'tgan Yevropaning eng yirik bepul dasturiy ta'minot konferentsiyasi FOSDEMda CoreOS kompaniyasidan Josh Vud Operatorlarni e'lon qildi. hisobot (video havolada mavjud!), bu kengroq ochiq manbalar hamjamiyatida ushbu kontseptsiyaning mashhurligini oshirishga yordam berishi kerak.

PS Maqolaga qiziqishingiz uchun tashakkur! Bizning markazimizga obuna bo'ling, DevOps va GNU/Linux tizim ma'muriyati bo'yicha yangi materiallar va retseptlarni o'tkazib yubormaslik uchun - biz ularni muntazam ravishda nashr etamiz!

Manba: www.habr.com

a Izoh qo'shish