Бо Helm барномаҳоро дар бисёр кластерҳои Kubernetes ҷойгир кунед

Чӣ тавр Dailymotion Kubernetes -ро истифода мебарад: Ҷойгиркунии барнома

Мо дар Dailymotion 3 сол пеш ба истифодаи Kubernetes дар истеҳсолот шурӯъ кардем. Аммо ҷойгиркунии замимаҳо дар бисёр кластерҳо шавқовар аст, аз ин рӯ дар тӯли чанд соли охир мо кӯшиш кардем, ки асбобҳо ва ҷараёнҳои кори худро такмил диҳем.

Аз куҷо сар шуд

Дар ин ҷо мо мефаҳмем, ки чӣ гуна мо барномаҳои худро дар кластерҳои сершумори Kubernetes дар саросари ҷаҳон ҷойгир мекунем.

Барои ҷойгиркунии якчанд объектҳои Kubernetes якбора, мо истифода мебарем Helm, ва ҳамаи диаграммаҳои мо дар як анбори git нигоҳ дошта мешаванд. Барои ҷойгир кардани стеки пурраи барномаҳо аз якчанд хидматҳо, мо диаграммаи ба истилоҳ ҷамъбастиро истифода мебарем. Аслан, ин диаграммаест, ки вобастагиҳоро эълон мекунад ва ба шумо имкон медиҳад API ва хидматҳои онро бо як фармон оғоз кунед.

Мо инчунин дар болои Helm скрипти хурди Python навиштем, то тафтиш, эҷоди диаграммаҳо, илова кардани асрор ва ҷойгиркунии барномаҳо. Ҳамаи ин вазифаҳо дар платформаи марказии CI бо истифода аз тасвири докер иҷро карда мешаванд.

Биёед ба матлаб бирасем.

Шарҳ. Вақте ки шумо инро мехонед, аввалин номзади барориши Helm 3 аллакай эълон шудааст. Варианти асосӣ як қатор такмилҳоро барои ҳалли баъзе мушкилоте, ки мо дар гузашта дучор шуда будем, дар бар мегирад.

Раванди коркарди диаграмма

Мо шохабандиро барои барномаҳо истифода мебарем ва мо тасмим гирифтем, ки ҳамин равишро ба диаграммаҳо татбиқ кунем.

  • Филиал д барои сохтани диаграммаҳое истифода мешавад, ки дар кластерҳои рушд санҷида мешаванд.
  • Вақте ки дархости кашидан ба усто, онхо дар сахна санчида мешаванд.
  • Дар ниҳоят, мо дархости кашиданро барои ворид кардани тағирот ба филиал эҷод мекунем маҳсулот ва онхоро дар истехсолот чорй намоянд.

Ҳар як муҳит як анбори хусусии худро дорад, ки диаграммаҳои моро нигоҳ медорад ва мо онро истифода мебарем Музей бо API-ҳои хеле муфид. Ҳамин тариқ, мо ҷудокунии қатъии байни муҳитҳо ва санҷиши воқеии диаграммаҳоро пеш аз истифодаи онҳо дар истеҳсолот таъмин мекунем.

Анборҳои диаграмма дар муҳитҳои гуногун

Бояд қайд кард, ки вақте таҳиягарон шохаи таҳияро тела медиҳанд, версияи диаграммаи онҳо ба таври худкор ба dev Chartmuseum интиқол дода мешавад. Ҳамин тариқ, ҳама таҳиягарон ҳамон як анбори таҳиякунандаро истифода мебаранд ва шумо бояд версияи диаграммаи худро бодиққат муайян кунед, то тағироти ягон каси дигарро тасодуфан истифода набаред.

Ғайр аз он, скрипти хурди Python-и мо объектҳои Kubernetes-ро бар зидди мушаххасоти Kubernetes OpenAPI бо истифода аз тасдиқ мекунад. Кубевал, пеш аз интишори онҳо дар Chartmusem.

Тавсифи умумии ҷараёни коркарди диаграмма

  1. Муайян кардани вазифаҳои қубур мувофиқи мушаххасот gazr.io барои назорати сифат (линт, воҳиди санҷишӣ).
  2. Тела додани тасвири докер бо асбобҳои Python, ки замимаҳои моро ҷойгир мекунанд.
  3. Муайян кардани муҳити зист бо номи филиал.
  4. Тасдиқи файлҳои Kubernetes yaml бо истифода аз Kubeval.
  5. Версияи диаграмма ва диаграммаҳои волидайнро ба таври худкор зиёд кунед (диаграммаҳое, ки аз диаграммаи тағирёбанда вобастаанд).
  6. Пешниҳоди диаграмма ба Музей, ки ба муҳити он мувофиқат мекунад

