Partilhar via


KubernetesManifest@1 - Tarefa Implantar no Kubernetes v1

Use os arquivos de manifesto do Kubernetes para implantar em clusters ou até mesmo compile os arquivos de manifesto a serem usados para implantações usando gráficos Helm.

Sintaxe

# Deploy to Kubernetes v1
# Use Kubernetes manifest files to deploy to clusters or even bake the manifest files to be used for deployments using Helm charts.
- task: KubernetesManifest@1
  inputs:
    #action: 'deploy' # 'bake' | 'createSecret' | 'delete' | 'deploy' | 'patch' | 'promote' | 'scale' | 'reject'. Action. Default: deploy.
    #connectionType: 'kubernetesServiceConnection' # 'azureResourceManager' | 'kubernetesServiceConnection'. Required when action != bake. Service connection type. Default: kubernetesServiceConnection.
    #kubernetesServiceConnection: # string. Alias: kubernetesServiceEndpoint. Required when action != bake && connectionType = kubernetesServiceConnection. Kubernetes service connection. 
    #azureSubscriptionConnection: # string. Alias: azureSubscriptionEndpoint. Required when action != bake && connectionType = azureResourceManager. Azure subscription. 
    #azureResourceGroup: # string. Required when action != bake && connectionType = azureResourceManager. Resource group. 
    #kubernetesCluster: # string. Required when action != bake && connectionType = azureResourceManager. Kubernetes cluster. 
    #useClusterAdmin: false # boolean. Optional. Use when connectionType = azureResourceManager. Use cluster admin credentials. Default: false.
    #namespace: # string. Namespace. 
    #strategy: 'none' # 'canary' | 'none'. Optional. Use when action = deploy || action = promote || action = reject. Strategy. Default: none.
    #trafficSplitMethod: 'pod' # 'pod' | 'smi'. Optional. Use when strategy = canary. Traffic split method. Default: pod.
    #percentage: '0' # string. Required when strategy = Canary && action = deploy. Percentage. Default: 0.
    #baselineAndCanaryReplicas: '1' # string. Required when strategy = Canary && action = deploy && trafficSplitMethod = SMI. Baseline and canary replicas. Default: 1.
    #manifests: # string. Required when action = deploy || action = promote || action = reject. Manifests. 
    #containers: # string. Optional. Use when action = deploy || action = promote || action = bake. Containers. 
    #imagePullSecrets: # string. Optional. Use when action = deploy || action = promote. ImagePullSecrets. 
    #renderType: 'helm' # 'helm' | 'kompose' | 'kustomize'. Optional. Use when action = bake. Render Engine. Default: helm.
    #dockerComposeFile: # string. Required when action = bake && renderType = kompose. Path to docker compose file. 
    #helmChart: # string. Required when action = bake && renderType = helm. Helm Chart. 
    #releaseName: # string. Optional. Use when action = bake && renderType = helm. Helm Release Name. 
    #overrideFiles: # string. Optional. Use when action = bake && renderType = helm. Override Files. 
    #overrides: # string. Optional. Use when action = bake && renderType = helm. Overrides. 
    #kustomizationPath: # string. Optional. Use when action = bake && renderType = kustomize. Kustomization Path. 
    #resourceToPatch: 'file' # 'file' | 'name'. Required when action = patch. Resource to patch. Default: file.
    #resourceFileToPatch: # string. Required when action = patch && resourceToPatch = file. File path. 
    #kind: # 'deployment' | 'replicaset' | 'statefulset'. Required when action = scale || resourceToPatch = name. Kind. 
    #name: # string. Required when action = scale || resourceToPatch = name. Name. 
    #replicas: # string. Required when action = scale. Replica count. 
    #mergeStrategy: 'strategic' # 'json' | 'merge' | 'strategic'. Required when action = patch. Merge Strategy. Default: strategic.
    #arguments: # string. Optional. Use when action = delete. Arguments. 
    #patch: # string. Required when action = patch. Patch. 
    #secretType: 'dockerRegistry' # 'dockerRegistry' | 'generic'. Required when action = createSecret. Type of secret. Default: dockerRegistry.
    #secretName: # string. Optional. Use when action = createSecret. Secret name. 
    #secretArguments: # string. Optional. Use when action = createSecret && secretType = generic. Arguments. 
    #dockerRegistryEndpoint: # string. Optional. Use when action = createSecret && secretType = dockerRegistry. Docker registry service connection. 
    #rolloutStatusTimeout: '0' # string. Optional. Use when action = deploy || action = patch || action = scale || action = promote. Timeout for rollout status. Default: 0.
    #resourceType: 'Microsoft.ContainerService/managedClusters' # string. Optional. Use when action = deploy. Resource type. Default: Microsoft.ContainerService/managedClusters.
