I-deploy ang mga aplikasyon sa daghang Kubernetes cluster gamit ang Helm

Giunsa paggamit sa Dailymotion ang Kubernetes: Pag-deploy sa Aplikasyon

Kami sa Dailymotion nagsugod sa paggamit sa Kubernetes sa produksiyon 3 ka tuig na ang milabay. Apan ang pag-deploy sa mga aplikasyon sa daghang mga cluster makalingaw, mao nga sa miaging pipila ka tuig naningkamot kami nga mapaayo ang among mga himan ug mga workflow.

Diin kini nagsugod

Dinhi among hisgotan kung giunsa namo pag-deploy ang among mga aplikasyon sa daghang Kubernetes clusters sa tibuok kalibutan.

Aron ma-deploy ang daghang mga butang sa Kubernetes sa usa ka higayon, among gigamit Helm, ug ang tanan namong mga tsart gitipigan sa usa ka git repository. Aron ma-deploy ang usa ka bug-os nga stack sa aplikasyon gikan sa daghang mga serbisyo, gigamit namon ang gitawag nga summary chart. Sa tinuud, kini usa ka tsart nga nagpahayag sa mga dependency ug gitugotan ka nga masugdan ang API ug ang mga serbisyo niini sa usa ka mando.

Nagsulat usab kami usa ka gamay nga script sa Python sa ibabaw sa Helm aron maghimo mga tseke, paghimo og mga tsart, pagdugang mga sekreto, ug pag-deploy sa mga aplikasyon. Ang tanan nga kini nga mga buluhaton gihimo sa usa ka sentral nga platform sa CI gamit ang imahe sa docker.

Adto ta sa punto.

Nota. Samtang gibasa nimo kini, ang una nga kandidato sa pagpagawas alang sa Helm 3 gipahibalo na. Ang nag-unang bersyon naglangkob sa usa ka bug-os nga host sa mga kalamboan aron matubag ang pipila sa mga isyu nga among nasugatan kaniadto.

Workflow sa pagpalambo sa tsart

Gigamit namo ang branching alang sa mga aplikasyon, ug nakahukom kami nga gamiton ang samang paagi sa mga tsart.

  • Sanga dev gigamit sa paghimo og mga tsart nga pagasulayan sa development clusters.
  • Kung ang usa ka hangyo sa pagbitad gisumite sa agalon, sila gisusi sa dula.
  • Sa katapusan, naghimo kami usa ka hangyo sa pagbitad aron itugyan ang mga pagbag-o sa sanga prod ug ipadapat kini sa produksiyon.

Ang matag palibot adunay kaugalingon nga pribadong tipiganan nga nagtipig sa among mga tsart, ug among gigamit Chartmuseum nga adunay mapuslanon kaayo nga mga API. Niining paagiha atong masiguro ang higpit nga pagkahimulag tali sa mga palibot ug tinuod nga kalibutan nga pagsulay sa mga tsart sa wala pa kini gamiton sa produksiyon.

Mga tipiganan sa tsart sa lainlaing mga palibot

Angay nga hinumdoman nga kung ang mga developer magduso sa usa ka dev branch, usa ka bersyon sa ilang tsart ang awtomatiko nga giduso sa dev Chartmuseum. Sa ingon, ang tanan nga mga developer naggamit sa parehas nga repository sa dev, ug kinahanglan nimo nga ipiho pag-ayo ang imong bersyon sa tsart aron dili aksidente nga magamit ang mga pagbag-o sa uban.

Dugang pa, ang among gamay nga script sa Python nag-validate sa mga butang sa Kubernetes batok sa gigamit nga mga detalye sa Kubernetes OpenAPI Kubeval, sa wala pa kini imantala sa Chartmusem.

Kinatibuk-ang paghulagway sa workflow sa pag-uswag sa tsart

  1. Pag-set up sa mga buluhaton sa pipeline sumala sa espesipikasyon gazr.io alang sa pagkontrol sa kalidad (lint, unit-test).
  2. Pagduso sa usa ka docker nga imahe gamit ang mga himan sa Python nga nag-deploy sa among mga aplikasyon.
  3. Pagpahimutang sa palibot pinaagi sa ngalan sa sanga.
  4. Pag-validate sa Kubernetes yaml files gamit ang Kubeval.
  5. Awtomatikong dugangan ang bersyon sa usa ka tsart ug ang ginikanan nga mga tsart niini (mga tsart nga nagdepende sa tsart nga giusab).
  6. Pagsumite ug tsart sa usa ka Chartmuseum nga mohaum sa palibot niini

Pagdumala sa mga kalainan sa mga cluster

Federation of Clusters

Naay time nga nigamit mi pederasyon sa Kubernetes clusters, diin ang mga butang sa Kubernetes mahimong madeklarar gikan sa usa ka endpoint sa API. Apan mitungha ang mga problema. Pananglitan, ang ubang mga butang sa Kubernetes dili mahimo sa katapusan sa federation, nga nagpalisud sa pagpadayon sa mga federated nga mga butang ug uban pang mga butang alang sa indibidwal nga mga cluster.