Идоракунии фарқиятҳо дар байни кластерҳо

Федератсияи кластерҳо

Замоне буд, ки мо истифода мебурдем федератсияи кластерҳои Кубернетес, ки объектҳои Kubernetes метавонанд аз як нуқтаи ниҳоии API эълон карда шаванд. Аммо мушкилот пеш омад. Масалан, баъзе объектҳои Kubernetes дар нуқтаи ниҳоии федератсия сохта нашуданд, ки нигоҳдории объектҳои федератсия ва дигар объектҳоро барои кластерҳои алоҳида мушкил мекунад.

Барои ҳалли мушкилот, мо мустақилона идора кардани кластерҳоро оғоз кардем, ки ин равандро хеле содда кард (мо версияи якуми федератсияро истифода бурдем; шояд дар дуюм чизе тағйир ёбад).

Платформаи тақсимшудаи геологӣ

Платформаи мо дар айни замон дар 6 минтақа паҳн шудааст - 3 минтақа ва 3 дар абр.


Ҷойгиркунии тақсимшуда

Арзишҳои Global Helm

4 арзишҳои глобалии Helm ба шумо имкон медиҳанд, ки фарқияти байни кластерҳоро муайян кунед. Ҳама диаграммаҳои мо дорои арзишҳои минималии пешфарз мебошанд.

global:
  cloud: True
  env: staging
  region: us-central1
  clusterName: staging-us-central1

Арзишҳои ҷаҳонӣ

Ин арзишҳо барои муайян кардани контексти барномаҳои мо кӯмак мекунанд ва барои мақсадҳои гуногун истифода мешаванд: назорат, пайгирӣ, сабт, зангҳои беруна, миқёс ва ғайра.

  • "абр": Мо платформаи гибридии Kubernetes дорем. Масалан, API-и мо дар минтақаҳои GCP ва дар марказҳои додаҳои мо ҷойгир карда шудааст.
  • "env": Баъзе арзишҳо метавонанд барои муҳити ғайриистеҳсолӣ тағйир диҳанд. Масалан, таърифҳои захираҳо ва конфигуратсияҳои автоматӣ.
  • "минтақа": Ин маълумот барои муайян кардани макони кластер кӯмак мекунад ва метавонад барои муайян кардани нуқтаҳои наздики хидматҳои беруна истифода шавад.
  • "clusterName": агар ва вақте ки мо хоҳем, ки барои кластери инфиродӣ арзиш муайян кунем.

Инак як мисоли мушаххас:

{{/* Returns Horizontal Pod Autoscaler replicas for GraphQL*/}}
{{- define "graphql.hpaReplicas" -}}
{{- if eq .Values.global.env "prod" }}
{{- if eq .Values.global.region "europe-west1" }}
minReplicas: 40
{{- else }}
minReplicas: 150
{{- end }}
maxReplicas: 1400
{{- else }}
minReplicas: 4
maxReplicas: 20
{{- end }}
{{- end -}}

Намунаи қолаби Helm

Ин мантиқ дар қолаби ёрирасон муайян карда шудааст, то ки Kubernetes YAML халалдор нашавад.

Эълони дархост

Воситаҳои ҷойгиркунии мо ба файлҳои сершумори YAML асос ёфтаанд. Дар зер намунаи он аст, ки чӣ тавр мо хидмат ва топологияи миқёси онро (шумораи репликаҳоро) дар кластер эълон мекунем.

releases:
  - foo.world

foo.world:                # Release name
  services:               # List of dailymotion's apps/projects
    foobar:
      chart_name: foo-foobar
      repo: [email protected]:dailymotion/foobar
      contexts:
        prod-europe-west1:
          deployments:
            - name: foo-bar-baz
              replicas: 18
            - name: another-deployment
              replicas: 3

Таърифи хидмат

Ин мухтасари ҳамаи қадамҳое мебошад, ки ҷараёни кории густариши моро муайян мекунанд. Қадами охирин барномаро дар як вақт ба кластерҳои сершумори коргарон ҷойгир мекунад.


Қадамҳои ҷойгиркунии Ҷенкинс

Дар бораи асрор чӣ гуфтан мумкин аст?

Дар мавриди амният, мо ҳама асрорро аз ҷойҳои гуногун пайгирӣ мекунем ва онҳоро дар анбори беназир нигоҳ медорем анбор дар Париж.