# Deploy to Kubernetes v1
# Use Kubernetes manifest files to deploy to clusters or even bake the manifest files to be used for deployments using Helm charts.
- task: KubernetesManifest@1
  inputs:
    #action: 'deploy' # 'bake' | 'createSecret' | 'delete' | 'deploy' | 'patch' | 'promote' | 'scale' | 'reject'. Action. Default: deploy.
    #connectionType: 'kubernetesServiceConnection' # 'azureResourceManager' | 'kubernetesServiceConnection'. Required when action != bake. Service connection type. Default: kubernetesServiceConnection.
    #kubernetesServiceConnection: # string. Alias: kubernetesServiceEndpoint. Required when action != bake && connectionType = kubernetesServiceConnection. Kubernetes service connection. 
    #azureSubscriptionConnection: # string. Alias: azureSubscriptionEndpoint. Required when action != bake && connectionType = azureResourceManager. Azure subscription. 
    #azureResourceGroup: # string. Required when action != bake && connectionType = azureResourceManager. Resource group. 
    #kubernetesCluster: # string. Required when action != bake && connectionType = azureResourceManager. Kubernetes cluster. 
    #useClusterAdmin: false # boolean. Optional. Use when connectionType = azureResourceManager. Use cluster admin credentials. Default: false.
    #namespace: # string. Namespace. 
    #strategy: 'none' # 'canary' | 'none'. Optional. Use when action = deploy || action = promote || action = reject. Strategy. Default: none.
    #trafficSplitMethod: 'pod' # 'pod' | 'smi'. Optional. Use when strategy = canary. Traffic split method. Default: pod.
    #percentage: '0' # string. Required when strategy = Canary && action = deploy. Percentage. Default: 0.
    #baselineAndCanaryReplicas: '1' # string. Required when strategy = Canary && action = deploy && trafficSplitMethod = SMI. Baseline and canary replicas. Default: 1.
    #manifests: # string. Required when action = deploy || action = promote || action = reject. Manifests. 
    #containers: # string. Optional. Use when action = deploy || action = promote || action = bake. Containers. 
    #imagePullSecrets: # string. Optional. Use when action = deploy || action = promote. ImagePullSecrets. 
    #renderType: 'helm' # 'helm' | 'kompose' | 'kustomize'. Optional. Use when action = bake. Render Engine. Default: helm.
    #dockerComposeFile: # string. Required when action = bake && renderType = kompose. Path to docker compose file. 
    #helmChart: # string. Required when action = bake && renderType = helm. Helm Chart. 
    #releaseName: # string. Optional. Use when action = bake && renderType = helm. Helm Release Name. 
    #overrideFiles: # string. Optional. Use when action = bake && renderType = helm. Override Files. 
    #overrides: # string. Optional. Use when action = bake && renderType = helm. Overrides. 
    #kustomizationPath: # string. Optional. Use when action = bake && renderType = kustomize. Kustomization Path. 
    #resourceToPatch: 'file' # 'file' | 'name'. Required when action = patch. Resource to patch. Default: file.
    #resourceFileToPatch: # string. Required when action = patch && resourceToPatch = file. File path. 
    #kind: # 'deployment' | 'replicaset' | 'statefulset'. Required when action = scale || resourceToPatch = name. Kind. 
    #name: # string. Required when action = scale || resourceToPatch = name. Name. 
    #replicas: # string. Required when action = scale. Replica count. 
    #mergeStrategy: 'strategic' # 'json' | 'merge' | 'strategic'. Required when action = patch. Merge Strategy. Default: strategic.
    #arguments: # string. Optional. Use when action = delete. Arguments. 
    #patch: # string. Required when action = patch. Patch. 
    #secretType: 'dockerRegistry' # 'dockerRegistry' | 'generic'. Required when action = createSecret. Type of secret. Default: dockerRegistry.
    #secretName: # string. Optional. Use when action = createSecret. Secret name. 
    #secretArguments: # string. Optional. Use when action = createSecret && secretType = generic. Arguments. 
    #dockerRegistryEndpoint: # string. Optional. Use when action = createSecret && secretType = dockerRegistry. Docker registry service connection. 
    #rolloutStatusTimeout: '0' # string. Optional. Use when action = deploy || action = patch || action = scale || action = promote. Timeout for rollout status. Default: 0.

Insumos

action - Ação
string. Valores permitidos: bake, createSecret (criar segredo), delete, deploy, patch, promote, scale, reject. Valor predefinido: deploy.

Especifica a ação a ser executada.


