Carane mbukak Istio nggunakake Kubernetes ing produksi. Bagean 1

apa Istio? Iki sing disebut Service bolong, teknologi sing nambah lapisan abstraksi liwat jaringan. Kita nyegat kabeh utawa bagéan saka lalu lintas ing kluster lan nindakake pesawat tartamtu saka operasi karo. Sing endi? Contone, kita nindakake nuntun pinter, utawa kita ngleksanakake pendekatan mbobol sirkuit, kita bisa ngatur "penyebaran kenari", sebagian ngalih lalu lintas menyang versi anyar saka layanan, utawa kita bisa matesi interaksi external lan ngontrol kabeh lelungan saka kluster menyang jaringan njaba. Sampeyan bisa nyetel aturan kabijakan kanggo ngontrol lelungan ing antarane layanan mikro sing beda. Pungkasan, kita bisa entuk kabeh peta interaksi jaringan lan nggawe koleksi metrik terpadu kanthi transparan kanggo aplikasi.

Sampeyan bisa maca babagan mekanisme kerja ing dokumentasi resmi. Istio minangka alat sing kuat banget sing ngidini sampeyan ngatasi akeh tugas lan masalah. Ing artikel iki, aku pengin mangsuli pitakon utama sing biasane muncul nalika miwiti Istio. Iki bakal mbantu sampeyan ngatasi kanthi luwih cepet.

Carane mbukak Istio nggunakake Kubernetes ing produksi. Bagean 1

Cara kerjane

Istio kasusun saka rong wilayah utama - bidang kontrol lan bidang data. Pesawat kontrol ngemot komponen utama sing njamin operasi sing bener saka liyane. Ing versi saiki (1.0) pesawat kontrol wis telung komponen utama: Pilot, Mixer, Citadel. Kita ora bakal nimbang Citadel, iku perlu kanggo generate sertifikat kanggo mesthekake TLS bebarengan antarane layanan. Ayo goleki kanthi luwih rinci babagan piranti lan tujuan Pilot lan Mixer.

Carane mbukak Istio nggunakake Kubernetes ing produksi. Bagean 1

Pilot minangka komponen kontrol utama sing nyebarake kabeh informasi babagan apa sing ana ing kluster - layanan, titik pungkasan lan aturan rute (Contone, aturan kanggo penyebaran Canary utawa aturan pemutus sirkuit).

Mixer minangka komponen pesawat kontrol opsional sing nyedhiyakake kemampuan kanggo ngumpulake metrik, log, lan informasi apa wae babagan interaksi jaringan. Dheweke uga ngawasi selaras karo aturan Kebijakan lan selaras karo watesan tarif.

Pesawat data dileksanakake nggunakake wadhah proxy sidecar. Kuat digunakake kanthi gawan. proxy utusan. Bisa diganti karo implementasi liyane, kayata nginx (nginmesh).

Supaya Istio bisa digunakake kanthi transparan kanggo aplikasi, ana sistem injeksi otomatis. Implementasi paling anyar cocok kanggo versi Kubernetes 1.9+ (webhook diakoni mutasi). Kanggo Kubernetes versi 1.7, 1.8 bisa nggunakake Initializer.

Wadhah sidecar disambungake menyang Pilot nggunakake protokol GRPC, sing ngidini sampeyan ngoptimalake model push kanggo owah-owahan sing kedadeyan ing kluster. GRPC wis digunakake ing Utusan wiwit versi 1.6, ing Istio wis digunakake wiwit versi 0.8 lan pilot-agen - pambungkus golang liwat utusan sing configures opsi Bukak.

Pilot lan Mixer minangka komponen tanpa negara, kabeh negara disimpen ing memori. Konfigurasi kanggo wong-wong mau disetel ing wangun Kubernetes Custom Resources, sing disimpen ing etcd.
Istio-agen entuk alamat Pilot lan mbukak stream GRPC.

