Ishlab chiqarishda Kubernetes yordamida Istio qanday ishga tushiriladi. 1-qism

nima Istio? Bu xizmat tarmog'i deb ataladigan texnologiya bo'lib, tarmoq orqali mavhumlik qatlamini qo'shadi. Biz klasterdagi trafikning to'liq yoki bir qismini ushlab turamiz va u bilan ma'lum operatsiyalar to'plamini bajaramiz. Aynan qanday? Masalan, biz aqlli marshrutlashni amalga oshiramiz yoki o'chirish to'xtatuvchisi yondashuvini amalga oshiramiz, biz "kanareykalarni joylashtirishni" tashkil qilishimiz mumkin, trafikni qisman xizmatning yangi versiyasiga o'tkazamiz yoki tashqi shovqinlarni cheklashimiz va klasterdan tashqi tarmoqqa barcha sayohatlarni boshqarishimiz mumkin. tarmoq. Turli mikroservislar orasidagi sayohatlarni boshqarish uchun siyosat qoidalarini o'rnatish mumkin. Va nihoyat, biz tarmoqning o'zaro ta'sirining butun xaritasini olishimiz va birlashtirilgan o'lchovlar to'plamini ilovalar uchun to'liq shaffof qilishimiz mumkin.

Ish mexanizmi haqida maqolada o'qishingiz mumkin rasmiy hujjatlar. Istio ko'plab vazifalar va muammolarni hal qila oladigan chinakam kuchli vositadir. Ushbu maqolada men odatda Istio bilan ishlashni boshlaganda paydo bo'ladigan asosiy savollarga javob bermoqchiman. Bu sizga u bilan tezroq kurashishga yordam beradi.

Ishlab chiqarishda Kubernetes yordamida Istio qanday ishga tushiriladi. 1-qism

Ish printsipi

Istio ikkita asosiy zonadan iborat - boshqaruv tekisligi va ma'lumotlar tekisligi. Boshqaruv tekisligida qolganlarning to'g'ri ishlashini ta'minlaydigan asosiy komponentlar mavjud. Joriy versiyada (1.0) boshqaruv tekisligi uchta asosiy komponentga ega: Pilot, Mixer, Citadel. Biz Citadelni ko'rib chiqmaymiz; xizmatlar o'rtasida o'zaro TLS ishlashini ta'minlash uchun sertifikatlar yaratish kerak. Keling, Pilot va Mixer dizayni va maqsadini batafsil ko'rib chiqaylik.

Ishlab chiqarishda Kubernetes yordamida Istio qanday ishga tushiriladi. 1-qism

Uchuvchi - bu klasterda mavjud bo'lgan barcha ma'lumotlarni tarqatadigan asosiy boshqaruv komponenti - xizmatlar, ularning so'nggi nuqtalari va marshrutlash qoidalari (masalan, Kanareykani joylashtirish qoidalari yoki elektron to'xtatuvchidir qoidalari).

Mikser - bu o'lchovlar, jurnallar va tarmoq o'zaro ta'siri haqida har qanday ma'lumotni to'plash qobiliyatini ta'minlaydigan ixtiyoriy boshqaruv tekisligi komponenti. Shuningdek, u Siyosat qoidalariga rioya etilishini va tarif cheklovlariga rioya etilishini nazorat qiladi.

Ma'lumotlar tekisligi sidecar proksi-konteynerlari yordamida amalga oshiriladi. Standart kuchli elchi proksi-server. Uni boshqa dastur bilan almashtirish mumkin, masalan, nginx (nginmesh).

Istio ilovalar uchun to'liq shaffof ishlashi uchun avtomatik in'ektsiya tizimi mavjud. Eng so'nggi dastur Kubernetes 1.9+ versiyalari uchun mos keladi (mutatsion kirish veb-huk). Kubernetes 1.7, 1.8 versiyalari uchun Initializer-dan foydalanish mumkin.

Sidecar konteynerlari GRPC protokoli yordamida Pilotga ulanadi, bu sizga klasterda sodir bo'layotgan o'zgarishlarni surish uchun modelni optimallashtirish imkonini beradi. GRPC Envoy-da 1.6-versiyasidan foydalanila boshlandi, Istio-da u 0.8-versiyasidan beri qo'llanila boshlandi va uchuvchi-agent - ishga tushirish parametrlarini sozlaydigan elchi ustidan golang o'rami.

Pilot va Mixer mutlaqo fuqaroligi yo'q komponentlar bo'lib, barcha holat xotirada saqlanadi. Ular uchun konfiguratsiya va hokazolarda saqlanadigan Kubernetes Custom Resources shaklida o'rnatiladi.
Istio-agent uchuvchi manzilni oladi va unga GRPC oqimini ochadi.