connectionType - Tipo de conexão de serviço
string. Necessário quando action != bake. Valores permitidos: azureResourceManager (Azure Resource Manager), kubernetesServiceConnection (Kubernetes Service Connection). Valor predefinido: kubernetesServiceConnection.

Selecione um tipo de conexão de serviço Kubernetes.

  • kubernetesServiceConnection (Conexão de Serviço Kubernetes) - Permite fornecer um arquivo KubeConfig, especificar uma Conta de Serviço ou importar uma instância AKS com a opção Assinatura do Azure . A importação de uma instância do AKS com a opção de Assinatura do Azure requer acesso ao cluster do Kubernetes no momento da configuração da Conexão de Serviço.
  • azureResourceManager (Azure Resource Manager) - Permite selecionar uma instância do AKS. Não acessa o cluster Kubernetes no momento da configuração da Conexão de Serviço.

Para obter mais informações, veja Observações.


kubernetesServiceConnection - de conexão de serviço Kubernetes
Alias de entrada: kubernetesServiceEndpoint. string. Necessário quando action != bake && connectionType = kubernetesServiceConnection.

Especifica uma conexão de serviço Kubernetes.


azureSubscriptionConnection - de assinatura do Azure
Alias de entrada: azureSubscriptionEndpoint. string. Necessário quando action != bake && connectionType = azureResourceManager.

Selecione a assinatura do Azure Resource Manager, que contém o Azure Container Registry.Nota: Para configurar a nova conexão de serviço, selecione a assinatura do Azure na lista e clique em 'Autorizar'. Se a sua subscrição não estiver listada ou se pretender utilizar uma Entidade de Serviço existente, pode configurar uma ligação de serviço do Azure utilizando o botão 'Adicionar' ou 'Gerir'.


azureResourceGroup - Grupo de recursos
string. Necessário quando action != bake && connectionType = azureResourceManager.

Selecione um grupo de recursos do Azure.


kubernetesCluster - de cluster do Kubernetes
string. Necessário quando action != bake && connectionType = azureResourceManager.

Selecione um cluster gerenciado do Azure.


useClusterAdmin - Usar credenciais de administrador de cluster
boolean. Opcional. Use quando connectionType = azureResourceManager. Valor predefinido: false.

Use credenciais de administrador de cluster em vez de credenciais de usuário de cluster padrão.


namespace - Espaço de nomes
string.

Especifica o namespace para os comandos usando o sinalizador –namespace. Se o namespace não for fornecido, os comandos serão executados no namespace padrão.


strategy - Estratégia
string. Opcional. Use quando action = deploy || action = promote || action = reject. Valores permitidos: canary, none. Valor predefinido: none.

Especifica a estratégia de implantação usada na ação deploy antes de uma ação promote ou reject ação. Atualmente, canary é a única estratégia de implantação aceitável.


trafficSplitMethod - Método de divisão de tráfego
string. Opcional. Use quando strategy = canary. Valores permitidos: pod, smi. Valor predefinido: pod.

Para o valor smi, a divisão percentual de tráfego é feita no nível da solicitação usando uma malha de serviço. Uma malha de serviço deve ser configurada por um administrador de cluster. Esta tarefa lida com a orquestração de objetos SMI TrafficSplit.

Para o valor pod, a divisão percentual não é possível no nível da solicitação na ausência de uma malha de serviço. Em vez disso, a entrada percentual é usada para calcular as réplicas para linha de base e canário. O cálculo é uma porcentagem de réplicas especificadas nos manifestos de entrada para a variante estável.


percentage - Percentagem
string. Necessário quando strategy = Canary && action = deploy. Valor predefinido: 0.

A porcentagem usada para calcular o número de réplicas de variante de linha de base e variante canária das cargas de trabalho contidas em arquivos de manifesto.

Para a entrada percentual especificada, calcule:

(percentagem × número de réplicas) / 100

Se o resultado não for um inteiro, o piso matemático do resultado é usado quando as variantes linha de base e canário são criadas.

Por exemplo, suponha que o hello-world de implantação esteja no arquivo de manifesto de entrada e que as seguintes linhas estejam na entrada da tarefa:

replicas: 4
strategy: canary
percentage: 25

Nesse caso, as implantações hello-world-baseline e hello-world-canary são criadas com uma réplica cada. A variante de linha de base é criada com a mesma imagem e marca da versão estável, que é a variante de quatro réplicas antes da implantação. A variante canary é criada com a imagem e a tag correspondentes às alterações recém-implantadas.


baselineAndCanaryReplicas - Réplicas de linha de base e canárias
string. Necessário quando strategy = Canary && action = deploy && trafficSplitMethod = SMI. Valor predefinido: 1.

