U dispusitivu Helm è i so trappule

U dispusitivu Helm è i so trappule
Cuncepimentu di trasportatore di merci Typhon, Anton Swanepoel

Mi chjamu Dmitry Sugrobov, sò un sviluppatore in Leroy Merlin. In l'articulu vi diceraghju perchè Helm hè necessariu, cumu si simplificà u travagliu cù Kubernetes, ciò chì hà cambiatu in a terza versione, è cumu l'utilizanu per aghjurnà l'applicazioni in produzzione senza downtime.

Questu hè un riassuntu basatu annantu à un discorsu in una cunferenza Conferenza @Kubernetes by Mail.ru Soluzioni Cloud Se ùn vulete micca leghje, fighjate u video.

Perchè usemu Kubernetes in a produzzione

Leroy Merlin hè u capu in u mercatu di bricolage in Russia è in Europa. A nostra cumpagnia hà più di centu sviluppatori, impiegati internu 33 è un gran numaru di persone chì visitanu ipermercati è u situ. Per fà tutti felici, avemu decisu di aderisce à u standard di l'industria. Sviluppà novi applicazioni cù l'architettura di microserviziu; aduprà cuntenituri per isolà l'ambienti è furnisce currettamente; è per l'orchestrazione utilizate Kubernetes. U prezzu di l'usu di l'orchestratori hè diventatu rapidamente più prezzu: u numeru di ingegneri chì pussede a tecnulugia hè in crescita in u mercatu, è i fornituri appariscenu chì offre Kubernetes cum'è serviziu.

Tuttu ciò chì Kubernetes faci, sicuru, pò esse fattu in altre manere, per esempiu, smearing some Jenkins and docker-compose with scripts, ma perchè cumplicà a vita s'ellu ci hè una suluzione pronta è affidabile? Dunque, avemu ghjuntu à Kubernetes è l'avete aduprà in a produzzione dapoi un annu. Avemu avà vinti-quattru clusters Kubernetes, u più anticu di quale hè più di un annu cù circa dui centu pods.

A maledizione di un gran numaru di schedari YAML in Kubernetes

Per eseguisce un microserviziu in Kubernetes, creeremu almenu cinque file YAML: per Deployment, Service, Ingress, ConfigMap, Secrets - è mandà à u cluster. Per a prossima applicazione, scriveremu u stessu pacchettu di yamliki, cù u terzu - un altru, è cusì. Multiplicà u nùmeru di documenti per u nùmeru di ambienti, avemu digià cintunari di schedari, è questu ùn hè mancu piglià in contu l'ambienti dinamichi.

U dispusitivu Helm è i so trappule
Adam Reese, u manutentore core di Helm, hà introduttu u cuncettu di "Ciclu di sviluppu in Kubernetes", chì pare cusì:

  1. Copia YAML - Copia un schedariu YAML.
  2. Paste YAML - incollà.
  3. Fix Indents - Fix Indents.
  4. Repeat - ripetite dinò.

L'opzione funziona, ma avete da copià i schedari YAML parechje volte. Per cambià stu ciculu, sò ghjunti cù Helm.

Cosa hè helm

Prima, Helm gestore di pacchetti, chì vi aiuta à truvà è installà i prugrammi chì avete bisognu. Per installà, per esempiu, MongoDB, ùn avete micca bisognu à andà à u situ ufficiale è scaricate binari, basta eseguite u cumandimu. helm install stable/mongodb.

Siconda, Helm - mutore di mudellu, aiuta à parametrizà i schedari. Riturnemu à a situazione cù i schedari YAML in Kubernetes. Hè più faciule per scrive u stessu schedariu YAML, aghjunghje un pocu di placeholder à questu, in quale Helm sustituverà i valori. Vale à dì, invece di un grande gruppu di yamliks, ci sarà un set di mudelli (templates) in quale i valori necessarii seranu sustituiti à u mumentu propiu.

In terzu, Helm - assistente di implementazione. Cù ellu, pudete installà, rollback è aghjurnà l'applicazioni. Videmu cumu fà.

U dispusitivu Helm è i so trappule

Cumu aduprà Helm per implementà e vostre propiu applicazioni

Installa u cliente Helm in l'urdinatore, seguitu l'ufficiale instructions. Allora creeremu un set di schedari YAML. Invece di specificà i valori specifichi, lassemu i placeholders chì Helm compie cù informazioni in u futuru. Un settore di tali schedari hè chjamatu Helm chart. Pò esse mandatu à u cliente di a consola Helm in trè manere:

  • specificà un cartulare cù mudelli;
  • pack in un archiviu .tar è punta à questu;
  • mette u mudellu in un repository remoto è aghjunghje un ligame à u repository in u cliente Helm.