Aytganimdek, Istio barcha funktsiyalarni ilovalar uchun mutlaqo shaffof tarzda amalga oshiradi. Keling, qanday qilib tushunaylik. Algoritm quyidagicha:

  1. Biz xizmatning yangi versiyasini joylashtiramiz.
  2. Yon idishni in'ektsiya qilish yondashuviga qarab, konfiguratsiyani qo'llash bosqichida istio-init konteyneri va istio-agent konteyneri (elchi) qo'shiladi yoki ular allaqachon Kubernetes ob'ektining Pod tavsifiga qo'lda kiritilishi mumkin.
  3. istio-init konteyneri podga iptables qoidalarini qo'llaydigan skriptdir. Δ°stio-agent konteynerida trafikni o'rashni o'rnatishning ikkita varianti mavjud: iptables yo'naltirish qoidalaridan foydalaning yoki TPROXY. Yozish vaqtida, standart yondashuv qayta yo'naltirish qoidalariga ega. Istio-init sizga qanday trafikni ushlab turish va istio-agentga jo'natish kerakligini sozlash imkonini beradi. Masalan, barcha kiruvchi va chiquvchi trafikni ushlab turish uchun siz parametrlarni o'rnatishingiz kerak -i ΠΈ -b ma'noga kiradi *. Siz tutash uchun maxsus portlarni belgilashingiz mumkin. Muayyan pastki tarmoqni ushlab turmaslik uchun uni bayroq yordamida belgilashingiz mumkin -x.
  4. Init konteynerlari bajarilgandan so'ng, asosiylari, shu jumladan uchuvchi-agent (elchi) ishga tushiriladi. U GRPC orqali allaqachon o'rnatilgan Pilotga ulanadi va klasterdagi barcha mavjud xizmatlar va marshrutlash siyosatlari haqida ma'lumot oladi. Qabul qilingan ma'lumotlarga ko'ra, u klasterlarni sozlaydi va ularni bevosita Kubernetes klasteridagi ilovalarimizning so'nggi nuqtalariga tayinlaydi. Yana bir muhim jihatga e'tibor qaratish lozim: elchi tinglashni boshlaydigan tinglovchilarni (IP, port juftlari) dinamik ravishda sozlaydi. Shuning uchun, so'rovlar podkadaga kirganda va iptables qoidalaridan foydalanib, sidecarga qayta yo'naltirilsa, elchi allaqachon bu ulanishlarni muvaffaqiyatli qayta ishlashi va keyingi trafikni qayerga proksi-server qilish kerakligini tushunishi mumkin. Shuningdek, ushbu bosqichda Mixerga ma'lumot yuboriladi, biz uni keyinroq ko'rib chiqamiz va kuzatuv oralig'i yuboriladi.

Natijada, biz bir nuqtadan sozlashimiz mumkin bo'lgan elchi proksi-serverlarning butun tarmog'ini olamiz (Pilot). Barcha kiruvchi va chiquvchi so'rovlar elchi orqali o'tadi. Bundan tashqari, faqat TCP trafik to'xtatiladi. Bu Kubernetes xizmati IP-ni o'zgartirmasdan UDP orqali kube-dns yordamida hal qilinishini anglatadi. Keyin, hal qilingandan so'ng, chiquvchi so'rov elchi tomonidan ushlanadi va qayta ishlanadi, u so'rovni qaysi oxirgi nuqtaga yuborish kerakligini hal qiladi (yoki kirish siyosati yoki elektron to'xtatuvchining algoritmi ishga tushirilganda yuborilmaydi).

Biz Pilotni ajratdik, endi Mixer qanday ishlashini va nima uchun kerakligini tushunishimiz kerak. Siz bu haqda rasmiy hujjatlarni o'qishingiz mumkin shu yerda.

Mikser hozirgi ko'rinishida ikkita komponentdan iborat: istio-temetriya, istio-policy (0.8 versiyasidan oldin bu bitta istio-mikser komponenti edi). Ularning ikkalasi ham mikserdir, ularning har biri o'z vazifasi uchun javobgardir. Istio telemetriya GRPC orqali kim qaerga va qanday parametrlar bilan ketayotgani haqida hisobot konteynerlaridan ma'lumot oladi. Istio-policy Siyosat qoidalariga rioya qilinganligini tekshirish uchun tekshirish soΚ»rovlarini qabul qiladi. Siyosat tekshiruvlari, albatta, har bir so'rov uchun o'tkazilmaydi, lekin ma'lum vaqt davomida mijozda (yangi vagonda) keshlanadi. Hisobot tekshiruvlari ommaviy so'rovlar bilan yuboriladi. Biz uni qanday sozlashni va qanday parametrlarni yuborish kerakligini birozdan keyin ko'rib chiqamiz.