Quando você define trafficSplitMethod como smi, a porcentagem de divisão de tráfego é controlada no plano de malha de serviço. Você pode controlar o número real de réplicas para variantes canárias e de linha de base independentemente da divisão de tráfego.

Por exemplo, suponha que o manifesto de implantação de entrada especifique 30 réplicas para a variante estável. Suponha também que você especifique a seguinte entrada para a tarefa:

strategy: canary
trafficSplitMethod: smi
percentage: 20
baselineAndCanaryReplicas: 1

Neste caso, a variante estável recebe 80% do tráfego, enquanto as variantes de linha de base e canárias recebem cada uma metade dos 20%especificados. As variantes de linha de base e canárias não recebem três réplicas cada. Em vez disso, eles recebem o número especificado de réplicas, o que significa que cada um recebe uma réplica.


manifests - Manifesta
string. Necessário quando action = deploy || action = promote || action = reject.

Especifica o caminho para os arquivos de manifesto a serem usados para implantação. Cada linha representa um único caminho. Um padrão de correspondência de arquivo é um valor aceitável para cada linha.


containers - Contentores
string. Opcional. Use quando action = deploy || action = promote || action = bake.

Especifica a URL de recurso totalmente qualificada da imagem a ser usada para substituições nos arquivos de manifesto. O URL contosodemo.azurecr.io/helloworld:test é um exemplo.


imagePullSecrets - ImagePullSecrets
string. Opcional. Use quando action = deploy || action = promote.

Especifica uma entrada de várias linhas em que cada linha contém o nome de um segredo do Registro do Docker que já foi configurado no cluster. Cada nome secreto é adicionado em imagePullSecrets para as cargas de trabalho encontradas nos arquivos de manifesto de entrada.


renderType - Mecanismo de renderização
string. Opcional. Use quando action = bake. Valores permitidos: helm, kompose, kustomize. Valor predefinido: helm.

Especifica o tipo de renderização usado para produzir os arquivos de manifesto.


dockerComposeFile - Caminho para o arquivo de composição do docker
string. Necessário quando action = bake && renderType = kompose.

Especifica um caminho de arquivo docker-compose.


helmChart - Gráfico de Leme
string. Necessário quando action = bake && renderType = helm.

Especifica o caminho do gráfico de leme a ser assado.


releaseName - Nome da versão Helm
string. Opcional. Use quando action = bake && renderType = helm.

Especifica o nome da versão Helm a ser usado.


overrideFiles - substituir arquivos
string. Opcional. Use quando action = bake && renderType = helm.

Especifica uma entrada de várias linhas que aceita o caminho para os arquivos de substituição. Os arquivos são usados quando arquivos de manifesto de gráficos Helm são cozidos.


overrides - Substitui
string. Opcional. Use quando action = bake && renderType = helm.

Especifica os valores de substituição a serem definidos.


kustomizationPath - Caminho de Kustomização
string. Opcional. Use quando action = bake && renderType = kustomize.

Especifica o argumento que deve ser o caminho para o diretório que contém o arquivo ou uma URL do repositório git com um sufixo de caminho especificando same em relação à raiz do repositório.


resourceToPatch - recurso para corrigir
string. Necessário quando action = patch. Valores permitidos: file, name. Valor predefinido: file.

Indica um dos seguintes métodos de patch:

  • Um arquivo de manifesto identifica os objetos a serem corrigidos.
  • Um objeto individual é identificado por tipo e nome como o destino do patch.

Os valores aceitáveis são de arquivo e nome.


resourceFileToPatch - Caminho do arquivo
string. Necessário quando action = patch && resourceToPatch = file.

Especifica o caminho para o arquivo usado para um patch.


kind - Tipo
string. Necessário quando action = scale || resourceToPatch = name. Valores permitidos: deployment, replicaset, statefulset.

Especifica o tipo de objeto K8s, como deployment, replicaSet e muito mais.


name - Nome
string. Necessário quando action = scale || resourceToPatch = name.

Especifica o nome do objeto K8s.


replicas - Contagem de réplicas
string. Necessário quando action = scale.

Especifica o número de réplicas para as quais dimensionar.


replicas - Contagem de réplicas
string. Necessário quando action = scale.

Especifica o nome do objeto K8s.


mergeStrategy - Estratégia de fusão
string. Necessário quando action = patch. Valores permitidos: json, merge, strategic. Valor predefinido: strategic.

Especifica o tipo de patch que está sendo fornecido.


arguments - Argumentos
string. Opcional. Use quando action = delete.

Especifica os argumentos para o comando kubectl delete. Um exemplo é: arguments: deployment hello-world foo-bar


patch - Adesivo
string. Necessário quando action = patch.

