Kubernetesning eng yaxshi amaliyotlari

Men sobiq Googler SRE bilan suhbatlashdim, u Kubernetes juda tez (valyutani ushlab turish uchun juda tez) rivojlanayotganini, (ko'p) yangi tushunchalarni ishlatishini va bir xil muammoni hal qilishning (juda ko'p) usullari borligini ta'kidladi.

Buning aksariyati haqiqatdir va yomon narsa emas yoki har qanday boshqa texnologiyalardan farq qilmaydi. Men rozi bo'lmasam, bu omillar uning Kubernetesni qabul qilishiga xalaqit bergan. Sizni sho'ng'ishga taklif qilaman. Kubernetes - bu (mantiqiy) tashvishlarga qaramay muvaffaqiyat - bu juda yaxshi, chunki.

Ushbu lavozimda men sizga eng oddiy odatiy tajribalarni beraman, umid qilamanki, sizga ushbu texnologiyani konteyner orqali olib kirib, sho'ng'ishga kirishingiz yordam beradi.

Hech qanday tartibda:

  1. Boshqa birov mehnat qilsin!

Kubernetes Engine kabi Kubernetes xizmatidan foydalaning. Agar siz intellektual qiziquvchan bo'lmasangiz, Kubernetes-da ishlaydigan ishlab chiquvchi yoki siz Kubernetes xizmatidan foydalanishni so'rab buyurtmachilarga ega bo'lgan platforma provayderisiz, muammodan xalos bo'ling va Kubernetes xizmatidan foydalaning. O'zingizning uyingizni va mashinangizni qurdingizmi? Yoki siz Bo'ri portlashi va sizni A-B-dan ishonchli olib ketadigan joyda uxlashni yoqtirasizmi?

Shunday qilib, agar siz mening boshqa xabarlarimni o'qigan bo'lsangiz, men Mintaqaviy Klasterlarni baholashni tavsiya qilaman va shuning uchun siz quyidagi qatorlarga qarab ko'rishingiz mumkin:

gcloud beta konteyner klasterlari $ {CLUSTER} yaratadi ...
gcloud beta konteyner klasterlari get-credentials $ {CLUSTER} ...

Va keyin, siz quyidagilar bilan borishga tayyormiz:

kubectl qo'llaniladi --filename = marvels.yaml

2. "Kubernetes" haqida o'ylashga harakat qiling

Bu * boshqa platformalarga qaraganda Kubernetes Engine-da qiyinroq bo'lishi mumkin, ammo Google Cloud Platformasida siz Kubernetes (masalan, tugunlar, bosqinlar) va shu bilan bir qatorda sizning resurslaringiz ahvoli to'g'risida tushunchani saqlashga majbur bo'lasiz. , Compute Engine'dagi asosiy manbalar (masalan, VMs, HTTP / S Load Balansers). Bu zarracha-to'lqinli ikkitomonlama muammosi afsuski. Menga bu haqda birinchi marta aytgani uchun Deyl H.ga rahmat.

Iloji bo'lsa, Kubernetesning manbalari haqida o'ylashga harakat qiling va GCEning asosiy manbalarini e'tiborsiz qoldiring. Mening ishimni Kubernetesga xiyonat qilganimga bir yildan ko'proq vaqt sarflaganimdan so'ng, "Xizmatlar" (va "Ingresiyalar") tomonidan namoyish qilingan "ba'zi sonlar" nuqtai nazaridan aniq fikr yuritish osonlashdi.

3. Ismlar maydoni, Ismlar maydoni, Ism maydonlari

Yangilash: Maykl Xausenblasga Kubernetes YAML fayllari ichidagi nomlarni bo'shatish haqida * emas * murojaat qilishning eng yaxshi usulini o'rgatganim uchun. Siz har doim ism maydonlaridan foydalanishingiz kerak, lekin faylni qo'llashda ularni aniqlab olish, ko'proq moslashuvchanlikni va bir xil YAML fayllarni, masalan, qarshi ishlatishni ta'minlaydi. turli landshaftlar. Mayklning maqolasini mana bu erda ko'ring.

Mayk Altarace va men oylar davomida Kubernetesdagi nomlar maydoni va ularni qaerda ishlatishingiz kerakligi haqida bloglar o'tkazdik. O'shandan beri men o'zimning maslahatlarimga beparvo munosabatda bo'ldim, chunki mening foydalanish holatlarim shunchalik kichik ediki, Namespaces-dan foydalanish bekor qilinadi. Men nohaq edim. Doim ism maydonlaridan foydalaning.

