Zabalení a nasazení helmových grafů – úloha

Azure Pipelines

Pomocí této úlohy můžete nasadit, nakonfigurovat nebo aktualizovat cluster Kubernetes v Azure Container Service spuštěním příkazů Helm. Helm je nástroj, který zjednodušuje nasazování a správu aplikací Kubernetes pomocí formátu balení, který se nazývá grafy.

K definování, verzi, sdílení, instalaci a upgradu i nejsložitější aplikace Kubernetes můžete použít Helm.

  • Helm vám pomůže zkombinovat několik manifestů Kubernetes (yaml), jako jsou služby, nasazení, mapy konfigurace a další, do jedné jednotky nazvané Helm Charts. Nemusíte vynalézat ani používat tokenizaci ani nástroj pro šablonování.
  • Grafy Helm vám pomůžou spravovat závislosti aplikací a nasazovat je a také vrátit zpět jako jednotku. Můžete je také snadno vytvářet, vytvářet verze, publikovat a sdílet s ostatními partnerskými týmy.

Azure Pipelines má integrovanou podporu pro grafy Helm:

  • Úlohu instalačního programu nástroje Helm je možné použít k instalaci správné verze Nástroje Helm na agenty.
  • Balíček Helm a úlohu nasazení je možné použít k zabalení aplikace a nasazení do clusteru Kubernetes. Úlohu můžete použít k instalaci nebo aktualizaci Tilleru na obor názvů Kubernetes, k zabezpečenému připojení k Tilleru přes TLS pro nasazení grafů nebo ke spuštění jakéhokoli příkazu Helm, jako je lint.
  • Úloha Helm podporuje připojení k Azure Kubernetes Service pomocí připojení služby Azure. K libovolnému clusteru Kubernetes se můžete připojit pomocí kubeconfig nebo účtu služby.
  • Nasazení Helm je možné doplnit pomocí úlohy Kubectl. například create/update, imagepullsecret a další.

Připojení služby

Úloha funguje se dvěma typy připojení služby: Azure Resource Manager a Připojení ke službě Kubernetes.

Poznámka

Připojení ke službě se nevyžaduje, pokud už je ve fázi kanálu zadaný prostředek prostředí, který odkazuje na cluster Kubernetes.

Azure Resource Manager

ParametryPopis
connectionType
(Typ připojení služby)
(Vyžaduje se, pokud už není prostředek prostředí k dispozici.) Azure Resource Manager použít Azure Kubernetes Service. Připojení ke službě Kubernetes Service pro jakýkoli jiný cluster.
Výchozí hodnota: Azure Resource Manager
azureSubscriptionEndpoint
(předplatné Azure)
(Povinné) Název připojení služby Azure.
azureResourceGroup
(Skupina prostředků)
(Povinné) Název skupiny prostředků v rámci předplatného.
kubernetesCluster
(cluster Kubernetes)
(Povinné) Název clusteru AKS.
namespace
(Obor názvů)
(Volitelné) Obor názvů, ve kterém jsou příkazy kubectl spuštěny. Pokud není zadaný, použije se výchozí obor názvů.

Tento příklad YAML YAML ukazuje Azure Resource Manager se používá k odkazování na cluster Kubernetes. Používá se s jedním z příkazů Helm a příslušnými hodnotami požadovanými pro příkaz:

variables:
  azureSubscriptionEndpoint: Contoso
  azureContainerRegistry: contoso.azurecr.io
  azureResourceGroup: Contoso
  kubernetesCluster: Contoso

- task: HelmDeploy@0
  displayName: Helm deploy
  inputs:
    connectionType: Azure Resource Manager
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)

Připojení ke službě Kubernetes Service

ParametryPopis
kubernetesServiceEndpoint
(Připojení ke službě Kubernetes)
(Vyžaduje se, pokud už není prostředek prostředí k dispozici.) Vyberte připojení ke službě Kubernetes.
namespace
(Obor názvů)
(Volitelné) Obor názvů, ve kterém jsou příkazy kubectl spuštěny. Pokud není zadaný, použije se výchozí obor názvů.

Tento příklad YAML YAML ukazuje, jak se připojení ke službě Kubernetes používá k odkazování na cluster Kubernetes. Používá se s jedním z příkazů Helm a příslušnými hodnotami požadovanými pro příkaz:

- task: HelmDeploy@0
  displayName: Helm deploy
  inputs:
    connectionType: Kubernetes Service Connection
    kubernetesServiceEndpoint: Contoso

Hodnoty příkazů