Especifica o conteúdo do patch.


secretType - Tipo de secreta
string. Necessário quando action = createSecret. Valores permitidos: dockerRegistry, generic. Valor predefinido: dockerRegistry.

Cria ou atualiza um imagepullsecretgenérico ou docker . Especifique dockerRegistry criar ou atualizar o imagepullsecret do registro selecionado. Um imagePullSecret é uma maneira de passar um segredo que contém uma senha de registro de contêiner para o Kubelet, para que ele possa extrair uma imagem privada em nome do seu Pod.


secretName - Nome secreto
string. Opcional. Use quando action = createSecret.

Especifica o nome do segredo. Você pode usar esse nome secreto no arquivo de configuração YAML do Kubernetes.


secretArguments - Argumentos
string. Opcional. Use quando action = createSecret && secretType = generic.

Especifica chaves e valores literais a serem inseridos em segredo. Por exemplo, --from-literal=key1=value1--from-literal=key2="top secret".


dockerRegistryEndpoint - de conexão do serviço de registro do Docker
string. Opcional. Use quando action = createSecret && secretType = dockerRegistry.

Especifica as credenciais da conexão de serviço especificada que são usadas para criar um segredo do Registro do Docker dentro do cluster. Os arquivos de manifesto sob o campo imagePullSecrets podem então se referir ao nome desse segredo.


rolloutStatusTimeout - Tempo limite para o status de implantação
string. Opcional. Use quando action = deploy || action = patch || action = scale || action = promote. Valor predefinido: 0.

Especifica o período de tempo (em segundos) a aguardar antes de terminar watch on rollout estado.


resourceType - Tipo de recurso
string. Opcional. Use quando action = deploy. Valor predefinido: Microsoft.ContainerService/managedClusters.

O tipo de recurso (frota, cluster gerenciado).


Opções de controlo de tarefas

Todas as tarefas têm opções de controle, além de suas entradas de tarefas. Para obter mais informações, consulte Opções de controle de e propriedades de tarefas comuns.

Variáveis de saída

Esta tarefa define as seguintes variáveis de saída , que você pode consumir em etapas, trabalhos e estágios downstream.

manifestsBundle
A localização dos pacotes de manifesto criados pela ação bake

Observações

Considerações sobre a conexão de serviço do Kubernetes ao acessar o AKS

Você pode criar uma conexão de serviço Kubernetes com qualquer uma das seguintes opções.

  • KubeConfig
  • Conta de Serviço
  • Subscrição do Azure

Captura de tela mostrando a escolha de um método de autenticação de conexão de serviço Kubernetes.

Ao selecionar a opção de Assinatura do Azure, o Kubernetes precisa estar acessível ao Azure DevOps no momento da configuração da conexão de serviço. Pode haver vários motivos pelos quais uma conexão de serviço não pode ser criada, por exemplo, você criou um de cluster privado ou o cluster tem contas locais desabilitadas. Nesses casos, o Azure DevOps não pode se conectar ao cluster no momento da configuração da conexão de serviço e você verá uma tela Carregando namespaces presa.

Captura de tela da escolha de uma caixa de diálogo de autenticação de conexão de serviço Kubernetes presa ao carregar namespaces.

A partir do Kubernetes 1.24, os tokens de vida longa não são mais criados por padrão. O Kubernetes recomenda não usar tokens de longa duração. Como resultado, as tarefas que usam uma conexão de serviço do Kubernetes criada com a opção de Assinatura do Azure não têm acesso ao token permanente necessário para autenticar e não podem acessar seu cluster do Kubernetes. Isso também resulta na caixa de diálogo congelada Carregando namespaces.

Usar a Conexão de Serviço do Azure Resource Manager para acessar o AKS

Para clientes AKS, o tipo de conexão de serviço do Azure Resource Manager fornece o melhor método para se conectar a um cluster privado ou a um cluster que tenha contas locais desabilitadas. Esse método não depende da conectividade de cluster no momento em que você cria uma conexão de serviço. O acesso ao AKS é adiado para o tempo de execução do pipeline, que tem as seguintes vantagens:

  • O acesso a um cluster AKS (privado) pode ser realizado a partir de um agente auto-hospedado ou de conjunto de escala com linha de visão para o cluster.
  • Um token é criado para cada tarefa que usa uma conexão de serviço do Azure Resource Manager. Isso garante que você esteja se conectando ao Kubernetes com um token de curta duração, que é o recomendação do Kubernetes.
  • O AKS pode ser acessado mesmo quando as contas locais estão desativadas.

Perguntas frequentes sobre conexão de serviço

