Jinsi ya kuendesha Istio kwa kutumia Kubernetes katika uzalishaji. Sehemu 1

Je, ni Istio? Hii ndio inayoitwa matundu ya Huduma, teknolojia inayoongeza safu ya uondoaji kwenye mtandao. Tunazuia trafiki yote au sehemu kwenye nguzo na kutekeleza seti fulani ya shughuli nayo. Gani? Kwa mfano, sisi hufanya uelekezaji mahiri, au kutekeleza mbinu ya kikatiza mzunguko, tunaweza kupanga "usambazaji wa canary", kubadilisha trafiki kwa toleo jipya la huduma, au tunaweza kudhibiti mwingiliano wa nje na kudhibiti safari zote kutoka kwa nguzo hadi za nje. mtandao. Inawezekana kuweka sheria za sera ili kudhibiti safari kati ya huduma ndogo tofauti. Hatimaye, tunaweza kunasa ramani nzima ya mwingiliano wa mtandao na kufanya mkusanyiko wa metriki kwa uwazi kabisa kwa programu.

Unaweza kusoma juu ya utaratibu wa kufanya kazi katika nyaraka rasmi. Istio ni chombo chenye nguvu ambacho kinaweza kutatua kazi na matatizo mengi. Katika makala hii ningependa kujibu maswali kuu ambayo kawaida hutokea wakati wa kuanza kufanya kazi na Istio. Hii itakusaidia kukabiliana nayo haraka.

Jinsi ya kuendesha Istio kwa kutumia Kubernetes katika uzalishaji. Sehemu 1

Kanuni ya uendeshaji

Istio ina kanda mbili kuu - ndege ya kudhibiti na ndege ya data. Ndege ya udhibiti ina vipengele vikuu vinavyohakikisha uendeshaji sahihi wa wengine. Katika toleo la sasa (1.0), ndege ya udhibiti ina vipengele vitatu kuu: Pilot, Mixer, Citadel. Hatutazingatia Citadel; inahitajika kutoa vyeti ili kuhakikisha utendakazi wa TLS kati ya huduma. Hebu tuangalie kwa karibu muundo na madhumuni ya Pilot na Mixer.

Jinsi ya kuendesha Istio kwa kutumia Kubernetes katika uzalishaji. Sehemu 1

Majaribio ni sehemu kuu ya udhibiti ambayo inasambaza taarifa zote kuhusu kile tulicho nacho katika nguzo - huduma, mwisho wao na sheria za uelekezaji (kwa mfano, sheria za uwekaji wa Canary au sheria za kivunja mzunguko).

Kichanganyaji ni kipengele cha hiari cha ndege kinachotoa uwezo wa kukusanya vipimo, kumbukumbu na taarifa yoyote kuhusu mwingiliano wa mtandao. Pia anafuatilia uzingatiaji wa sheria za Sera na uzingatiaji wa viwango vya viwango.

Ndege ya data inatekelezwa kwa kutumia kontena za proksi za kando. Chaguo-msingi ni nguvu seva ya wakala ya mjumbe. Inaweza kubadilishwa na utekelezaji mwingine, kwa mfano nginx (nginmesh).

Ili Istio ifanye kazi kwa uwazi kabisa kwa programu, kuna mfumo wa sindano otomatiki. Utekelezaji wa hivi punde unafaa kwa matoleo ya Kubernetes 1.9+ (webhook ya uandikishaji wa mabadiliko). Kwa matoleo ya Kubernetes 1.7, 1.8 inawezekana kutumia Initializer.

Vyombo vya Sidecar huunganishwa kwenye Pilot kwa kutumia itifaki ya GRPC, ambayo hukuruhusu kuboresha muundo wa kusukuma mabadiliko yanayotokea kwenye nguzo. GRPC ilianza kutumika katika Mjumbe tangu toleo la 1.6, katika Istio imekuwa ikitumika tangu toleo la 0.8 na ni wakala wa majaribio - karatasi ya golang juu ya mjumbe ambayo husanidi vigezo vya uzinduzi.

Pilot na Mixer ni vipengele visivyo na uraia kabisa, hali zote huhifadhiwa kwenye kumbukumbu. Usanidi wao umewekwa katika mfumo wa Rasilimali Maalum za Kubernetes, ambazo zimehifadhiwa katika nk.
Wakala wa Istio hupokea anwani ya Majaribio na kuifungua mkondo wa GRPC kwake.