Avete ancu bisognu di un schedariu cù valori \uXNUMXb\uXNUMXb- values.yaml. I dati da quì seranu rimpiazzati in u mudellu. Creemu ancu.

U dispusitivu Helm è i so trappule
A seconda versione di Helm hà una applicazione di servitore addiziale chjamata Tiller. Si ferma fora di Kubernetes è aspetta richieste da u cliente Helm, è quandu chjamatu, sustituisci i valori necessarii in u mudellu è u manda à Kubernetes.

U dispusitivu Helm è i so trappule
Helm 3 hè più simplice: invece di trasfurmà mudelli nantu à u servitore, l'infurmazione hè issa trattata interamente in u latu di u cliente Helm è mandatu direttamente à l'API Kubernetes. Questa simplificazione mellora a sicurità di u cluster è facilita u schema di rollout.

Cumu tuttu funziona

Eseguite u cumandamentu helm install. Specificate u nome di a versione di l'applicazione, dà a strada à values.yaml. À a fine, avemu da specificà u repositoriu chì cuntene u graficu è u nome di u graficu. In l'esempiu, questi sò "lmru" è "bestchart" rispettivamente.

helm install --name bestapp --values values.yaml lmru/bestchart

Esecuzione di u cumandamentu hè pussibile solu una volta, quandu re-executing invece di install bisognu à aduprà upgrade. Per simplicità, invece di dui cumandamenti, pudete eseguisce u cumandamentu upgrade cù una chjave supplementaria --install. À a prima esecuzione, Helm mandarà un cumandamentu per installà a liberazione, è in u futuru l'aghjurnà.

helm upgrade --install bestapp --values values.yaml lmru/bestchart

Insidie ​​di implementà novi versioni di l'applicazione cù Helm

À questu puntu di a storia, aghju ghjucatu Who Wants to Be a Millionaire cù l'audienza è avemu capitu cumu fà Helm per aghjurnà a versione di l'app. Vede u video.

Quandu aghju studiatu u travagliu di Helm, sò stata sorpresa da u cumpurtamentu stranu quandu pruvate d'aghjurnà e versioni di l'applicazioni in esecuzione. Aghju aghjurnatu u codice di l'applicazione, aghju carricatu una nova maghjina à u registru docker, mandatu u cumandamentu per implementà - è nunda hè accadutu. Quì sottu sò qualchi modi micca cusì boni per aghjurnà l'applicazioni. Studiendu ognuna di elli in più detail, avete principiatu à capisce a struttura interna di l'instrumentu è i mutivi di stu cumpurtamentu micca evidenti.

Metudu 1. Ùn cambiate micca l'infurmazioni da l'ultima corsa

Cume si dice situ ufficiali Helm, "I grafici di Kubernetes ponu esse grandi è cumplessi, cusì Helm prova di mantene e cose simplici quant'è pussibule". Dunque, se aghjurnà l'ultima versione di l'imaghjini di l'applicazione in u registru docker è eseguite u cumandamentu helm upgrade, tandu ùn succede nunda. Helm penserà chì nunda hà cambiatu è ùn ci hè bisognu di mandà un cumandamentu à Kubernetes per aghjurnà l'applicazione.

In seguitu, l'ultimu tag hè mostratu solu cum'è un esempiu. Quandu sta tag hè specificatu, Kubernetes scaricarà l'imaghjini da u registru docker ogni volta, indipendentemente da u paràmetru imagePullPolicy. L'usu di l'ultime in a produzzione hè indesevule è provoca effetti latu.

Metudu 2. Update LABEL in l'imagine

Cum'è scrittu in u listessu ducumentazione, "Helm aghjurnà solu una app s'ellu hè cambiatu da l'ultima versione". L'opzione logica per questu seria d'aghjurnà l'LABEL in l'imaghjini docker stessu. Tuttavia, Helm ùn guarda micca in l'imaghjini di l'applicazioni è ùn hè micca cuscente di alcunu cambiamenti à elli. In cunsiquenza, quandu aghjurnà e etichette in l'imaghjini, Helm ùn sapi micca di elli, è u cumandamentu di l'aghjurnamentu di l'applicazione ùn serà micca ricevutu in Kubernetes.