Recebo a seguinte mensagem de erro: Não foi possível encontrar nenhum segredo associado à conta de serviço. O que é que está a acontecer?

Você está usando a conexão de serviço do Kubernetes com a opção Assinatura do Azure. Estamos atualizando esse método para criar tokens de longa duração. Espera-se que esteja disponível em meados de maio. No entanto, é recomendável começar a usar o tipo de conexão de serviço do Azure e não usar tokens de longa duração, conforme de orientação do Kubernetes.

Estou usando o AKS e não quero alterar nada, posso continuar a usar tarefas com a conexão de serviço do Kubernetes?

Estamos atualizando esse método para criar tokens de longa duração. Espera-se que esteja disponível em meados de maio. No entanto, esteja ciente de que essa abordagem é contrária orientação do Kubernetes.

Estou usando as tarefas do Kubernetes e a conexão de serviço do Kubernetes, mas não o AKS. Devo preocupar-me?

As suas tarefas continuarão a funcionar como antes.

O tipo de conexão do serviço Kubernetes será removido?

Nossas tarefas do Kubernetes funcionam com qualquer cluster do Kubernetes, independentemente de onde estejam sendo executadas. A conexão de serviço do Kubernetes continuará a existir.

Sou um cliente AKS e está tudo a correr bem, devo agir?

Não há necessidade de mudar nada. Se você estiver usando a conexão de serviço do Kubernetes e selecionou a Assinatura do Azure durante a criação, deve estar ciente das orientações do Kubernetes sobre o uso de tokens de longa duração.

Estou criando um ambiente Kubernetes e não tenho opção de usar conexões de serviço

Caso não consiga acessar seu AKS durante o tempo de criação do ambiente, você pode usar um ambiente vazio e definir a entrada connectionType para uma conexão de serviço do Azure Resource Manager.

Tenho o AKS configurado com o Azure Ative Directory RBAC e meu pipeline não funciona. Essas atualizações resolverão isso?

O acesso ao Kubernetes quando o RBAC do AAD está habilitado não está relacionado à criação de tokens. Para evitar um prompt interativo, suportaremos kubelogin em uma atualização futura.

Use uma tarefa de manifesto do Kubernetes em um pipeline de compilação ou liberação para compilar e implantar manifestos em clusters do Kubernetes.

Esta tarefa suporta o seguinte:

  • Substituição de artefato: A ação de implantação usa como entrada uma lista de imagens de contêiner que você pode especificar junto com suas tags e resumos. A mesma entrada é substituída nos arquivos de manifesto não templatizados antes da aplicação no cluster. Essa substituição garante que os nós do cluster puxem a versão correta da imagem.

  • de estabilidade do manifesto: o status de distribuição dos objetos Kubernetes implantados é verificado. As verificações de estabilidade são incorporadas para determinar se o status da tarefa é um sucesso ou uma falha.

  • Anotações de rastreabilidade: As anotações são adicionadas aos objetos Kubernetes implantados para sobrepor informações de rastreabilidade. As seguintes anotações são suportadas:

    • azure-pipelines/org
    • azure-pipelines/projeto
    • azure-pipelines/pipeline
    • azure-pipelines/pipelineId
    • azure-pipelines/execução
    • azure-pipelines/executionuri
    • azure-pipelines/jobName
  • Secret handling: A ação createSecret permite que segredos de registro do Docker sejam criados usando conexões do serviço de registro do Docker. Ele também permite que segredos genéricos sejam criados usando variáveis de texto simples ou variáveis secretas. Antes da implantação no cluster, você pode usar a entrada secrets juntamente com a ação deploy para aumentar os arquivos de manifesto de entrada com o valor de imagePullSecrets apropriado.

  • Bake manifest: A ação bake da tarefa permite baking templates em arquivos de manifesto do Kubernetes. A ação usa ferramentas como Helm, Compose e Kustomize. Com o baking, esses arquivos de manifesto do Kubernetes são utilizáveis para implantações no cluster.

  • Estratégia de implantação: Escolher a estratégia de canary com a ação deploy leva à criação de nomes de carga de trabalho sufixados com -baseline e -canary. A tarefa suporta dois métodos de divisão de tráfego:

    • Service Mesh Interface: abstração do Service Mesh Interface (SMI) permite a configuração com provedores de malha de serviços como Linkerd e Istio. A tarefa Manifesto do Kubernetes mapeia objetos TrafficSplit SMI para os serviços estável, linha de base e canário durante o ciclo de vida da estratégia de implantação.

      As implantações Canary que se baseiam em uma malha de serviço e usam essa tarefa são mais precisas. Essa precisão se deve à forma como os provedores de malha de serviços permitem a divisão granular do tráfego baseada em porcentagem. A malha de serviço usa o registro de serviço e contêineres de sidecar que são injetados em pods. Essa injeção ocorre junto com contêineres de aplicativos para obter a divisão granular do tráfego.

    • Kubernetes sem malha de serviço: Na ausência de uma malha de serviço, você pode não obter a divisão de porcentagem exata desejada no nível de solicitação. No entanto, você pode fazer implantações canárias usando variantes linha de base e canárias ao lado da variante estável.

      O serviço envia solicitações para pods de todas as três variantes de carga de trabalho à medida que as restrições do rótulo seletor são atendidas. O Kubernetes Manifest honra essas solicitações ao criar variantes de linha de base e canário. Esse comportamento de roteamento alcança o efeito pretendido de rotear apenas uma parte do total de solicitações para o canário.

    Compare as cargas de trabalho de linha de base e canárias usando um de tarefas de Intervenção Manual de em pipelines de liberação ou uma tarefa de Atraso de em pipelines YAML. Faça a comparação antes de usar a ação de promoção ou rejeição da tarefa.