Kama nilivyosema, Istio hutekeleza utendakazi wote kwa uwazi kabisa kwa programu. Hebu tujue jinsi gani. Algorithm ni kama hii:

  1. Tutasambaza toleo jipya la huduma.
  2. Kulingana na mbinu ya kuingiza kontena la kando, kontena la istio-init na chombo cha wakala wa istio (mjumbe) huongezwa katika hatua ya kutumia usanidi, au tayari zinaweza kuingizwa kwa mikono kwenye maelezo ya Pod ya huluki ya Kubernetes.
  3. Chombo cha istio-init ni hati inayotumia sheria za iptables kwenye ganda. Kuna chaguzi mbili za kusanidi ufungaji wa trafiki kwenye kontena la wakala wa istio: tumia sheria za uelekezaji upya wa iptables, au TPROXY. Wakati wa kuandika, mbinu chaguo-msingi iko na sheria za kuelekeza kwingine. Istio-init hukuruhusu kusanidi ni aina gani ya trafiki inapaswa kuzuiwa na kutumwa kwa wakala wa istio. Kwa mfano, ili kuzuia trafiki zote zinazoingia na zinazotoka, unahitaji kuweka vigezo -i и -b kwenye maana *. Unaweza kubainisha bandari maalum za kukatiza. Ili usikatize subnet maalum, unaweza kuibainisha kwa kutumia bendera -x.
  4. Baada ya vyombo vya init kutekelezwa, kuu huzinduliwa, ikiwa ni pamoja na wakala wa majaribio (mjumbe). Inaunganishwa na Rubani ambalo tayari limetumwa kupitia GRPC na hupokea taarifa kuhusu huduma zote zilizopo na sera za uelekezaji katika kundi. Kulingana na data iliyopokelewa, yeye husanidi makundi na kuyapa moja kwa moja sehemu za mwisho za programu zetu katika kundi la Kubernetes. Pia ni muhimu kutambua jambo muhimu: mjumbe husanidi wasikilizaji kwa nguvu (IP, jozi za bandari) ambazo huanza kusikiliza. Kwa hivyo, maombi yanapoingia kwenye ganda na kuelekezwa kwingine kwa kutumia sheria za iptables za kuelekeza kwenye sidecar, mjumbe anaweza tayari kuchakata miunganisho hii kwa mafanikio na kuelewa ni wapi trafiki inahitaji kufanywa seva mbadala. Pia katika hatua hii, taarifa hutumwa kwa Mixer, ambayo tutaangalia baadaye, na kufuatilia spans hutumwa.

Matokeo yake, tunapata mtandao mzima wa seva za wakala wa wajumbe, ambazo tunaweza kusanidi kutoka kwa hatua moja (Pilot). Maombi yote ya ndani na nje yanapitia mjumbe. Zaidi ya hayo, trafiki ya TCP pekee ndiyo inazuiwa. Hii inamaanisha kuwa IP ya huduma ya Kubernetes inatatuliwa kwa kutumia kube-dns juu ya UDP bila kubadilika. Kisha, baada ya azimio, ombi linalotoka linaingiliwa na kushughulikiwa na mjumbe, ambayo huamua ni mwisho gani ombi linapaswa kutumwa (au kutotumwa, katika kesi ya sera za upatikanaji au algorithm ya mzunguko wa mzunguko inasababishwa).

Tumepanga Majaribio, sasa tunahitaji kuelewa jinsi Mchanganyiko hufanya kazi na kwa nini inahitajika. Unaweza kusoma hati rasmi juu yake hapa.

Mchanganyiko katika hali yake ya sasa ina vipengele viwili: istio-telemetry, istio-sera (kabla ya toleo la 0.8 hii ilikuwa sehemu moja ya istio-mixer). Wote wawili ni wachanganyaji, ambayo kila mmoja anajibika kwa kazi yake mwenyewe. Istio telemetry hupokea taarifa kupitia GRPC kutoka kwa vyombo vya Ripoti ya sidecar kuhusu nani anaenda wapi na kwa vigezo gani. Sera ya Istio inakubali maombi ya Angalia ili kuangalia kama sheria za Sera zimeridhika. Ukaguzi wa sera, bila shaka, haufanyiki kwa kila ombi, lakini huhifadhiwa kwa mteja (kwenye gari la kando) kwa muda fulani. Ukaguzi wa ripoti hutumwa na maombi ya kundi. Tutaona jinsi ya kuisanidi na ni vigezo gani vinahitaji kutumwa baadaye kidogo.