Асбобҳои ҷойгиркунии мо аз Vault арзишҳои махфиро мегиранд ва вақте ки вақти ҷойгиркунӣ фаро мерасад, онҳоро ба Helm ворид кунед.

Барои ин, мо харитаи байни асрор дар Vault ва сирре, ки ба замимаҳои мо ниёз доранд, муайян кардем:

secrets:                                                                                                                                                                                                        
     - secret_id: "stack1-app1-password"                                                                                                                                                                                  
       contexts:                                                                                                                                                                                                   
         - name: "default"                                                                                                                                                                                         
           vaultPath: "/kv/dev/stack1/app1/test"                                                                                                                                                               
           vaultKey: "password"                                                                                                                                                                                    
         - name: "cluster1"                                                                                                                                                                           
           vaultPath: "/kv/dev/stack1/app1/test"                                                                                                                                                               
           vaultKey: "password"

  • Мо қоидаҳои умумиро муайян кардем, ки ҳангоми сабти асрор дар Vault бояд риоя шаванд.
  • Агар сир дахл дошта бошад ба контекст ё кластери мушаххас, шумо бояд сабти мушаххасро илова кунед. (Дар ин ҷо кластери контексти1 арзиши худро барои stack-app1-password махфӣ дорад).
  • Дар акси ҳол, арзиш истифода мешавад бо нобаёнӣ.
  • Барои ҳар як ҷузъи ин рӯйхат дар Сирри Кубернетес ҷуфти калид-арзиш ворид карда мешавад. Аз ин рӯ, қолаби махфӣ дар диаграммаҳои мо хеле содда аст.

apiVersion: v1
data:
{{- range $key,$value := .Values.secrets }}
  {{ $key }}: {{ $value | b64enc | quote }}
{{ end }}
kind: Secret
metadata:
  name: "{{ .Chart.Name }}"
  labels:
    chartVersion: "{{ .Chart.Version }}"
    tillerVersion: "{{ .Capabilities.TillerVersion.SemVer }}"
type: Opaque

Мушкилот ва маҳдудиятҳо

Кор бо анборҳои сершумор

Ҳоло мо коркарди диаграммаҳо ва барномаҳоро ҷудо мекунем. Ин маънои онро дорад, ки таҳиягарон бояд дар ду анбори git кор кунанд: яке барои барнома ва дигаре барои муайян кардани ҷойгиркунии он дар Kubernetes. 2 анбори git маънои 2 ҷараёни корро дорад ва барои як навкор ошуфта шудан осон аст.

Идоракунии диаграммаҳои умумӣ душвор аст

Тавре ки мо аллакай гуфта будем, диаграммаҳои умумӣ барои муайян кардани вобастагӣ ва зуд ҷойгиркунии якчанд замимаҳо хеле муфиданд. Аммо мо истифода мебарем --reuse-valuesто ки ҳар дафъае, ки мо барномаеро, ки қисми ин диаграммаи умумӣ аст, ҷойгир кунем, аз гузаштани ҳамаи арзишҳо пешгирӣ кунем.

Дар ҷараёни кории муттасили интиқол, мо танҳо ду арзиш дорем, ки мунтазам тағир меёбанд: шумораи репликаҳо ва теги тасвир (версия). Дигар арзишҳои устувортар дастӣ иваз карда мешаванд ва ин хеле душвор аст. Гузашта аз ин, як хато дар љойгир кардани диаграммаи умумї метавонад ба нокомии љиддї оварда расонад, ки мо аз таљрибаи худ дидаем.

Навсозии якчанд файлҳои конфигуратсия

Вақте ки таҳиякунанда замимаи навро илова мекунад, вай бояд якчанд файлҳоро тағир диҳад: эъломияи барнома, рӯйхати асрор, илова кардани барнома ҳамчун вобастагӣ, агар он ба диаграммаи умумӣ дохил карда шуда бошад.

Иҷозатҳои Ҷенкинс дар Vault хеле васеъ карда шудаанд

Акнун мо якто дорем AppRole, ки тамоми асрорро аз Валт мехонад.

Раванди бозгашт автоматӣ карда нашудааст

Барои бозгашт, шумо бояд фармонро дар якчанд кластер иҷро кунед ва ин бо хатогиҳо зиёд аст. Мо ин амалиётро дастӣ иҷро мекунем, то боварӣ ҳосил кунем, ки ID-и версияи дуруст муайян карда шудааст.

Мо ба сӯи GitOps ҳаракат мекунем

Ҳадафи мо

Мо мехоҳем диаграммаро ба анбори барномае, ки он ҷойгир мекунад, баргардонем.