Metudu 3. Aduprà a chjave --force

U dispusitivu Helm è i so trappule
Andemu à i manuali è cercate a chjave ghjusta. A chjave chì face u più sensu --force. Malgradu u nome chì dice, u cumpurtamentu differisce da ciò chì hè previstu. Invece di un aghjurnamentu furzatu di l'applicazione, u so veru scopu hè di restaurà una liberazione chì hè in u statu FAILED. Se ùn aduprate micca sta chjave, allora avete bisognu di eseguisce cumandamenti in sequenza helm delete && helm install --replace. Invece, hè cunsigliatu di utilizà a chjave --force, chì automatizza l'esekzione sequenziale di sti cumandamenti. Più infurmazione in questu pull request. Per dì à Helm per aghjurnà a versione di l'applicazione, sfurtunatamenti, sta chjave ùn funziona micca.

Metudu 4. Cambia l'etichette direttamente in Kubernetes

U dispusitivu Helm è i so trappule
Aghjurnà l'etichetta direttamente in cluster usendu u cumandamentu kubectl edit - mala idea. Questa azione porta à l'incongruenza di l'infurmazioni trà l'applicazione in esecuzione è quella chì hè stata urigginariamente mandata per a implementazione. U cumpurtamentu di Helm durante a implementazione in questu casu difiere da a so versione: Helm 2 ùn farà nunda, è Helm 3 implementarà una nova versione di l'applicazione. Per capisce u mutivu, avete bisognu di capiscenu cumu travaglia Helm.

Cumu funziona Helm

Per stabilisce se una applicazione hè cambiata da l'ultima versione, Helm pò aduprà:

  • una applicazione in esecuzione in Kubernetes;
  • new values.yaml è chart currenti;
  • L'infurmazioni di liberazione interna di Helm.

Per i più curiosi: induve Helm guarda l'infurmazioni di liberazione interna?Eseguendu u cumandamentu helm history, Averemu tutte l'infurmazioni nantu à e versioni installate cù Helm.

U dispusitivu Helm è i so trappule
Ci hè ancu infurmazione dettagliata nantu à i mudelli mandati è i valori. Pudemu dumandà:

U dispusitivu Helm è i so trappule
In a seconda versione di Helm, questa informazione hè in u stessu spaziu di nomi induve Tiller hè in esecuzione (per default, kube-system), in u ConfigMap, marcatu cù l'etichetta "OWNER = TILLER":

U dispusitivu Helm è i so trappule
À u mumentu di l'apparizione di a terza versione di Helm, l'infurmazione si trasfirìu à i sicreti, in più, à u stessu spaziu di nomi induve l'applicazione hè in esecuzione. Grazie à questu, hè diventatu pussibule di eseguisce parechje applicazioni simultaneamente in spazii di nomi diffirenti cù u stessu nome di liberazione. In a seconda versione, era un severu mal di testa quandu i spazii di nomi sò isolati, ma ponu influenzà l'altri.

U dispusitivu Helm è i so trappule

U secondu Helm, quandu prova à capisce s'ellu hè necessariu un aghjurnamentu, usa solu duie fonti d'infurmazioni: ciò chì hè statu furnitu avà, è l'infurmazioni internu nantu à e versioni, chì si trova in u ConfigMap.

U dispusitivu Helm è i so trappule
U terzu Helm usa una strategia di fusione à trè direzioni: in più di questa informazione, piglia ancu in contu l'applicazione chì hè in esecuzione avà in Kubernetes.

U dispusitivu Helm è i so trappule
Per questu causa, a versione antica di Helm ùn hà micca fattu nunda, perchè ùn hà micca cunsideratu l'infurmazioni di l'applicazione in u cluster, ma Helm 3 riceverà i cambiamenti è mandà a nova applicazione per a implementazione.

Metudu 5: Utilizà a chjave --recreate-pods

Cù una chjave --recreate-pods pudete ottene ciò chì era urigginariamente pianificatu per esse acquistatu cù a chjave --force. I cuntenituri riavviaranu è, secondu l'imagePullPolicy: Sempre a pulitica per l'ultima tag (più nantu à questu in a nota sopra), Kubernetes scaricarà è eseguirà a nova versione di l'imaghjini. Questu ùn serà micca fattu in u megliu modu: senza piglià in contu u StrategyType di a implementazione, spegnerà bruscamente tutte e vechji istanze di l'applicazione è andarà à lancià novi. Durante u riavviu, u sistema ùn funziona micca, l'utilizatori soffrenu.