Kichanganyaji kinakusudiwa kuwa sehemu inayopatikana sana ambayo inahakikisha utendakazi mzuri wa ukusanyaji na usindikaji wa data ya telemetry. Mfumo huishia kama bafa ya ngazi nyingi. Hapo awali, data huhifadhiwa kwenye upande wa kando ya vyombo, kisha kwa upande wa mchanganyiko na kisha kutumwa kwa kinachojulikana kama sehemu za nyuma za mchanganyiko. Matokeo yake, ikiwa sehemu yoyote ya mfumo itashindwa, buffer inakua na inafishwa baada ya mfumo kurejeshwa. Viunga vya nyuma vya mchanganyiko ni sehemu za mwisho za kutuma data ya telemetry: statsd, newrelic, nk. Unaweza kuandika backend yako mwenyewe, ni rahisi sana, na tutaona jinsi ya kufanya hivyo.

Jinsi ya kuendesha Istio kwa kutumia Kubernetes katika uzalishaji. Sehemu 1

Kwa muhtasari, mpango wa kufanya kazi na istio-telemetry ni kama ifuatavyo.

  1. Huduma 1 hutuma ombi kwa huduma 2.
  2. Wakati wa kuacha huduma 1, ombi limefungwa kwenye gari lake la kando.
  3. Mjumbe wa Sidecar anafuatilia jinsi ombi linavyoenda kwa huduma 2 na huandaa habari muhimu.
  4. Kisha huituma kwa istio-telemetry kwa kutumia ombi la Ripoti.
  5. Istio-telemetry huamua kama Ripoti hii inahitaji kutumwa kwa njia za nyuma, zipi na data gani inahitaji kutumwa.
  6. Istio-telemetry hutuma data ya Ripoti kwa upande wa nyuma ikiwa ni lazima.

Sasa hebu tuone jinsi ya kupeleka Istio kwenye mfumo, unaojumuisha tu vipengele vikuu (Pilot na sidecar mjumbe).

Kwanza, hebu tuangalie usanidi mkuu (mesh) ambao Pilot anasoma:

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

Tutaweka vipengele vyote vikuu vya udhibiti katika mfumo wa istio wa nafasi ya majina huko Kubernetes.

Kwa uchache, tunahitaji tu kupeleka Pilot. Kwa hili tutatumia na usanidi huu.

Na tutasanidi mwenyewe gari la kando la kontena la kuingiza.

Init chombo:

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

Na 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

Ili kila kitu kianze kwa ufanisi, unahitaji kuunda ServiceAccount, ClusterRole, ClusterRoleBinding, CRD for Pilot, maelezo ambayo yanaweza kupatikana. hapa.

Kwa hivyo, huduma ambayo tunaingiza gari la kando na mjumbe inapaswa kuzinduliwa kwa mafanikio, kupokea ugunduzi wote kutoka kwa majaribio na kushughulikia maombi.

Ni muhimu kuelewa kwamba vipengele vyote vya ndege ya udhibiti ni maombi yasiyo na uraia na yanaweza kupunguzwa kwa usawa bila matatizo. Data yote huhifadhiwa katika etcd katika mfumo wa maelezo maalum ya rasilimali za Kubernetes.

Istio pia (bado ya majaribio) ina uwezo wa kukimbia nje ya kundi na uwezo wa kutazama na kushiriki ugunduzi wa huduma kati ya nguzo kadhaa za Kubernetes. Unaweza kusoma zaidi kuhusu hili hapa.

Kwa usakinishaji wa nguzo nyingi, zingatia mapungufu yafuatayo:

  1. Pod CIDR na Service CIDR lazima ziwe za kipekee katika makundi yote na zisiingiliane.
  2. Pod CIDR zote lazima zipatikane kutoka kwa Pod CIDR zozote kati ya makundi.
  3. Seva zote za Kubernetes API lazima ziwe na uwezo wa kufikia kila mmoja.

Huu ni utangulizi wa msingi wa kukusaidia kuanza kutumia Istio. Hata hivyo, bado kuna mitego mingi. Kwa mfano, vipengele vya kuelekeza trafiki ya nje (nje ya nguzo), mbinu za kurekebisha kando, kuorodhesha, kusanidi kichanganyaji na kuandika hali ya nyuma ya kichanganyaji cha desturi, kuweka utaratibu wa kufuatilia na uendeshaji wake kwa kutumia mjumbe.
Tutazingatia haya yote katika machapisho yafuatayo. Uliza maswali yako, nitajaribu kufafanua.

Chanzo: mapenzi.com

Kuongeza maoni