Vstup příkazu přijímá jeden z následujících příkazů Helm:create/delete/expose/get/init/install/login/logout/ls/package/rollback/upgrade.

ParametryPopis
command
(Příkaz)
(Povinné) Vyberte příkaz Helm.
Výchozí hodnota: ls
arguments
(Argumenty)
Možnosti příkazu Helm.

Tento příklad YAML ukazuje příkaz ls:

- task: HelmDeploy@0
  displayName: Helm list
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: ls
    arguments: --all

Init – příkaz

ParametryPopis
command
(Příkaz)
(Povinné) Vyberte příkaz Helm.
Výchozí hodnota: ls
canaryimage
(Použití verze kanárové image)
Použijte image Canary Tiller, nejnovější předběžnou verzi Tilleru.
Výchozí hodnota: false
upgradetiller
(Upgrade Tilleru)
Upgradujte, pokud už je Tiller nainstalovaný.
Výchozí hodnota: true
waitForExecution
(Čekání)
Blokujte, dokud se provádění příkazu nedokončí.
Výchozí hodnota: true
arguments
(Argumenty)
Možnosti příkazu Helm.

Tento příklad YAML ukazuje příkaz init:

- task: HelmDeploy@0
  displayName: Helm init
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: init
    upgradetiller: true
    waitForExecution: true
    arguments: --client-only

install – příkaz

ParametryPopis
command
(Příkaz)
(Povinné) Vyberte příkaz Helm.
Výchozí hodnota: ls
chartType
(Typ grafu)
(Povinné) Vyberte, jak chcete zadat informace o grafu. Můžete zadat název chartu nebo cestu ke složce nebo souboru chartu.
Dostupné možnosti: Název, Cesta k souboru. Výchozí hodnota: Název
chartName
(Název grafu)
(Povinné) Odkaz na graf k instalaci, může to být adresa URL nebo název chartu. Pokud je například název chartu stabilní nebo mysql,úloha spustí helm install stable/mysql.
releaseName
(Název verze)
(Volitelné) Název verze. Pokud není zadaný, vygeneruje se automaticky. Vstup releaseName je platný jenom pro příkazy install a upgrade.
overrideValues
(Nastavení hodnot)
(Volitelné) Nastavte hodnoty na příkazovém řádku. Můžete zadat více hodnot oddělením hodnot čárkami. Například key1=val1,key2=val2. Můžete také zadat více hodnot tak, že je oddělujete s novým řádkem:
klíč1 = Val1
key2 = Val2

Všimněte si, že pokud máte hodnotu, která obsahuje newlines, použijte valueFile možnost, jinak bude úloha považovat nový řádek za oddělovač. Úloha vytvoří příkaz Helm pomocí těchto hodnot sady. Například Helm Install--set klíč1 = Val1./Redis
valueFile
(Soubor hodnot)
Volitelné Zadejte hodnoty v souboru YAML nebo v adrese URL. Například zadání MyValues. yaml bude mít za následek Helm Install--Values = MyValues. yaml
updatedependency
(Závislost aktualizace)
Volitelné Před instalací grafu spusťte aktualizaci závislostí Helm. Aktualizujte závislosti z požadavků. yaml je před zabalením do grafu nebo adresáře.
Výchozí hodnota: false
waitForExecution
Čekací
Volitelné Zablokuje, dokud se provádění příkazu nedokončí.
Výchozí hodnota: true
arguments
Náhodné
Možnosti příkazu Helm

Tento YAML příklad ukazuje příkaz install :

- task: HelmDeploy@0
  displayName: Helm install
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: install
    chartType: FilePath
    chartPath: Application/charts/sampleapp

Package – příkaz

ParametryPopis
command
Systému
Požadovanou Vyberte příkaz Helm.
Výchozí hodnota: ls
chartPath
(Cesta k grafu)
Požadovanou Cesta k diagramu, který se má nainstalovat Může se jednat o cestu k zabalenému grafu nebo k cestě k rozbalenému adresáři grafu. Pokud například zadáte ./Redis , úloha se spustí Helm Install./Redis. Pokud pracujete s grafem, který je publikován jako artefakt, bude cesta $ (System. DefaultWorkingDirectory)/ARTIFACT-Name/Charts/Chart-Name
version
Znění
Volitelné Zadejte přesně verzi grafu, která se má nainstalovat. Pokud tento parametr nezadáte, nainstaluje se nejnovější verze. Nastavte verzi v grafu na tuto verzi semver.
destination
Tabulka
Volitelné Zadejte hodnoty v souboru YAML nebo v adrese URL.
Výchozí hodnota: $ (Build. ArtifactStagingDirectory)
updatedependency
(Závislost aktualizace)
Volitelné Před instalací grafu spusťte aktualizaci závislostí Helm. Aktualizujte závislosti z požadavků. yaml je před zabalením do grafu nebo adresáře.
Výchozí hodnota: false
save
Uloží
Volitelné Uložit zabalený graf do úložiště místního grafu
Výchozí hodnota: true
arguments
Náhodné
Možnosti příkazu Helm