Konteyner ishlov berishda, Ismlar maydoni - Kubernetes loyihalariga tegishli. Ismlar kosmik o'rnatadigan xavfsizlik chegarasidan tashqari, ular sizning ishingizni qismlarga ajratishning eng yaxshi usuli va uni qayta tiklash yoki o'chirishning ajoyib usulini topishadi:

kubectl / bo'sh joyni o'chirish / $ WORKING_PROJECT

Yagona salbiy tomoni shundaki, odatiy bo'lmagan nomlar maydonidan foydalanganda, siz ishlaydigan ismlar maydonini --namespace = $ WORKING_PROJECT ni kubectl buyruqlarida ko'rsatishingiz kerak, bu mening fikrimcha yaxshi himoya amaliyoti bo'lishi mumkin. Biroq, siz har doim - hamma-ismlar bo'sh joylarini yoki odatiy (havola) sifatida boshqa nomlar maydonini o'rnatishingiz mumkin.

4. Muammoni hal qilishning juda ko'p usullari

Bu tashvishli tashvish. Menimcha, bu noto'g'ri, lekin yaxshi rahbarlik va eng yaxshi tajribalarsiz, bitta muammoni hal qilish uchun juda ko'p o'xshash usullar mavjuddir. Men foydalanadigan odatiy odatim bor, bu erda muhokama qilishni rag'batlantirish uchun qisqacha bayon qilaman:

  • YAML fayllari - bu sovuq saqlashdagi bilim (5-sonli qarang).
  • Sizning konteynerlaringiz bitta narsani yaxshi bajarishlari kerak ("bezovtalik" ga qarang)
  • Har doim Deploymentlarni joylashtiring (№6 ga qarang)
  • Agar siz L7 aka HTTP / S yuklarni balanslashdan foydalanishni xohlasangiz (№ 7 ga qarang!)
  • Maxfiylik ma'lumotlarini sirlardan foydalangan holda ishonchli boshqaring (link)

5. Kubectl ga nisbatan noaniqliklar qo'llaniladi - fayl nomlari alternativlarga nisbatan qo'llaniladi

/ $ {WORKING_DIR} nomini yaratadigan kubectl yordamida tez urish juda oson, ammo bir nechta bunday buyruqlardan so'ng, siz hozirgi holatga qanday erishganligingiz va eng muhimi, bu holatni qanday tiklash haqida savol tug'ilishi mumkin. Ekvivalent kub ectl yaratish buyrug'iga emas, balki sizning manbalaringizni tavsiflash uchun YAML fayllarini yaratishingizni maslahat beraman.

Sizni mukammal, aniq va navigatsiyalash oson bo'lgan (ehtimol mukammal hujjatlar !?) * mukammal * Kubernetes API hujjatlari (havolasi, havolasi va 1.10) bilan tanishishingizni maslahat beraman. Ammo, ushbu kuchli vosita bilan ham, ba'zan siz uchun ishlaydigan kubectl buyrug'ini olib, uni YAML-ga aylantirish biroz qiyinlashadi. Emas:

kubectl olish / $ {MY_DEPLOYMENT} --output = yaml
kubectl get service / $ {MY_SERVICE} - chiqish usuli = yaml
kubectl biror narsa olish / $ {MY_ANYTHING} - chiqim = yaml

Agar xohlasangiz, natijalarni faylga yuboring, ammo ularni ekvivalent (!) YAML fayl uchun asos sifatida ishlating. Siz har qanday misol havolalarini tashlashingiz kerak.

Siz masterpiece.yaml dasturini yaratganingizdan so'ng, har doim boshlang'ich yaratishga murojaat qilishingiz, keyingi yangilanishlarni amalga oshirish uchun murojaat qilishingiz va agar kerak bo'lsa, o'chirishingiz kerak. Bo'ldi shu!

kubectl qo'llaniladi --filename = masterpiece.yaml
kubectl o'chirish --filename = masterpiece.yaml

Kam tushuncha: tarqatish uchun siz YAML fayllarini mahalliy ravishda tortishingiz shart emas. Siz kubectl apply --fenename adresini URL manzillari bilan ta'minlashingiz mumkin va har qanday bog'liq fayllar mahalliy havolalar mavjud bo'lganda, tarqatish ishlaydi.