Kaya sing dakkandhakake, Istio ngetrapake kabeh fungsi kanthi transparan kanggo aplikasi. Ayo ndeleng carane. Algoritma kasebut yaiku:

  1. Nggunakake versi anyar saka layanan.
  2. Gumantung ing pendekatan injeksi wadhah sidecar, wadhah istio-init lan wadhah istio-agen (utusan) ditambahake ing tataran aplikasi konfigurasi, utawa wis bisa dilebokake kanthi manual menyang katrangan entitas Kubernetes Pod.
  3. Wadah istio-init minangka skrip sing ngetrapake aturan iptables menyang pod. Ana rong pilihan kanggo ngatur lalu lintas sing dibungkus ing wadhah istio-agen: gunakake aturan pangalihan iptables, utawa TPROXY. Nalika nulis, pendekatan standar yaiku aturan pangalihan. Ing istio-init, sampeyan bisa ngatur lalu lintas sing kudu dicegat lan dikirim menyang agen istio. Contone, kanggo nyegat kabeh lalu lintas mlebu lan metu, sampeyan kudu nyetel paramèter -i и -b menyang makna *. Sampeyan bisa nemtokake port tartamtu kanggo nyegat. Supaya ora nyegat subnet tartamtu, sampeyan bisa nemtokake kanthi nggunakake gendera -x.
  4. Sawise wadhah init dieksekusi, sing utama diluncurake, kalebu agen pilot (utusan). Iku nyambung menyang Pilot wis tugasaken liwat GRPC lan nampa informasi bab kabeh layanan ana lan kawicaksanan nuntun ing kluster. Miturut data sing ditampa, dheweke ngatur kluster lan menehi langsung menyang titik pungkasan aplikasi kita ing kluster Kubernetes. Sampeyan uga perlu kanggo Wigati titik penting: utusan mbosenke configures pamireng (IP, pasangan port) sing wiwit ngrungokake. Mulane, nalika panjalukan mlebu pod, dialihake nggunakake aturan iptables pangalihan ing sidecar, utusan wis bisa kasil proses sambungan iki lan ngerti ngendi kanggo luwih proxy lalu lintas. Uga ing tataran iki, informasi dikirim menyang Mixer, kang kita bakal katon ing mengko, lan nelusuri jengkal dikirim.

Akibaté, kita entuk kabeh jaringan server proxy utusan sing bisa diatur saka siji titik (Pilot). Kabeh panjalukan mlebu lan metu liwat utusan. Kajaba iku, mung lalu lintas TCP sing dicegat. Iki tegese IP layanan Kubernetes ditanggulangi nggunakake kube-dns liwat UDP tanpa ngganti. Banjur, sawise mutusake masalah, panjaluk sing metu dicegat lan diproses dening utusan, sing wis mutusake menyang titik pungkasan panyuwunan kasebut (utawa ora dikirim, ing kasus kabijakan akses utawa pemutus sirkuit pemicu algoritma).

We figured metu Pilot, saiki kita kudu ngerti carane Mixer dianggo lan apa iku perlu. Sampeyan bisa maca dokumentasi resmi kene.

Mixer ing wangun saiki kasusun saka rong komponen: istio-telemetri, istio-kabijakan (sadurunge versi 0.8 iku siji komponen istio-mixer). Loro-lorone minangka mixer, saben tanggung jawab kanggo tugas dhewe. Istio telemetri nampa informasi bab sing menyang ngendi lan apa paramèter saka sidecar Report wadhah liwat GRPC. Istio-kabijakan nampa Priksa panjalukan kanggo verifikasi sing aturan Kebijakan wareg. Pemeriksaa kebijakan, mesthi, ora ditindakake kanggo saben panyuwunan, nanging di-cache ing klien (ing sidecar) kanggo wektu tartamtu. Priksa laporan dikirim minangka panjalukan batch. Ayo ndeleng carane ngatur lan paramèter apa sing kudu dikirim mengko.