Tento YAML příklad ukazuje příkaz balíčku :

- task: HelmDeploy@0
  displayName: Helm package
  inputs:
    command: package
    chartPath: Application/charts/sampleapp
    destination: $(Build.ArtifactStagingDirectory)

upgrade – příkaz

ParametryPopis
command
Systému
Požadovanou Vyberte příkaz Helm.
Výchozí hodnota: ls
chartType
(Typ grafu)
Požadovanou Vyberte, jak chcete zadat informace o grafu. Můžete zadat buď název grafu, nebo cestu ke složce nebo souboru do grafu.
Dostupné možnosti: název, FilePath. Výchozí hodnota: název
chartName
(Název grafu)
Požadovanou Odkaz na graf k instalaci, může to být adresa URL nebo název grafu. Pokud je například název grafu stabilní/MySQL, úloha spustí Helm instalace stabilní/MySQL
releaseName
(Název verze)
Volitelné Název verze Pokud není zadaný, automaticky se vygeneruje.
overrideValues
(Nastavit hodnoty)
Volitelné Nastavte hodnoty na příkazovém řádku. Můžete zadat více hodnot oddělením hodnot čárkami. Například klíč1 = Val1, key2 = Val2. Můžete také zadat více hodnot tak, že je oddělujete s novým řádkem:
klíč1 = Val1
key2 = Val2

Všimněte si, že pokud máte hodnotu, která obsahuje newlines, použijte valueFile možnost, jinak bude úloha považovat nový řádek za oddělovač. Úloha vytvoří příkaz Helm pomocí těchto hodnot sady. Například Helm Install--set klíč1 = Val1./Redis
valueFile
(Soubor hodnot)
Volitelné Zadejte hodnoty v souboru YAML nebo v adrese URL. Například zadání MyValues. yaml bude mít za následek Helm Install--Values = MyValues. yaml
install
(Instalovat, pokud verze není k dispozici)
Volitelné Pokud již neexistuje verze s tímto názvem, spusťte instalaci.
Výchozí hodnota: true
recreate
(Znovu vytvořit lusky)
Volitelné Pokud je to možné, provádí restart lusků u prostředku.
Výchozí hodnota: false
resetValues
(Resetování hodnot)
Volitelné Obnovte hodnoty do těch, které jsou integrovány do grafu.
Výchozí hodnota: false
force
Ode
Volitelné Vynutit aktualizaci prostředků v případě potřeby pomocí Delete nebo Create
Výchozí hodnota: false
waitForExecution
Čekací
Volitelné Zablokuje, dokud se provádění příkazu nedokončí.
Výchozí hodnota: true
arguments
Náhodné
Možnosti příkazu Helm

Tento YAML příklad ukazuje příkaz upgradu :

- task: HelmDeploy@0
  displayName: Helm upgrade
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: upgrade
    chartType: filepath
    chartPath: $(Build.ArtifactStagingDirectory)/sampleapp-v0.2.0.tgz
    releaseName: azuredevopsdemo
    install: true
    waitForExecution: false

Uložit příkaz

ParametryPopis
command
Systému
Požadovanou Vyberte příkaz Helm.
Výchozí hodnota: ls
chartNameForACR
(Název grafu pro Azure Container Registry)
(Povinné) Název grafu, se kterým bude graf uložený v Azure Container Registry.
chartPathForACR
(Cesta grafu pro Azure Container Registry)
(Povinné) Cesta k adresáři chartu.
azureSubscriptionEndpointForACR
(Předplatné Azure pro Container Registry)
(Povinné) Vyberte předplatné Azure s vaším Azure Container Registry.
azureResourceGroupForACR
(Skupina prostředků)
(Povinné) Vyberte skupinu prostředků Azure, která obsahuje vaši Container Registry.
azureContainerRegistry
(Azure Container Registry)
(Povinné) Vyberte instanci Azure Container Registry která se použije k nasazování grafů Helm.
arguments
(Argumenty)
Možnosti příkazu Helm

Tento příklad YAML ukazuje příkaz save:

- task: HelmDeploy@0
  displayName: Helm save
  inputs:
    command: save
    chartNameForACR: mycontainerregistry.azurecr.io/helm/hello-world:v1
    chartPathForACR: Application/charts/sampleapp
    azureSubscriptionEndpointForACR: $(azureSubscriptionEndpointForACR)
    azureResourceGroupForACR: $(azureResourceGroupForACR)
    azureContainerRegistry: $(azureContainerRegistry)

Balení a podepisování grafů Helm

V této části se dozvíte, jak zabalit a podepsat grafy Helm v kanálu.

Vygenerování páru privátního a veřejného klíče pro podepisování chartu Helm pomocí GPG

  1. Stáhněte si GPG.

  2. Spusťte příkazový řádek v režimu správce. Spuštěním následujícího příkazu vygenerujte pár privátního a veřejného klíče, který podepíše chart Helm pomocí gpg. Při vytváření klíče se zobrazí výzva k zadání uživatelského jména a e-mailové adresy. Název vytvořeného páru privátního a veřejného klíče se později použije jako "jmenná e-mailová adresa".

    gpg --full-generate-key
    

    Vygenerování klíče

  3. Zobrazí se výzva k zadání hesla. Dejte hodnotu a klikněte na OK.

    Snímek obrazovky znázorňuje poskytnutí přístupové fráze

  4. Po vytvoření klíče můžete pomocí následujícího příkazu zobrazit seznam klíčů, které obsahují privátní i veřejné klíče.

    • Zobrazení seznamu privátních klíčů

      gpg --list-secret-keys
      

      Privátní klíče

    • Zobrazení seznamu veřejných klíčů

      gpg --list-keys
      

      Veřejné klíče

  5. Privátní a veřejné klíče uložte do 2 různých souborů s příponou gpg, jak je znázorněno níže.

    • Privátní klíč
    gpg --export-secret-key 94325E18E53EDD99DD8339C3CFD9DAF0707CB788 contoso@microsoft.com > C:/somepath/privatekeys.gpg
    

    Uvidíte, že se soubor privatekeys.gpg exportoval do cesty uvedené výše.

    • Pro veřejný klíč
    gpg --export-key 94325E18E53EDD99DD8339C3CFD9DAF0707CB788 contoso@microsoft.com > C:/somepath/publickey.gpg
    

    Uvidíte, že se soubor publickey.gpg exportoval do cesty uvedené výše.

V Azure DevOps uložte soubor privatekey.gpg do části Soubory zabezpečení knihovny.

Příklad

pool:
  name: Hosted Ubuntu 1604

variables:
  # The below variable should be secure
  HelmKeyPassphrase: contoso@123
  keyName: contoso contoso@microsoft.com
  azureSubscriptionEndpoint: contoso
  azureResourceGroup: contoso
  kubernetesCluster: contoso

steps:
- task: DownloadSecureFile@1
  displayName: Download Secure file
  inputs:
    secureFile: privatekey.gpg
  name: privateKeyRing

- task: HelmInstaller@0
  displayName: Install Helm 2.12.0
  inputs:
    helmVersion: 2.12.0

- task: HelmDeploy@0
  displayName: helm init
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: init
    arguments: --client-only

- task: HelmDeploy@0
  displayName: helm package
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: package
    chartPath: Application/charts/sampleapp
    arguments: --sign --key "$(keyName)" --keyring $(privateKeyRing.secureFilePath)
  env:
    HelmKeyPassphrase: $(HelmKeyPassphrase)

Řešení potíží

Úloha HelmDeploy při spuštění helm init --wait --client-only v Helmu verze 3.0.2 vyvolá chybu neznámý příznak: --wait.

Mezi Helmem 2 a Helmem 3 došlo k některým změnám. Jeden z nich zahrnuje odebrání Tilleru, a proto helm init se příkaz už nepodporuje. Pokud používáte Helm verze 3.0 nebo novější, odeberte příkaz init.

Pokud používáte Helm 3 a System.debug je nastavená na true a používá se upgrade Helmu, kanál selže, i když upgrade byl úspěšný.

Jedná se o známý problém v Helmu 3, který některé protokoly zapisuje do výstupu stderr. Úloha HelmDeploy se označí jako neúspěšná, pokud výstup stderr obsahuje protokoly nebo je ukončovací kód nenulový. Nastavte vstup úlohy failOnStderr: false, aby se protokoly zapisované do výstupu stderr ignorovaly.

Open source

Tato úloha je open source na GitHub. Zpětnou vazbu a příspěvky jsou vítané.