Kichik tushuncha: men buni ishlatadigan yagona joy Kubernetesda joylashgan, ammo bu qonuniy amaliyot, siz bir nechta YAML fayllarini bitta YAML fayliga --- va ... fayl ajratgichlari bilan birlashtirishingiz mumkin. Shunday qilib, YAML nomlash maydoni, YAML tarqatish va YAML xizmati o'rniga sizda barcha uchta fayllarni birlashtirgan mega-YAML bo'lishi mumkin.

Bu haqiqiy YAML (uni nusxa oling va masalan YAML Lint-ga qo'ying). Bu * bekor * Kubernetes spec | YAML, chunki har bir spetsifikator to'liq emas, lekin agar har biri tugallangan bo'lsa, bu juda yaxshi YAML va manbalarni bog'lashning yaxshi usuli.

Bitta tanqid uchun #B (Xsonnet) ga qarang.

6. Deploymentlardan foydalaning

Joylashtirishda juda ko'p kuch bor, men aytishga kifoya qilaman: har safar har safar Deploymentdan foydalaning. Siz birinchi podnginxni o'rnatganingizda ham. Joylashtirishlar - bu "Koinot" narxiga "Birinchi darajali" sayohat, siz bo'sh joylarga tushib ketishingiz mumkin, siz xatoga yo'l qo'yasiz, qayta murojaat qilasiz va Kubernetes yaramas podlarni o'ldirish va ularni o'zlarini yaxshi tutganlari bilan almashtirish haqida g'amxo'rlik qiladi.

7. LoadBalancer va Ingress

Bular chalkashlikka olib keladi. Mening xizmatimda (va men yanglishgan bo'lishim mumkin), --type = LoadBalancer-dan foydalanib Xizmatlar yaratganimda, | Network LB-ga ega bo'lishni xohlayman. Agar men HTTP / S (7-daraja) yukni balanslashni xohlasam, men Ingressni yaratishim kerak. Ingress - bu Kubernetesning chalkash manbasi. L7 == Ingress (va natijada ko'p konfiguratsiya kuchi) deyish kifoya.

Kubernetes Motor Gress HTTP / S Load Balansers sifatida Ingress manbalarini namoyish etadi. Kristofer Grant o'z lavozimlarida (bu erda va bu erda) Ingressni buzuvchi juda yaxshi ish qiladi.

8. NodePortlar

Men to'g'ridan-to'g'ri Klasterni yaratmadim (hech qachon?). Men Kubernetes bilan bir qator ishlar qildim, natijada xizmatlar ClusterIPlar tomonidan ochildi. Ko'pincha (!) Men NodePortlarni yaratdim yoki NodePorts-dan foydalanadigan narsalarni (masalan, Ingress resurslarini yarataman) qilaman.

NodePorts Kubernetes tugunlari bilan bog'langan va ular portlardir. Ular taqdim etadigan kuchli vosita shundan iboratki, klasterdagi har bir tugun (yoki bu NodePool? ([TODO]]) bitta xizmatni bitta (tugun) portga joylashtiradi.

Agar men NodePort X-da ochiladigan xizmatni yaratsam, agar klasterdagi * any * tugunidagi portga kirsam, xizmatdan foydalana olishimga ishonchim komil. Bu Kubernetesning yuklarni muvozanatlash qobiliyatining asosini tashkil etadi, chunki klaster kirish so'rovlarini istalgan tugunga ushbu portga yo'naltirishga qodir.

Google Cloud SDK (aka gcloud) ssh-mijozni o'z ichiga oladi, bu esa Compute Engine VM-lariga ulanishning ahamiyatsizligini ta'minlaydi (esingizda bo'lsa Kubernetes klaster tugunlari). ssh mijoziga port-ekspeditorlik qobiliyati kiradi. Shunday qilib, agar biz Kubernetes xizmatiga ulanishni istasak va ushbu xizmatning NodePort-ni qidirib topsak, unda ushbu xizmatga (!) Port-yo'naltirish orqali (gcloud yoki biron-bir ssh-mijoz yordamida) biron-bir portga yo'naltirishimiz mumkin. Tugun.

Quyidagi misol klasterdagi 0-chi tugunni ushlash uchun kubectl-dan foydalanadi. Kubernetes Dvigatel tugunining nomi Compute Engine VM nomi bilan bir xil. $ {MY_NAMESPACE} nomli bo'shliqda $ {MY_SERVICE} deb nomlangan xizmat berilgan bo'lsa, biz NodePort xizmatini aniqlaymiz. Keyin, gcloud-ga o'tamiz va uning ichiga o'rnatilgan ssh-ni portni oldinga yo'naltirish uchun ishlatamiz (--ssh-flag = "- L XXXX: localhost: XXXX).

NODE_HOST = $ (\
  kubectl tugunlarni olish \
  --output = jsonpath = "{. items [0] .metadata.name}")
NODE_PORT = $ (\
  kubectl xizmatlar / $ {MY_SERVICE} \
  --namespace = $ {MY_NAMESPACE} \
  --output = jsonpath = "{. spetsport [0] .nodePort}")
echo $ {NODE_PORT}
gcloud hisoblash ssh $ {NODE_HOST} \
--ssh-flag = "- L $ {NODE_PORT}: localhost: $ {NODE_PORT}" \
- loyiha = $ {YOUR_PROJECT}

Bu nima kuchli? Endi siz xizmatga xuddi mahalliy bo'lib, va xavfsizlik devorida teshiklarni teshmasdan kerak bo'lganda kirishingiz mumkin.

NodePorts - bu yuqori raqamlangan portlar (~ 30,000–32,767).

9. Kubectl-ni buzish JSON-dan foydalaning

Google-ning Cloud SDK (aka gcloud) juda yaxshi, ammo kubectl (Kubernetes CLI) yaxshiroq (sic). Bitta kuchli xususiyat bu chiqishni formatlash va filtrlashdir. Bu Kubernetes klasterlari ma'lumotlari bilan skriptlar va boshqa vositalarni kengaytiradigan (kodlanmagan) usullarni ishlatishga imkon beradi.

Kubernetes resurslarining barcha holatiga, masalan, kirish orqali kirish mumkin. kubectl get (mening tajribamda bu maqsadda kubectl tasvirlashdan ko'ra foydali) buyruqlar. Keyin, JSON ning pichan bo'lishi mumkin bo'lgan narsadan ignani topish kerak.

Hiyla quyidagicha:

kubectl get [resource] / [resource-name] --output = JSON

Keyin so'rovlar qatorini yaratishni boshlash uchun natijalarni ko'rib chiqing:

kubectl get [resource] / [resource-name] --output = jsonpath = ". items [*]"

va o'zingiz xohlagan narsa (lar) ga ega bo'lmaguningizcha, natijani tezroq aniqlang. Mana har qanday klaster bilan ishlash kerak bo'lgan misol:

kubectl get tugunlari --output = json
kubectl tugunlarni olish --output = jsonpath = "{. items [*]}
kubectl tugunlarni olish --output = jsonpath = "{. items [0]}
kubectl tugunlarni olish --output = jsonpath = "{. items [0] .metadata.name}

Va nihoyat, bitta JSON tahlil qilish vositasini o'rganish va ushbu vositani barcha JSON tahlil qilinadigan ehtiyojlari uchun qo'llash uchun (va nix ichida o'nta) munosib dalillar mavjud. Bunday holda, jq-ga munosib raqib bormi? Men shubhalanmayman.

Plus jq mukammal o'yin maydonchasiga ega (jqplay.org).

A. Yorliqlardan foydalaning

Uzoq vaqtdan beri kelmoqda, ammo dasturiy ta'minotning barcha turlari hozirda resurslarni o'zboshimchalik bilan markalash tushunchasini qo'llab-quvvatlamoqdalar (odatda kalit-qiymat juftlari). Buning kuchli sababi shundaki, ushbu meta-ma'lumotlar manbalarni so'rash uchun mutlaqo foydalanuvchi tomonidan aniqlangan usulni taqdim etadi. Kubernetes ushbu printsipdan tabiiy ravishda foydalanadi; bu ichki qobiliyat va o'ylangan emas | bolt-on.

Kubernetes xizmati o'zboshimchalik bilan Kubernetes Podlarining sonini ochib beradi. Xizmatlar "Genri" deb nomlangan yoki ReplicaSet-ni o'z ichiga olgan Podlarni ochmaydi. Buning o'rniga, xizmat yorliqlari Xizmatni spetsifikatsiya qilish paytida belgilangan mezonlarga javob beradigan Pods-larni ochadi va bu belgilar, albatta, foydalanuvchi tomonidan belgilanadi.

Yuqoridagi misolda biz pro-x deb nomlangan bo'sh joyni ishlatmoqdamiz va ushbu nom bo'sh joy spektri Nomlar bo'shlig'ida (u yaratilganda), Joylashgan joyni va xizmatda joylashganligini aniqlash uchun joylashtirishda paydo bo'ladi. Deployment (bu mikservice-y deb nomlanadi) ReplicaSet (bu erda aniq ko'rsatilmagan; Deploymentlar yaratadigan narsa) 100 ta Pod-larni ushlab turishga imkon beradi. Har bir Pod-da yorliqli ilova mavjud: publicname-a va image-grpc-proxy deb nomlangan rasmga asoslangan grpc-proxy deb nomlangan bitta konteyner mavjud. Xizmat service-p deb nomlanadi. Eng muhimi, Xizmat (!) Faqat yorliqli ilovaga ega bo'lgan (!) Prokladkalarni tanlaydi: publicname-a. Xizmat faqat ushbu joylashuvda yaratilgan Pods emas, balki ushbu yorliq (kalit: qiymat) juftligiga ega bo'lgan har qanday Pod-ni (pro-x nomlari maydonida) tanlaydi. Xizmat Pods-larni ularning nomi (joylashtiruvchi nomiga asoslangan), konteyner nomi yoki konteyner tasvirining nomi bilan bog'lamaydi, faqat pod bilan bog'liq yorliqlar.

NB Bu yaxshi amaliyot emas, lekin bu fikrni tasdiqlaydi. Agar siz yuqoridagi kabi konfiguratsiyani ishlatib, keyin alohida-alohida yaratmoqchi bo'lsangiz. Nginx-ni ishlaydigan Pod (proekt-x nomlari maydonida) va keyin siz yorliq ilova dasturini qo'shdingiz: publicname-a, u tez orada service-p xizmati tomonidan birlashtirilgan Pods to'plamiga kiritiladi. Agar siz Xizmat tomonidan biriktirilgan har qanday Pod-dan yorliqni olib tashlasangiz, Pod-ga kirish to'xtatiladi.

Ushbu xususiyat, yangi versiyalarni tarqatish orqali yaqqol ko'riladi, bunda Joylashtirish "X" versiyasi uchun yangi podkalarni o'z ichiga olgan yangi ReplicaSet-ni yaratadi, bu X versiya uchun ReplicaSet va Pods-dan farq qiladi. Xizmat ushbu ikki versiyada ishlaydigan Podlarning kesishishini fosh qilish uchun aniqlanishi mumkin. ReplicaSets yoki alohida Podlar nuqtai nazaridan aniqlanmagan, lekin Pods yaratilganda siz tomonidan qo'llaniladigan foydalanuvchi belgilari ("tanlovchilar") tomonidan belgilanmagan.

Bu juda kuchli!

B. Jsonnet-dan, ehtimol Ksonnet-dan foydalaning

Barcha (!?) Strukturali formatlar (YAML, JSON, XML, CSV ;-) bilan ikkita qiyinchilik o'z-o'zidan ma'lumotlarga va o'zgaruvchilarga tegishli. Kubernetesni joylashtirish uchun marvellous.yaml texnik xususiyatlarini ishlab chiqishda siz ushbu muammoga osongina duch kelasiz. O'zingizning harflaringizni (masalan, rasm nomlari va sindirmalar uchun) va hatto hurmatli Deploymentlar bilan, takrorlanadigan nomlar va tanlovchilar yordamida ham topishingiz mumkin.

Agar siz o'zingizni YAML va JSON bilan cheklab qo'ysangiz, ushbu masalalarni hal qilib bo'lmaydi. Google ushbu muammolarni hal qilish uchun qisman Jsonnet-ni yaratdi. Aqlli Heptio millati Jsonnet-ni Kubernetesga ... Ksonnet bilan kengaytirdi.

Ikkalasi ham yuqorida aytib o'tilgan muammolarni hal qiladigan andozali tillardir (va yana ko'p narsalar). Jsonnetni ko'rib chiqishingizni maslahat beraman. Jq-dan foydalanishni ko'rib chiqishni tavsiya qilganim kabi, Jsonnet-ni bir marta o'rganing va uni JSON-dan foydalanadigan hamma joyda qo'llang. Ksonnet Kubernetesga xos bo'lib, cheklangan (!) Tajribamda men ushbu o'ziga xoslikdan olgan foydalarni o'rganish-egri chizig'idan ustun qo'ymaslik uchun topdim.

C. YAML yoki JSON

Kubernetes YAML va JSONga asosan bir xil munosabatda bo'ladi. Shaxsan men YAML-ni konfiguratsiya fayllari uchun afzalroq deb hisoblayman - murojaat qiling, chunki YAML JSON-ga qaraganda aniqroq. Garchi men YAMLni yozishni qiyinlashtirsam ham.

Ammo, tuzilishni tahlil qilish va tahlil qilish haqida gap ketganda, men --output = JSON ni afzal ko'raman, chunki - chiqish = JSONPATH. Men ulkan Golang muxlisiman, lekin Go shablonlari unchalik sezgir emas va men ulardan foydalanmayman.

ahamiyatsiz tushuncha: YAML - bu JSON (havola) ning ustun to'plami ... kuting! nima?

D. Downward Dog API va konfiguratsiya

Haqiqatan ham chalkashtirib nom berishiga qaramay, uni to'g'ri berish uchun "Downward API" bu Kubernetesdagi inshoot bo'lib, u orqali Podlar atrofdagi klasterni his qila oladilar. O'ylaymanki, normal oqim tashqi dunyodan Podga va uning konteynerlariga kiradi *, ammo * vaqti-vaqti bilan konteyner (!) Atrof-muhit to'g'risida ma'lumot olish uchun foydalidir, masalan. uning tugun nomi | IP, Podning nomi (bo'sh joy) | IP.

Downward API qiymatlari konteynerga atrof-muhit o'zgaruvchilari orqali taqdim etiladi. Atrof muhit o'zgaruvchilari (boshqa joylarda) konteynerga konfiguratsiya yoki boshqa holatni ta'minlash uchun ishlatiladi. Atrof-muhit o'zgaruvchisidan foydalanish va Downward API-ning (ahamiyatsiz ogohlantirish bilan) amalga oshirilishining juda yaxshi natijasi shundaki, idish Kubernetesdan uzilib qolgan.

Mana mening do'stim - Sal Rashid - Node va Pod holatini to'plash va foydalanuvchiga taqdim etish uchun Downward API-dan foydalanadigan misol:

https://github.com/salrashid123/istio_helloworld/blob/master/all-istio.yaml

Eslatma 76, 80, 84, 88-satrlardan boshlangan bo'limlarga qarang, bu erda podapp, ism maydoni, IP va tugun nomi Downward API tomonidan myapp-konteyner deb nomlangan konteynerga taqdim etiladi.

Downward API bu ma'lumotni konteyner uchun to'plashning yagona, amaliy usuli. Shunday qilib, bu "eng yaxshi amaliyot" dan ko'ra ko'proq "faqat amaliyot".

Ko'pgina postlarimda, Kubernetes uchun echimlarni ishlab chiqishda, men jarayonni idishni ichida va tashqarisida, keyin konteynerda (muhit o'zgaruvchilarini ko'rsatgan holda), so'ng Kubernetes klasterida sinab ko'raman. Konteynerli mexanizmlar izchil (pastga qarang), garchi bittasi odatda Dokerda, boshqasi Kubernetesda bo'lsa.

Yaqinda Google-ning konteyner-optimallashtirilgan OS-da yozgan maqolamda Docker ostida, masofadan turib konteyner-optimallashtirilgan OT ostida va keyin Kubernetes-da joylashgan idishni namoyish qilaman.

Mana mahalliy Docker ostida ishlaydi. Gcr.io/${PROJECT}/datastore-ga konfiguratsiyani ta'minlash uchun atrof-muhit o'zgaruvchilari (--env) qanday foydalanilganiga e'tibor bering.

docker ishga tushdi \
- interaktiv \
--tty \
--publish = 127.0.0.1: 8080: 8080 \
--env = GCLOUD_DATASET_ID = $ {PROJECT} \
--env = GOOGLE_APPLICATION_CREDENTIALS = / tmp / $ {ROBOT} .key.json \
--volume = $ PWD / $ {ROBOT} .key.json: / tmp / $ {ROBOT} .key.json \
gcr.io/${PROJECT}/dastastore

Mana, konteyner-optimallashtirilgan VM-ni yaratishda qo'llash bilan bir xil natija. Bu safar konteyner-env bayrog'ida berilgan qiymatlarni tekshiring:

$ {INSTANCE} bilan konteyner yaratadigan gcloud beta-nusxalari
- zona = $ {ZONE} \
--image-family = kos-barqaror \
--image-project = cos-cloud \
--container-image=gcr.io/${PROJECT}/${IMAGE}@${DIGEST} \
--container-restart-policy = doim \
- konteyner-env = \
GCLOUD_DATASET_ID = $ {PROJECT}, \
GOOGLE_APPLICATION_CREDENTIALS = / tmp / $ {ROBOT} .key.json \
--container-mount-host-path = \
mount-path = / tmp, \
xost-yo'l = / tmp, \
rejim = rw \
- loyiha = $ {PROJECT}

Va nihoyat, Kubernetes uchun joylashtirishning YAML parchasi:

konteynerlar:
      - ism: ma'lumotlar ombori
        rasm: gcr.io/${PROJECT}/datastore
        imagePullPolicy: Har doim
        ovoz hajmi:
          - ism: ma'lumotlar ombori
            mountPath: / var / sirlar / google
        env:
        - nomi: GOOGLE_APPLICATION_CREDENTIALS
          qiymati: /var/secrets/google/datastore.key.json
        - nomi: GCLOUD_DATASET_ID
          qiymati: $ {PROJECT}
        portlar:
        - ism: http
          konteynerPort: 8080

Shunday qilib, men konfiguratsiya uchun atrof-muhit o'zgaruvchisidan foydalanishni qo'polroq deb bilaman. Atrof muhitning o'zgaruvchan parametrlarini muayyan jarayonlarga qasddan bog'lab qo'yish mumkin emas va ular buzilganida ular to'g'ri sozlanmaganligini tushunasiz. Atrof-muhit o'zgaruvchilarini konteynersiz muhitda ziddiyatli bo'lishini tasavvur qilish oson, garchi bu idishlarga nisbatan kamroq muammo bo'lsa, yuqorida aytilganidek, biz aniq konteyner uchun qiymatlarni aniq belgilab olamiz.

Bularning barchasi atrof-muhit parametrlarini shu tarzda ishlatish eng yaxshi amaliyotdir.

E. Sidecars va nima uchun Podlar har doim idishlar bilan sinonim emas

5 cl konyak
2 cl uch soniya
2 cl limon sharbati
Tayyorlash Barcha ingredientlarni muz bilan to'ldirilgan kokteyl shakeriga quying. Yaxshilab silkiting va kokteyl stakaniga torting.

Ko'pincha siz bitta konteynerni o'z ichiga olgan Kubernetes podkalarini yaratasiz va sizda bitta konteyner kerak bo'lganda Podning barcha ustki qismi nima uchun borligiga hayron bo'lasiz. Podlar ko'plab idishlarni ishlata oladigan mezbon muhitga o'xshashdir. Bir nechta konteynerni Pod-da ishlatish haqida ko'p marta o'ylab ko'rishingiz mumkin ...

... va faqat bir martagina :-)

Ehtimol, bittadan ko'p bo'lishi mumkin, ammo keling, bittagina yo'l tutaylik.

Anti-naqsh (buni qilmang) sizning joriy konfiguratsiyangizni (veb-server va ma'lumotlar bazasi zaxirasini olaylik) va ikkalasini ham Pod-ga siqib chiqarishni nazarda tutadi. Har bir veb-server namunasi ajralmas holda va abadiy ma'lum bir ma'lumotlar bazasi instansiyasida birlashtirilmasa, bu * yaxshi emas *. Bu dargumon.

Eng asosiysi, sizning veb-serveringiz namunalari umumiy yig'indisiga qarab miqyosda bo'lishi kerak va ma'lumotlar bazangizning instansiyalari ularning oldingi yuklarni boshqarish qobiliyatiga asoslanib miqyoslashi kerak. Agar siz agregat, xizmat deb o'ylasangiz va Service deb o'ylasangiz, iltimos o'zboshimchalik bilan "Pod" larni taqdim etishga harakat qiling (chunki bu sizning hisobingiz uchun juda muhim, ammo boshqa maqsadlar uchun qancha Pods kerak bo'lishi muhim emas. raqam ish yukiga xizmat qilish uchun to'g'ri).

Har Pod uchun bir nechta idishni qachon ko'rib chiqishingiz kerak? Bir vaqtning o'zida bu har doim * kontekstdagi asosiy Podning harakatlarini to'ldirish, kengaytirish yoki boyitish istagi paydo bo'lganda. Yuqoridagi veb-server va ma'lumotlar bazasi misoliga qaytaylik. Ushbu stsenariyda, umid qilamanki, endi ikkita xizmatni (va ikkita Deploymentni), bittasini orqa va ikkinchisini ishlatishga ishonasiz.

O'zingizning veb-serveringiz misolida teskari proksi bilan murojaat qilish odatiy holdir. Odatda bu Nginx yoki HAProxy bo'lishi mumkin va Envoy-dan foydalanish odatiy holga aylanib bormoqda (agar men ishonchli vakillarga qarasangiz, Elchini ko'rib chiqishni maslahat beraman; #F Istio ga qarang). Reverse proksi, hatto siz turli xil veb-serverlardan (masalan, Apache, Tomcat w / Java va hk) foydalangan bo'lsangiz ham, hatto HTTP, gRPC, Web Sockets va boshqalar trafikka ega bo'lsangiz ham (biz faqat masalan, Envoydan foydalanamiz) barqarorlikni ta'minlaydi. Agar siz veb-serveringizga ba'zi trafikni va ba'zi bir trafikni keshga yo'naltirishni xohlasangiz ham (masalan, Varnish).

Oldingi barcha stsenariylarda "sidecar" modelidan foydalanish maqsadga muvofiq bo'lar edi. Ushbu modelda birlamchi konteynerda (sizning veb-serveringizda) qo'shimcha va qo'shimcha idishlar mavjud (Envoy proksi, Varnish keshi va boshqalar). Bular aniq va * funktsional ravishda veb-server instansiyasi bilan mahkam bog'langan bo'lishi kerak, kombinatsiya "birlik" dir.

Yonma-yon joylashtirilgan, kesish, kuzatuv va boshqa infratuzilma tarkibiy qismlarini ko'rish juda keng tarqalgan. Bu erda turtki tashvishlarni ajratishdir. Dasturchilarga "boshqariladigan" kodni ishlab chiqaradigan va SRE-ga parol ichidagi barcha kodlar jurnalga kirishi, o'lchovlar chiqarishi, kuzatib borilishi va avtoulovning izchil qo'llanilishi va hokazo. bu xizmat ko'rsatish poydevorini tashkil qiladi (qarang #F Istio). Bu yaqinda paydo bo'lgan amaliyot bilan yakunlangan eng yaxshi narsa.

F. Istiodan foydalaning

Istiodan ehtiyotkorlik bilan foydalaning.

Istio (va boshqa servislar tarmog'i) bu nisbatan yangi paydo bo'lgan texnologiyalar bo'lib, ular katta miqyosda konteynerlarga ega bo'lgan kompaniyalar (shu jumladan Google) tomonidan yaratilgan. Har bir Podga har bir klasterdagi har bir joylashuvda har bir joylashuvda universal (Istio holatida, Elchi) proksi osongina joylashtiriladi.

Natijada menejmentni bo'shashmasdan birlashtirishga imkon beradigan izchil boshqaruv substrati (biz bugun Stackdriver Trace-dan foydalanamiz, lekin Jaeger-ga ko'chib o'tishni rejalashtirmoqdamiz, biz Prometheus monitoringini o'tkazdik) va nazorat qilish xizmatlari (barcha xizmatlarimiz xavfsizligini bilamiz, trafikning 10% A, B va C xizmatlarining kanareyka qurilishiga yo'naltirilmoqda).

Men "ehtiyotkorlik bilan" maslahat beraman, chunki bu texnologiyalar yangi, qo'pol qirralarga ega va tezkor klipda rivojlanmoqda. Ammo, metodologiyaning afzalliklari (moslashuvchanlik, chaqqonlik, kelajakka ishonchlilik) sizga xarajatlardan ancha ustun turadi. Eng muhimi, service-mesh-ni o'zingizning modelingiz sifatida Kubernetes-dan foydalaning, hattoki servis-mesh texnologiyalaridan birini qabul qilishni istamasangiz ham.

Bularning hammasi, millatlar!