Ação de implantação

O código YAML a seguir é um exemplo de implantação em um namespace do Kubernetes usando arquivos de manifesto:

steps:
- task: KubernetesManifest@0
  displayName: Deploy
  inputs:
    kubernetesServiceConnection: someK8sSC1
    namespace: default
    manifests: |
      manifests/deployment.yml
      manifests/service.yml
    containers: |
      foo/demo:$(tagVariable1)
      bar/demo:$(tagVariable2)
    imagePullSecrets: |
      some-secret
      some-other-secret

No exemplo acima, a tarefa tenta encontrar correspondências para as imagens foo/demo e bar/demo nos campos de imagem dos arquivos de manifesto. Para cada correspondência encontrada, o valor de tagVariable1 ou tagVariable2 é acrescentado como uma marca ao nome da imagem. Você também pode especificar resumos na entrada de contêineres para substituição de artefatos.

Observação

Embora você possa criar ações de deploy, promotee reject com a entrada YAML relacionada à estratégia de implantação, o suporte para uma tarefa de Intervenção Manual não está disponível no momento para pipelines de compilação.

Para pipelines de versão, recomendamos que você use ações e entradas relacionadas à estratégia de implantação na seguinte sequência:

  1. Uma ação de implantação especificada com strategy: canary e percentage: $(someValue).
  2. Uma tarefa de Intervenção Manual para que você possa pausar o pipeline e comparar a variante de linha de base com a variante canária.
  3. Uma ação de promoção que é executada se uma tarefa de Intervenção Manual for retomada e uma ação de rejeição que é executada se uma tarefa de Intervenção Manual for rejeitada.

Criar ação secreta

O código YAML a seguir mostra uma criação de exemplo de segredos do Registro do Docker usando conexão do serviço Registro do Docker:

steps:
- task: KubernetesManifest@0
  displayName: Create secret
  inputs: 
    action: createSecret
    secretType: dockerRegistry
    secretName: foobar
    dockerRegistryEndpoint: demoACR
    kubernetesServiceConnection: someK8sSC
    namespace: default

Este código YAML mostra um exemplo de criação de segredos genéricos:

steps:
- task: KubernetesManifest@0
  displayName: Create secret
  inputs: 
    action: createSecret
    secretType: generic
    secretName: some-secret
    secretArguments: --from-literal=key1=value1
    kubernetesServiceConnection: someK8sSC
    namespace: default

Ação de assar

O código YAML a seguir é um exemplo de baking de arquivos de manifesto de gráficos Helm. Observe o uso de uma entrada de nome na primeira tarefa. Esse nome é posteriormente referenciado na etapa de implantação para especificar o caminho para os manifestos que foram produzidos pela etapa de bake.

steps:
- task: KubernetesManifest@0
  name: bake
  displayName: Bake K8s manifests from Helm chart
  inputs:
    action: bake
    helmChart: charts/sample
    overrides: 'image.repository:nginx'

- task: KubernetesManifest@0
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: someK8sSC
    namespace: default
    manifests: $(bake.manifestsBundle)
    containers: |
      nginx: 1.7.9

Observação

Para usar o Helm diretamente para gerenciar versões e reversões, consulte a tarefa Empacotar e implantar gráficos Helm.

Exemplo de Kustomize

O código YAML a seguir é um exemplo de arquivos de manifesto de baking gerados com Kustomize que contêm um arquivo kustomization.yaml.

steps:
- task: KubernetesManifest@0
  name: bake
  displayName: Bake K8s manifests from kustomization path
  inputs:
    action: bake
    renderType: kustomize
    kustomizationPath: folderContainingKustomizationFile