Mikser telemetriya ma'lumotlarini yig'ish va qayta ishlashning uzluksiz ishlashini ta'minlaydigan yuqori darajadagi mavjud komponent bo'lishi uchun mo'ljallangan. Tizim ko'p darajali bufer sifatida tugaydi. Dastlab, ma'lumotlar konteynerlarning yon tomonida, so'ngra mikser tomonida buferlanadi va keyin mikserning orqa tomonlari deb ataladigan joyga yuboriladi. Natijada, tizim komponentlaridan birortasi ishlamay qolsa, bufer o'sadi va tizim qayta tiklanganidan keyin yuviladi. Mikserning orqa tomonlari telemetriya ma'lumotlarini yuborish uchun so'nggi nuqtalardir: statsd, newrelic va boshqalar. Siz o'zingizning backendingizni yozishingiz mumkin, bu juda oddiy va biz buni qanday qilishni ko'rib chiqamiz.

Ishlab chiqarishda Kubernetes yordamida Istio qanday ishga tushiriladi. 1-qism

Xulosa qilib aytganda, istio-temetriya bilan ishlash sxemasi quyidagicha.

  1. 1-xizmat 2-xizmatga so'rov yuboradi.
  2. 1-xizmatdan chiqayotganda so'rov o'zining yonboshiga o'raladi.
  3. Sidecar elchisi so'rov 2-xizmatga qanday borishini nazorat qiladi va kerakli ma'lumotlarni tayyorlaydi.
  4. Keyin u Hisobot so'rovi yordamida uni istio-temetriyaga yuboradi.
  5. Istio-telemetriya ushbu Hisobotni backendlarga jo'natish kerakligini, qaysilari va qanday ma'lumotlarni yuborish kerakligini aniqlaydi.
  6. Agar kerak bo'lsa, Istio-temetry hisobot ma'lumotlarini backendga yuboradi.

Endi keling, faqat asosiy komponentlardan (Pilot va sidecar envoy) tashkil topgan tizimda Istio-ni qanday joylashtirishni ko'rib chiqamiz.

Birinchidan, Pilot o'qigan asosiy konfiguratsiyani (mash) ko'rib chiqaylik:

apiVersion: v1
kind: ConfigMap
metadata:
  name: istio
  namespace: istio-system
  labels:
    app: istio
    service: istio
data:
  mesh: |-

    # ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ tracing ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (pilot настроит envoy’и Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ)
    enableTracing: false

    # ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ mixer endpoint’ы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ sidecar ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π½Π΅ отправляли ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚ΡƒΠ΄Π°
    #mixerCheckServer: istio-policy.istio-system:15004
    #mixerReportServer: istio-telemetry.istio-system:15004

    # ставим Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ envoy ΠΏΠ΅Ρ€Π΅ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Pilot (это для старой вСрсии envoy proxy)
    rdsRefreshDelay: 5s

    # default конфигурация для envoy sidecar
    defaultConfig:
      # Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΊΠ°ΠΊ rdsRefreshDelay
      discoveryRefreshDelay: 5s

      # оставляСм ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ Π±ΠΈΠ½Π°Ρ€ΡŽ envoy)
      configPath: "/etc/istio/proxy"
      binaryPath: "/usr/local/bin/envoy"

      # Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ имя Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ sidecar ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΈΠΌΠ΅Π½Π°Ρ… сСрвиса ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ tracing span’ов)
      serviceCluster: istio-proxy

      # врСмя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ envoy Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ всС установлСнныС соСдинСния
      drainDuration: 45s
      parentShutdownDuration: 1m0s

      # ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ REDIRECT ΠΏΡ€Π°Π²ΠΈΠ»Π° iptables. МоТно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° TPROXY.
      #interceptionMode: REDIRECT

      # ΠŸΠΎΡ€Ρ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° admin панСль ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ sidecar ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (envoy)
      proxyAdminPort: 15000

      # адрСс, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ trace’ы ΠΏΠΎ zipkin ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ (Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΌΡ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ саму ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ, поэтому это ΠΏΠΎΠ»Π΅ сСйчас Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ)
      zipkinAddress: tracing-collector.tracing:9411

      # statsd адрСс для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ envoy ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² (ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ)
      # statsdUdpAddress: aggregator:8126

      # Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΠΏΡ†ΠΈΠΈ Mutual TLS
      controlPlaneAuthPolicy: NONE

      # адрСс, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»ΡƒΡˆΠ°Ρ‚ΡŒ istio-pilot для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ service discovery всСм sidecar ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌ
      discoveryAddress: istio-pilot.istio-system:15007

Biz barcha asosiy boshqaruv komponentlarini Kubernetesdagi nomlar maydoni istio-tizimiga joylashtiramiz.