In Kubernetes stessu, un prublema simili esiste ancu per un bellu pezzu. È avà, 4 anni dopu l'apertura alba, U prublema hè stata riparata, è cuminciendu cù a versione 1.15 di Kubernetes, a pussibilità di rolling-restart pods appare.

Helm disattiva solu tutte l'applicazioni è lancia novi cuntenituri vicinu. In a pruduzzione, ùn pudete micca fà questu, per ùn causà micca una applicazione simplice. Questu hè necessariu solu per i bisogni di sviluppu, pò esse fattu solu in ambienti di scena.

Cumu aghjurnà a versione di l'app cù Helm?

Cambiaremu i valori mandati à Helm. Di genere, questi sò valori chì sò sustituiti per l'etichetta di l'imaghjini. In u casu di l'ultime, chì hè spessu usatu per l'ambienti non pruduttivi, l'annotazione agisce cum'è infurmazione mutabile, chì hè inutile per Kubernetes stessu, è per Helm agisce cum'è un signalu per aghjurnà l'applicazione. Opzioni di riempimentu di valore di annotazione:

  1. valore aleatoriu usendu a funzione standard {{ randAlphaNum 6 }}.
    Ci hè una sfumatura: dopu ogni implementazione cù un graficu cù una tale variabile, u valore di l'annotazione serà unicu, è Helm assumerà chì ci sò cambiamenti. Ci hè chì avemu sempre riavvia l'applicazione, ancu s'ellu ùn avemu micca cambiatu a so versione. Questu ùn hè micca criticu, postu chì ùn ci sarà micca downtime, ma sempre dispiacevule.
  2. Inserite currente data è ora - {{ .Release.Date }}.
    Una variante hè cum'è un valore aleatoriu cù una variabile permanentemente unica.
  3. Un modu megliu hè di utilizà checksums. Questu hè u SHA di l'imaghjini o u SHA di l'ultimu commit in u git - {{ .Values.sha }}.
    Anu bisognu à esse cuntatu è mandatu à u cliente Helm da u latu di a chjama, per esempiu in Jenkins. Se l'applicazione hà cambiatu, allora u checksum cambia ancu. Dunque, Helm aghjurnerà l'applicazione solu quandu hè necessariu.

Riassumemu i nostri sforzi

  • Helm fa cambiamenti in u modu menu invasivu, cusì ogni cambiamentu à u livellu di l'imaghjini di l'applicazione in u Registru Docker ùn hà micca risultatu in un aghjurnamentu: nunda ùn succederà dopu chì u cumandamentu hè eseguitu.
  • Chjave --force utilizatu per riparà e versioni problematiche è ùn hè micca assuciatu cù un aghjurnamentu forzatu.
  • Chjave --recreate-pods aghjurnà furzamente l'applicazioni, ma farà in modu vandalu: spegnerà bruscamente tutti i cuntenituri. L'utilizatori soffrenu di questu, ùn vale a pena fà questu nantu à a vendita.
  • Fate direttamente cambiamenti à u cluster Kubernetes cù u cumandimu kubectl edit ùn fate micca: romperemu a coherenza, è u cumpurtamentu serà diversu secondu a versione di Helm.
  • Cù a liberazione di a nova versione di Helm, parechji sfumature sò apparsu. I prublemi in u repositoriu Helm sò descritti in una lingua chjara, vi aiutanu à capisce i dettagli.
  • Aghjunghjendu una annotazione mutabile à un graficu a renderà più flexible. Questu permetterà à l'applicazione di stenderà currettamente, senza tempi di inattività.

Pensatu da a categuria di "paci in u mondu", travagliendu in tutti i campi di a vita: leghjite l'urdinamentu prima di l'usu, micca dopu. Solu avè una infurmazione cumpleta serà pussibule di custruisce sistemi affidabili è rende felici l'utilizatori.

Altri ligami cunnessi:

  1. Cunniscenza cù Helm 3
  2. U situ ufficiale di Helm
  3. Repository Helm in GitHub
  4. 25 Strumenti Kubernetes Utili: Impiegazione è Gestione

Stu rapportu hè statu prima presentatu à Conferenza @Kubernetes da Mail.ru Cloud Solutions. Vede видео altre prestazioni è abbonate à l'annunzii di l'avvenimenti in Telegram Intornu à Kubernetes in Mail.ru Group.

Source: www.habr.com

Add a comment