Mixer mesthine minangka komponen sing kasedhiya banget sing njamin karya tanpa gangguan ing perakitan lan pangolahan data telemetri. Sistem iki dijupuk minangka asil minangka buffer multi-tingkat. Kaping pisanan, data buffered ing sisih sidecar saka wadhah, banjur ing sisih mixer, lan banjur dikirim menyang backends mixer disebut. Akibaté, yen ana komponen sistem gagal, buffer mundak akeh lan flushed sawise sistem dibalèkaké. Backend mixer minangka titik pungkasan kanggo ngirim data telemetri: statsd, newrelic, lsp. Sampeyan bisa nulis backend dhewe, iku cukup prasaja, lan kita bakal weruh carane nindakaken.

Carane mbukak Istio nggunakake Kubernetes ing produksi. Bagean 1

Kanggo ngringkes, skema kanggo nggarap istio-telemetri kaya ing ngisor iki.

  1. Layanan 1 ngirim panjalukan menyang layanan 2.
  2. Nalika ninggalake layanan 1, panjalukan kasebut dibungkus ing sidecar dhewe.
  3. Utusan Sidecar ngawasi carane panyuwunan menyang layanan 2 lan nyiapake informasi sing dibutuhake.
  4. Banjur ngirim menyang istio-telemetri nggunakake panjalukan Report.
  5. Istio-telemetri nemtokake apa Report iki kudu dikirim menyang backends, kanggo kang lan apa data kudu dikirim.
  6. Istio-telemetri ngirim data Report menyang backend yen perlu.

Saiki ayo kang ndeleng carane masang Istio ing sistem, mung dumadi saka komponen utama (Pilot lan sidecar utusan).

Pisanan, ayo goleki konfigurasi utama (bolong) sing diwaca Pilot:

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

Kabeh komponen kontrol utama (pesawat kontrol) bakal ana ing sistem istio-namespace ing Kubernetes.

Paling ora, kita mung kudu masang Pilot. Kanggo iki kita nggunakake konfigurasi kuwi.

Lan kita bakal kanthi manual ngatur sidecar injeksi saka wadhah.

Wadah iki:

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

Lan sidecar:

       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

Supaya kabeh bisa diwiwiti kanthi sukses, sampeyan kudu nggawe Akun Layanan, ClusterRole, ClusterRoleBinding, CRD kanggo Pilot, deskripsi sing bisa ditemokake kene.

Akibaté, layanan sing nyuntikake sidecar karo utusan kudu diwiwiti kanthi sukses, nampa kabeh panemuan saka pilot lan panjaluk proses.

Penting kanggo ngerti manawa kabeh komponen pesawat kontrol minangka aplikasi tanpa negara lan bisa skala horisontal tanpa masalah. Kabeh data disimpen ing etcd ing wangun gambaran khusus sumber Kubernetes.

Uga, Istio (isih eksperimen) nduweni kemampuan kanggo mbukak njaba kluster lan kemampuan kanggo nonton lan fumble panemuan layanan antarane sawetara klompok Kubernetes. Sampeyan bisa maca liyane babagan iki kene.

Kanggo instalasi multi-cluster, weruh watesan ing ngisor iki:

  1. Pod CIDR lan Service CIDR kudu unik ing kabeh kluster lan ora kudu tumpang tindih.
  2. Kabeh Pod CIDR kudu bisa diakses saka Pod CIDR ing antarane klompok.
  3. Kabeh server API Kubernetes kudu bisa diakses saben liyane.

Iki minangka informasi awal kanggo mbantu sampeyan miwiti Istio. Nanging, isih akeh pitfalls. Contone, fitur nuntun lalu lintas external (njaba kluster), pendekatan kanggo debug sidecars, profiling, nyetel mixer lan nulis backend mixer adat, nyetel mekanisme nelusuri lan operasi nggunakake utusan.
Kabeh iki bakal kita nimbang ing publikasi ing ngisor iki. Takon pitakonan sampeyan, aku bakal nyoba kanggo nutupi.

Source: www.habr.com

Add a comment