Ҷараёни кор ҳамон тавре ки барои рушд хоҳад буд. Масалан, вақте ки филиал ба усто тела дода мешавад, ҷойгиркунӣ ба таври худкор оғоз мешавад. Фарқи асосии байни ин равиш ва ҷараёни кори ҷорӣ дар он хоҳад буд ҳама чиз дар git идора карда мешавад (худи барнома ва тарзи ҷойгиркунии он дар Kubernetes).

Якчанд афзалиятҳо вуҷуд доранд:

  • Бисёр равшантар барои таҳиякунанда. Омӯзиши тарзи татбиқи тағйирот дар диаграммаи маҳаллӣ осонтар аст.
  • Таърифи густариши хидмат метавонад муайян карда шавад ҳамон ҷой бо код хизматрасонӣ.
  • Идоракунии бартараф кардани диаграммаҳои умумӣ. Хидмат нашри Helm-и худро дорад. Ин ба шумо имкон медиҳад, ки давраи ҳаёти барномаро (бозгашт, навсозӣ) дар сатҳи хурдтарин идора кунед, то ба хидматҳои дигар таъсир нарасонад.
  • Манфиатҳои git барои идоракунии диаграмма: бекор кардани тағирот, сабти аудит ва ғ. Агар ба шумо лозим ояд, ки тағиротро дар диаграмма бекор кунед, шумо метавонед ин корро бо истифода аз git иҷро кунед. Ҷойгиркунӣ ба таври худкор оғоз меёбад.
  • Шумо метавонед дар бораи такмил додани ҷараёни кории таҳияи худ бо абзорҳо ба монанди Скаффолд, ки бо он таҳиягарон метавонанд тағиротро дар контексти ба истеҳсол наздик санҷанд.

Муҳоҷирати ду марҳила

Таҳиягарони мо ин ҷараёни корро 2 сол боз истифода мебаранд, аз ин рӯ мо мехоҳем, ки муҳоҷират то ҳадди имкон бедард бошад. Аз ин рӯ, мо тасмим гирифтем, ки дар роҳи расидан ба ҳадаф як қадами мобайнӣ илова кунем.
Марҳилаи аввал оддӣ аст:

  • Мо сохтори шабеҳро барои танзими густариши барномаҳо нигоҳ медорем, аммо дар як объекти ягона бо номи DailymotionRelease.

apiVersion: "v1"
kind: "DailymotionRelease"
metadata:
  name: "app1.ns1"
  environment: "dev"
  branch: "mybranch"
spec:
  slack_channel: "#admin"
  chart_name: "app1"
  scaling:
    - context: "dev-us-central1-0"
      replicas:
        - name: "hermes"
          count: 2
    - context: "dev-europe-west1-0"
      replicas:
        - name: "app1-deploy"
          count: 2
  secrets:
    - secret_id: "app1"
      contexts:
        - name: "default"
          vaultPath: "/kv/dev/ns1/app1/test"
          vaultKey: "password"
        - name: "dev-europe-west1-0"
          vaultPath: "/kv/dev/ns1/app1/test"
          vaultKey: "password"

  • 1 релиз барои як барнома (бе диаграммаҳои умумӣ).
  • Диаграммаҳо дар анбори git барнома.

Мо бо ҳамаи таҳиягарон сӯҳбат кардем, бинобар ин раванди муҳоҷират аллакай оғоз шудааст. Марҳилаи аввал то ҳол бо истифода аз платформаи CI назорат карда мешавад. Ман ба зудӣ дар бораи марҳилаи дуюм як мақолаи дигар менависам: чӣ гуна мо ба ҷараёни кории GitOps гузаштем ҷорист,. Ман ба шумо мегӯям, ки мо ҳама чизро чӣ гуна танзим кардем ва бо кадом мушкилот дучор шудем (анборҳои сершумор, асрор ва ғайра). Хабарҳоро пайгирӣ кунед.

Дар ин ҷо мо кӯшиш кардем, ки пешрафти худро дар ҷараёни густариши барномаҳо дар тӯли солҳои охир тавсиф кунем, ки боиси андешаҳо дар бораи равиши GitOps шуд. Мо ҳанӯз ба ҳадаф нарасидем ва дар бораи натиҷаҳо гузориш медиҳем, аммо ҳоло мо итминон дорем, ки вақте ки мо тасмим гирифтем, ки ҳама чизро содда кунем ва онро ба одатҳои таҳиягарон наздик кунем, кори дуруст кардем.

Манбаъ: will.com

Илова Эзоҳ