- task: KubernetesManifest@0
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: k8sSC1
    manifests: $(bake.manifestsBundle)

Exemplo de Kompose

O código YAML a seguir é um exemplo de arquivos de manifesto gerados com o Kompose, uma ferramenta de conversão para o Docker Compose.

steps:
- task: KubernetesManifest@0
  name: bake
  displayName: Bake K8s manifests from Docker Compose
  inputs:
    action: bake
    renderType: kompose
    dockerComposeFile: docker-compose.yaml

- task: KubernetesManifest@0
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: k8sSC1
    manifests: $(bake.manifestsBundle)

Ação de escala

O código YAML a seguir mostra um exemplo de dimensionamento de objetos:

steps:
- task: KubernetesManifest@0
  displayName: Scale
  inputs: 
    action: scale
    kind: deployment
    name: bootcamp-demo
    replicas: 5
    kubernetesServiceConnection: someK8sSC
    namespace: default

Ação do patch

O código YAML a seguir mostra um exemplo de aplicação de patches de objetos:

steps:
- task: KubernetesManifest@0
  displayName: Patch
  inputs: 
    action: patch
    kind: pod
    name: demo-5fbc4d6cd9-pgxn4
    mergeStrategy: strategic
    patch: '{"spec":{"containers":[{"name":"demo","image":"foobar/demo:2239"}]}}'
    kubernetesServiceConnection: someK8sSC
    namespace: default

Ação de exclusão

Este código YAML mostra uma exclusão de objeto de exemplo:

steps:
- task: KubernetesManifest@0
  displayName: Delete
  inputs:
    action: delete
    arguments: deployment expressapp
    kubernetesServiceConnection: someK8sSC
    namespace: default

Solução de problemas

O cluster My Kubernetes está protegido por uma firewall e eu estou a utilizar agentes alojados. Como posso implementar neste cluster?

Pode conceder acesso a agentes alojados através da firewall, ao permitir os endereços IP para os agentes alojados. Para obter mais detalhes, veja Intervalos de IP do agente.

Como é que os pedidos funcionam para rotas de serviço estáveis e de variantes com implementações de proteção?

A relação do seletor de etiquetas entre pods e serviços no Kubernetes permite a configuração de implementações para que um único serviço encaminhe os pedidos para as variantes estáveis e de proteção. A tarefa de manifesto do Kubernetes usa isso para implantações canárias.

Se a tarefa incluir as entradas de action: deploy e strategy: canary, para cada carga de trabalho (Deployment, ReplicaSet, Pod, ...) definida nos arquivos de manifesto de entrada, uma -baseline e -canary variante da implantação serão criadas. Neste exemplo, há um sampleapp de implantação no arquivo de manifesto de entrada e que, após a conclusão do número de execução 22 do pipeline, a variante estável dessa implantação chamada sampleapp é implantada no cluster. Na execução subsequente (neste caso, executar o número 23), a tarefa de manifesto do Kubernetes com action: deploy e strategy: canary resultaria na criação de implantações sampleapp-baseline e sampleapp-canary cujo número de réplicas é determinado pelo produto de percentage entrada de tarefa com o valor do número desejado de réplicas para a variante estável final de sampleapp de acordo com os arquivos de manifesto de entrada.

Excluindo o número de réplicas, a versão de linha de base tem a mesma configuração que a variante estável, enquanto a versão canária tem as novas alterações que estão sendo introduzidas pela execução atual (neste caso, o número de execução 23). Se uma intervenção manual for configurada no pipeline após a etapa acima mencionada, isso permitirá uma oportunidade de pausar o pipeline para que o administrador do pipeline possa avaliar as principais métricas para as versões de linha de base e canary e tomar a decisão sobre se as alterações canárias são seguras e boas o suficiente para uma implantação completa.

As entradasaction: promote e strategy: canary ou action: reject e strategy: canary das tarefas de manifesto do Kubernetes podem ser usadas para promover ou rejeitar as alterações canárias, respectivamente. Observe que, em ambos os casos, no final desta etapa, apenas a variante estável das cargas de trabalho declaradas nos arquivos de manifesto de entrada permanecerá implantada no cluster, enquanto as versões efêmeras de linha de base e canárias serão limpas.

Requerimentos

Requisito Descrição
Tipos de pipeline YAML, Construção clássica, Versão clássica
Funciona em Agente, DeploymentGroup
Exigências Nenhum
Capacidades Esta tarefa não satisfaz quaisquer exigências para tarefas subsequentes no trabalho.
Restrições de comando Qualquer
Variáveis configuráveis Qualquer
Versão do agente Todas as versões de agente suportadas.
Categoria de tarefa Desplegar