Hech bo'lmaganda, biz faqat Pilotni joylashtirishimiz kerak. Buning uchun biz foydalanamiz ushbu konfiguratsiya bilan.

Va biz konteynerning in'ektsiya yonboshini qo'lda sozlaymiz.

Init konteyner:

initContainers:
 - name: istio-init
   args:
   - -p
   - "15001"
   - -u
   - "1337"
   - -m
   - REDIRECT
   - -i
   - '*'
   - -b
   - '*'
   - -d
   - ""
   image: istio/proxy_init:1.0.0
   imagePullPolicy: IfNotPresent
   resources:
     limits:
       memory: 128Mi
   securityContext:
     capabilities:
       add:
       - NET_ADMIN

Va yon vagon:

       name: istio-proxy
       args:
         - "bash"
         - "-c"
         - |
           exec /usr/local/bin/pilot-agent proxy sidecar 
           --configPath 
           /etc/istio/proxy 
           --binaryPath 
           /usr/local/bin/envoy 
           --serviceCluster 
           service-name 
           --drainDuration 
           45s 
           --parentShutdownDuration 
           1m0s 
           --discoveryAddress 
           istio-pilot.istio-system:15007 
           --discoveryRefreshDelay 
           1s 
           --connectTimeout 
           10s 
           --proxyAdminPort 
           "15000" 
           --controlPlaneAuthPolicy 
           NONE
         env:
         - name: POD_NAME
           valueFrom:
             fieldRef:
               fieldPath: metadata.name
         - name: POD_NAMESPACE
           valueFrom:
             fieldRef:
               fieldPath: metadata.namespace
         - name: INSTANCE_IP
           valueFrom:
             fieldRef:
               fieldPath: status.podIP
         - name: ISTIO_META_POD_NAME
           valueFrom:
             fieldRef:
               fieldPath: metadata.name
         - name: ISTIO_META_INTERCEPTION_MODE
           value: REDIRECT
         image: istio/proxyv2:1.0.0
         imagePullPolicy: IfNotPresent
         resources:
           requests:
             cpu: 100m
             memory: 128Mi
           limits:
             memory: 2048Mi
         securityContext:
           privileged: false
           readOnlyRootFilesystem: true
           runAsUser: 1337
         volumeMounts:
         - mountPath: /etc/istio/proxy
           name: istio-envoy

Hammasi muvaffaqiyatli boshlanishi uchun siz ServiceAccount, ClusterRole, ClusterRoleBinding, Pilot uchun CRD ni yaratishingiz kerak, ularning tavsifini topishingiz mumkin. shu yerda.

Natijada, biz elchi bilan yonbosh mashinasini kiritadigan xizmat muvaffaqiyatli ishga tushishi, uchuvchidan barcha kashfiyotlarni olishi va so'rovlarni ko'rib chiqishi kerak.

Boshqaruv tekisligining barcha komponentlari fuqaroligi bo'lmagan ilovalar ekanligini va muammosiz gorizontal ravishda o'lchanishi mumkinligini tushunish muhimdir. Barcha ma'lumotlar etcd da Kubernetes resurslarining maxsus tavsiflari shaklida saqlanadi.

Istio shuningdek (hali ham eksperimental) klasterdan tashqarida ishlash va bir nechta Kubernetes klasterlari o'rtasida xizmat kashfiyotlarini ko'rish va almashish qobiliyatiga ega. Bu haqda ko'proq o'qishingiz mumkin shu yerda.

Ko'p klasterli o'rnatish uchun quyidagi cheklovlarni ko'rib chiqing:

  1. Pod CIDR va Service CIDR barcha klasterlarda yagona boβ€˜lishi va bir-biriga mos kelmasligi kerak.
  2. Barcha Pod CIDR’larga klasterlar orasidagi istalgan Pod CIDR’lardan kirish mumkin boβ€˜lishi kerak.
  3. Barcha Kubernetes API serverlari bir-biri uchun ochiq bo'lishi kerak.

Bu Istio bilan boshlashingizga yordam beradigan asosiy kirish. Biroq, hali ham ko'plab tuzoqlar mavjud. Masalan, tashqi trafikni marshrutlash xususiyatlari (klaster tashqarisi), yon vagonlarni disk raskadrovka qilish yondashuvlari, profil yaratish, mikserni o'rnatish va moslashtirilgan mikserning orqa qismini yozish, kuzatuv mexanizmini sozlash va elchi yordamida uning ishlashi.
Bularning barchasini keyingi nashrlarda ko'rib chiqamiz. Savollaringizni bering, men ularga aniqlik kiritishga harakat qilaman.

Manba: www.habr.com

a Izoh qo'shish