Aron masulbad ang problema, nagsugod kami sa pagdumala sa mga pungpong nga independente, nga gipayano pag-ayo ang proseso (gigamit namo ang unang bersyon sa pederasyon; tingali adunay nausab sa ikaduha).

Geo-apod-apod nga plataporma

Ang among plataporma karon giapod-apod sa 6 ka rehiyon - 3 sa lokal ug 3 sa panganod.


Gipanagtag nga Deployment

Mga bili sa Global Helm

Gitugotan ka sa 4 nga global nga Helm nga mga kantidad nga mahibal-an ang mga kalainan tali sa mga kumpol. Ang tanan namon nga mga tsart adunay default nga minimum nga mga kantidad.

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

Global nga mga bili

Kini nga mga kantidad makatabang sa paghubit sa konteksto alang sa among mga aplikasyon ug gigamit alang sa lainlaing mga katuyoan: pag-monitor, pagsubay, pag-log, paghimo sa gawas nga mga tawag, pag-scale, ug uban pa.

  • "cloud": Kami adunay hybrid nga Kubernetes nga plataporma. Pananglitan, ang among API gi-deploy sa GCP zones ug sa among mga data center.
  • "env": Ang ubang mga kantidad mahimong mausab alang sa dili produksyon nga mga palibot. Pananglitan, ang mga kahulugan sa kapanguhaan ug mga pag-configure sa autoscaling.
  • "rehiyon": Kini nga impormasyon makatabang sa pagtino sa nahimutangan sa cluster ug mahimong gamiton sa pagdeterminar sa duol nga mga endpoint alang sa gawas nga mga serbisyo.
  • "clusterName": kung ug kanus-a gusto namon nga ipasabut ang usa ka kantidad alang sa usa ka indibidwal nga cluster.

Ania ang usa ka piho nga pananglitan:

{{/* 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 -}}

Pananglitan sa helm template

Kini nga lohika gihubit sa usa ka template sa katabang aron malikayan ang pagkalat sa Kubernetes YAML.

Pagpahibalo sa Aplikasyon

Ang among mga himan sa pag-deploy gibase sa daghang mga file sa YAML. Sa ubos usa ka pananglitan kung giunsa namo pagdeklara ang usa ka serbisyo ug ang topology sa pag-scale niini (gidaghanon sa mga replika) sa usa ka cluster.

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

Kahulugan sa Serbisyo

Kini usa ka outline sa tanan nga mga lakang nga nagtino sa among deployment workflow. Ang katapusang lakang nag-deploy sa aplikasyon sa daghang mga cluster sa trabahante nga dungan.


Mga Lakang sa Pag-deploy ni Jenkins

Komosta ang mga sekreto?

Mahitungod sa seguridad, among gisubay ang tanang sekreto gikan sa lain-laing mga dapit ug gitipigan kini sa usa ka talagsaon nga vault Vault sa Paris.

Ang among mga himan sa pag-deploy nagkuha sa mga sekreto nga kantidad gikan sa Vault ug, kung moabut ang oras sa pag-deploy, isulud kini sa Helm.

Aron mahimo kini, among gihubit ang usa ka mapping tali sa mga sekreto sa Vault ug sa mga sekreto nga gikinahanglan sa among mga aplikasyon:

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"

  • Among gihubit ang kinatibuk-ang mga lagda nga sundon kung magrekord sa mga sekreto sa Vault.
  • Kung ang sekreto magamit sa usa ka piho nga konteksto o cluster, kinahanglan nimong idugang ang usa ka piho nga entry. (Dinhi ang cluster1 sa konteksto adunay kaugalingon nga kantidad alang sa sekreto nga stack-app1-password).
  • Kung dili ang bili gigamit pinaagi sa default.
  • Alang sa matag aytem niini nga lista sa Kubernetes sekreto usa ka key-value pares ang gisal-ot. Busa, ang sekreto nga template sa among mga tsart kay yano ra kaayo.

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

Mga problema ug limitasyon

Pagtrabaho uban ang daghang mga repositoryo

Karon gibulag namon ang pag-uswag sa mga tsart ug aplikasyon. Kini nagpasabot nga ang mga developers kinahanglan nga magtrabaho sa duha ka git repository: ang usa alang sa aplikasyon, ug ang usa alang sa pagtino sa deployment niini ngadto sa Kubernetes. Ang 2 git repository nagpasabot ug 2 ka workflows, ug sayon ​​ra para sa usa ka newbie nga maglibog.

Ang pagdumala sa mga kinatibuk-ang tsart usa ka hasol

Sama sa giingon na namon, ang mga generic nga tsart mapuslanon kaayo alang sa pag-ila sa mga dependency ug dali nga pag-deploy sa daghang mga aplikasyon. Apan gigamit namo --reuse-valuesaron malikayan ang pagpasa sa tanan nga mga kantidad matag higayon nga mag-deploy kami usa ka aplikasyon nga bahin sa kini nga kinatibuk-ang tsart.

Sa padayon nga paghatud sa workflow, kami adunay duha ra nga mga kantidad nga kanunay nga nagbag-o: ang gidaghanon sa mga replika ug ang tag sa imahe (bersyon). Ang uban, mas lig-on nga mga kantidad giusab sa mano-mano, ug kini lisud kaayo. Dugang pa, ang usa ka sayup sa pag-deploy sa usa ka kinatibuk-an nga tsart mahimong mosangput sa grabe nga mga kapakyasan, sama sa nakita namon gikan sa among kaugalingon nga kasinatian.

Pag-update sa daghang mga file sa pag-configure

Kung ang usa ka developer nagdugang usa ka bag-ong aplikasyon, kinahanglan niyang usbon ang daghang mga file: ang deklarasyon sa aplikasyon, ang lista sa mga sekreto, pagdugang ang aplikasyon ingon usa ka dependency kung kini gilakip sa kinatibuk-ang tsart.

Ang mga pagtugot ni Jenkins gipalapdan ra kaayo sa Vault

Karon kami adunay usa AppRole, nga nagbasa sa tanan nga mga sekreto gikan sa Vault.

Ang proseso sa rollback dili awtomatiko

Aron ma-rollback, kinahanglan nimo nga ipadagan ang mando sa daghang mga pungpong, ug kini puno sa mga sayup. Gibuhat namo kini nga operasyon sa mano-mano aron masiguro nga ang husto nga bersyon ID gitakda.

Naglihok kami padulong sa GitOps

Atong tumong

Gusto namon nga ibalik ang tsart sa repository sa aplikasyon nga gi-deploy niini.

Ang dagan sa trabaho mahimong parehas sa pag-uswag. Pananglitan, kung ang usa ka sanga giduso sa pag-master, ang pag-deploy awtomatiko nga ma-trigger. Ang nag-unang kalainan tali niini nga pamaagi ug sa kasamtangan nga workflow mao kana ang tanan madumala sa git (ang aplikasyon mismo ug ang paagi sa pag-deploy niini sa Kubernetes).

Adunay daghang mga bentaha:

  • Daghan mas klaro alang sa developer. Mas sayon ​​ang pagkat-on unsaon paggamit sa mga kausaban sa lokal nga tsart.
  • Ang kahulugan sa pag-deploy sa serbisyo mahimong matino parehas nga lugar sa code serbisyo.
  • Pagdumala sa pagtangtang sa mga kinatibuk-ang tsart. Ang serbisyo adunay kaugalingon nga pagpagawas sa Helm. Makatugot kini kanimo sa pagdumala sa lifecycle sa aplikasyon (rollback, upgrade) sa pinakagamay nga lebel, aron dili makaapekto sa ubang mga serbisyo.
  • Mga kaayohan sa git alang sa pagdumala sa tsart: i-undo ang mga pagbag-o, audit log, ug uban pa. Kung kinahanglan nimo nga i-undo ang usa ka pagbag-o sa usa ka tsart, mahimo nimo kini gamit ang git. Ang pag-deploy awtomatiko nga magsugod.
  • Mahimo nimong hunahunaon ang pagpaayo sa imong workflow sa pag-uswag gamit ang mga himan sama Skaffold, diin masulayan sa mga developer ang mga pagbag-o sa konteksto nga hapit sa produksiyon.

Duha ka lakang nga paglalin

Gigamit na sa among mga developer kini nga workflow sulod sa 2 ka tuig na, busa gusto namo nga ang paglalin mahimong walay sakit kutob sa mahimo. Busa, kami nakahukom sa pagdugang sa usa ka intermediate nga lakang sa dalan ngadto sa tumong.
Ang unang yugto mao ang yano:

  • Nagtipig kami usa ka parehas nga istruktura alang sa pag-set up sa pag-deploy sa aplikasyon, apan sa usa ka butang nga gitawag 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 nga pagpagawas sa matag aplikasyon (walay mga kinatibuk-ang tsart).
  • Mga tsart sa git repository sa aplikasyon.

Nakigsulti kami sa tanan nga mga developer, mao nga nagsugod na ang proseso sa paglalin. Ang unang yugto kontrolado gihapon gamit ang CI nga plataporma. Mosulat ko og laing post sa dili madugay bahin sa hugna sa duha: kung giunsa kami mibalhin sa usa ka workflow sa GitOps modagayday. Isulti ko kanimo kung giunsa namon gipahimutang ang tanan ug kung unsang mga kalisud ang among nasugatan (daghang mga repository, mga sekreto, ug uban pa). Sunda ang balita.

Dinhi gisulayan namon nga ihulagway ang among pag-uswag sa workflow sa pag-deploy sa aplikasyon sa miaging mga tuig, nga mitultol sa mga hunahuna bahin sa pamaagi sa GitOps. Wala pa namo maabot ang tumong ug i-report ang mga resulta, apan karon kombinsido kami nga gibuhat namo ang husto nga butang sa dihang mihukom kami nga pasimplehon ang tanan ug ipaduol kini sa mga batasan sa mga developers.

Source: www.habr.com

Idugang sa usa ka comment