Implantar um cluster do Kubernetes de alta disponibilidade no Azure Stack Hub

Este artigo vai mostrar como criar um ambiente de cluster do Kubernetes de alta disponibilidade, implantado em várias instâncias do Azure Stack Hub, em diferentes locais físicos.

Neste guia de implantação de solução, você aprenderá a:

  • Baixar e preparar o mecanismo do AKS
  • Conectar-se à VM auxiliar do mecanismo do AKS
  • Implantar um cluster do Kubernetes
  • Conectar-se ao cluster do Kubernetes
  • Conectar o Azure Pipelines ao cluster do Kubernetes
  • Configurar monitoramento
  • Implantar um aplicativo
  • Aplicativo de dimensionamento automático
  • Configurar o Gerenciador de Tráfego
  • Atualizar o Kubernetes
  • Escalar Kubernetes

Dica

Hybrid pillarsO Microsoft Azure Stack Hub é uma extensão do Azure. O Azure Stack Hub traz a agilidade e a inovação da computação em nuvem para seu ambiente local, fornecendo a única nuvem híbrida que permite criar e implantar aplicativos híbridos em qualquer lugar.

O artigo Considerações de design de aplicativos híbridos examina os pilares da qualidade de software (posicionamento, escalabilidade, disponibilidade, resiliência, capacidade de gerenciamento e segurança) relativos ao design, à implantação e à operação de aplicativos híbridos. As considerações de design ajudam na otimização do design de aplicativos híbridos, reduzindo os desafios nos ambientes de produção.

Pré-requisitos

Antes de começar a usar este guia de implantação, você deve:

Baixar e preparar o mecanismo do AKS

O mecanismo do AKS é um binário que pode ser usado de qualquer host Windows ou Linux que possa alcançar os pontos de extremidade do Azure Resource Manager do Azure Stack Hub. Este guia descreve a implantação de uma nova VM do Linux (ou do Windows) no Azure Stack Hub. Ela será usada posteriormente, quando o mecanismo do AKS implantar os clusters do Kubernetes.

Observação

Você também pode usar uma VM existente do Windows ou do Linux para implantar um cluster do Kubernetes no Azure Stack Hub usando o mecanismo do AKS.

O processo passo a passo e os requisitos para o mecanismo do AKS estão documentados aqui:

O mecanismo do AKS é uma ferramenta auxiliar para implantar e operar clusters do Kubernetes (não gerenciados) no Azure e no Azure Stack Hub.

Os detalhes e as diferenças do mecanismo do AKS no Azure Stack Hub são descritos aqui:

O ambiente de exemplo usará o Terraform para automatizar a implantação da VM do mecanismo do AKS. Você pode encontrar os detalhes e o código no repositório complementar do GitHub.

O resultado dessa etapa é um novo grupo de recursos no Azure Stack Hub que contém a VM auxiliar do mecanismo do AKS e os recursos relacionados:

AKS Engine VM Resources in Azure Stack Hub

Observação

Se você precisar implantar o mecanismo do AKS em um ambiente air-gapped desconectado, examine as instâncias desconectadas do Azure Stack Hub para saber mais.

Na próxima etapa, usaremos a VM do mecanismo do AKS implantada recentemente a fim de implantar um cluster do Kubernetes.

Conectar-se à VM auxiliar do mecanismo do AKS

Primeiro, você deve se conectar à VM auxiliar do mecanismo AKS criada anteriormente.

A VM deve ter um Endereço IP Público e deve ser acessível via SSH (porta 22/TCP).

AKS Engine VM Overview page

Dica

Você pode usar uma ferramenta de sua escolha, como o MobaXterm, o puTTY ou o PowerShell no Windows 10 para se conectar a uma VM do Linux usando SSH.

ssh <username>@<ipaddress>

Após a conexão, execute o comando aks-engine. Acesse Versões compatíveis do mecanismo do AKS para saber mais sobre as versões do mecanismo do AKS e do Kubernetes.

aks-engine command line example

Implantar um cluster do Kubernetes

A própria VM auxiliar do mecanismo do AKS ainda não criou um cluster do Kubernetes no Azure Stack Hub. A criação do cluster é a primeira ação a ser tomada na VM auxiliar do mecanismo do AKS.

O processo passo a passo está documentado aqui:

O resultado final do comando aks-engine deploy e das preparações nas etapas anteriores é um cluster do Kubernetes com recursos completos, implantado no espaço do locatário da primeira instância do Azure Stack Hub. O próprio cluster consiste em componentes de IaaS do Azure, como VMs, balanceadores de carga, VNets, discos e assim por diante.

Cluster IaaS components Azure Stack Hub portal

  1. Balanceador de carga do Azure (Ponto de extremidade da API K8s) 2) Nós de trabalho (pool de agentes) 3) Nós mestres

Agora o cluster está em execução e na próxima etapa faremos a conexão com ele.

Conectar-se ao cluster do Kubernetes

Agora você pode se conectar ao cluster do Kubernetes criado anteriormente, seja por meio de SSH (usando a chave SSH especificada como parte da implantação) ou por meio do kubectl (recomendado). A ferramenta de linha de comando do Kubernetes kubectl está disponível para Windows, Linux e macOS aqui. Ela já está pré-instalada e configurada nos nós mestres do nosso cluster:

ssh azureuser@<k8s-master-lb-ip>

Execute kubectl on master node

Não é recomendável usar o nó mestre como um Jumpbox para tarefas administrativas. A configuração kubectl é armazenada em .kube/config nos nós mestres, bem como na VM do mecanismo do AKS. Você pode copiar a configuração para um computador de administração com conectividade para o cluster do Kubernetes e usar o comando kubectl lá. O arquivo .kube/config também é usado posteriormente para configurar uma conexão de serviço no Azure Pipelines.

Importante

Mantenha esses arquivos seguros porque eles contêm as credenciais para o cluster do Kubernetes. Um invasor com acesso ao arquivo tem informações suficientes para obter acesso de administrador a ele. Todas as ações feitas usando o arquivo .kube/config inicial são feitas por meio de uma conta do administrador do cluster.

Agora você pode tentar vários comandos usando kubectl para verificar o status do cluster. Aqui estão exemplos de comandos:

kubectl get nodes
NAME                       STATUS   ROLE     VERSION
k8s-linuxpool-35064155-0   Ready    agent    v1.14.8
k8s-linuxpool-35064155-1   Ready    agent    v1.14.8
k8s-linuxpool-35064155-2   Ready    agent    v1.14.8
k8s-master-35064155-0      Ready    master   v1.14.8
kubectl cluster-info
Kubernetes master is running at https://aks.***
CoreDNS is running at https://aks.***/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
kubernetes-dashboard is running at https://aks.***/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
Metrics-server is running at https://aks.***/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

Importante

O Kubernetes tem seu próprio modelo RBAC (controle de acesso baseado em função) que permite criar definições e associações de função bem refinadas. Essa é a maneira preferível de controlar o acesso ao cluster em vez de distribuir as permissões de administrador de cluster.

Conectar o Azure Pipelines a clusters do Kubernetes

Para conectar os pipelines do Azure ao cluster do Kubernetes recém-implantado, precisamos de seu arquivo kubeconfig (.kube/config), conforme explicado na etapa anterior.

  • Conecte-se a um dos nós mestres do cluster do Kubernetes.
  • Copie o conteúdo do arquivo .kube/config.
  • Vá para Azure DevOps> Configurações do projeto >Conexões de serviço para criar uma nova conexão de serviço "Kubernetes" (usar o KubeConfig como método de autenticação)

Importante

O Azure Pipelines (ou seus agentes de build) devem ter acesso à API do Kubernetes. Se houver uma conexão com a Internet do pipelines do Azure para o cluster do Kubernetes do Azure Stack Hub, você precisará implantar um agente de compilação de pipelines do Azure auto-hospedado.

Ao implantar agentes auto-hospedados para o Azure Pipelines, você pode implantá-los no Azure Stack Hub ou em um computador com conectividade de rede para todos os pontos de extremidade de gerenciamento necessários. Conferir os detalhes aqui:

A seção do padrão Considerações sobre implantação (CI/CD) contém um fluxo de decisão que ajuda a entender se devem ser usados agentes hospedados pela Microsoft ou agentes auto-hospedados:

Diagram that shows a decision flow of self hosted agents.

Baixe um arquivo do Visio de todos os diagramas neste artigo.

Nesta solução de exemplo, a topologia inclui um agente de build auto-hospedado em cada instância do Azure Stack Hub. O agente pode acessar os pontos de extremidade de gerenciamento do Azure Stack Hub e os pontos de extremidade da API do cluster do Kubernetes.

Diagram that shows outbound traffic.

Baixe um arquivo do Visio de todos os diagramas neste artigo.

Esse design atende a um requisito normativo comum, que é ter apenas conexões de saída da solução do aplicativo.

Configurar monitoramento

Você pode usar o Azure Monitor para que os contêineres monitorem os contêineres da solução. Isso aponta o Azure Monitor para o cluster do Kubernetes implantado pelo mecanismo do AKS no Azure Stack Hub.

Há duas maneiras de habilitar o Azure Monitor no cluster. Ambas as maneiras exigem que você configure um workspace do Log Analytics no Azure.

  • O Método um usa um gráfico do Helm
  • O Método dois faz parte da especificação de cluster do mecanismo do AKS

A topologia de exemplo usa o "Método um", o que permite a automação do processo e as atualizações podem ser instaladas com mais facilidade.

Para a próxima etapa, você precisa de um workspace do Log Analytics no Azure (ID e chave), Helm (versão 3) e kubectl em seu computador.

O Helm é um gerenciador de pacotes do Kubernetes, disponível como um binário que é executado no macOS, no Windows e no Linux. Pode ser baixado aqui: helm.sh O Helm se baseia no arquivo de configuração do Kubernetes usado para o comando kubectl:

helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
helm repo update

helm install incubator/azuremonitor-containers \
--set omsagent.secret.wsid=<your_workspace_id> \
--set omsagent.secret.key=<your_workspace_key> \
--set omsagent.env.clusterName=<my_prod_cluster> \
--generate-name

Este comando instalará o agente do Azure Monitor no cluster do Kubernetes:

kubectl get pods -n kube-system
NAME                                       READY   STATUS
omsagent-8qdm6                             1/1     Running
omsagent-r6ppm                             1/1     Running
omsagent-rs-76c45758f5-lmc4l               1/1     Running

O agente do OMS (Operations Management Suite) no cluster do Kubernetes enviará dados de monitoramento para o workspace do Log Analytics no Azure (usando HTTPS de saída). Agora você pode usar o Azure Monitor para obter insights mais aprofundados sobre seus clusters do Kubernetes no Azure Stack Hub. Esse design é uma forma eficiente de demonstrar o poder da análise que pode ser implantada automaticamente com os clusters do aplicativo.

Azure Stack Hub clusters in Azure monitor

Azure Monitor cluster details

Importante

Se o Azure Monitor não mostrar nenhum dado do Azure Stack Hub, certifique-se de ter seguido as instruções sobre como adicionar uma solução AzureMonitor-Contêineres a um workspace de análise de logs do Azure com cuidado.

Implantar o aplicativo

Antes de instalar o aplicativo de exemplo, há outra etapa para configurar o controlador de entrada baseado em NGINX no cluster do Kubernetes. O controlador de entrada é usado como um balanceador de carga de camada 7 para rotear o tráfego no cluster com base no host, no caminho ou no protocolo. O ingress do NGINX está disponível como um gráfico do Helm. Para obter instruções detalhadas, confira o Repositório do GitHub do gráfico do Helm.

O aplicativo de exemplo também é empacotado como um gráfico do Helm, como o Agente de Monitoramento do Azure na etapa anterior. Assim sendo, é simples implantar o aplicativo no cluster do Kubernetes. Você pode encontrar os Arquivos de gráfico do Helm no repositório complementar do GitHub

O aplicativo de exemplo é um aplicativo de três camadas, implantado em um cluster do Kubernetes em cada uma das duas instâncias do Azure Stack Hub. O aplicativo usa um banco de dados do MongoDB. Você pode aprender mais sobre como obter os dados replicados em várias instâncias no padrão Considerações sobre dados e armazenamento.

Depois de implantar o gráfico do Helm para o aplicativo, você verá todas as três camadas do aplicativo representadas como implantações e conjuntos com estado (para o banco de dados) com apenas um pod:

kubectl get pod,deployment,statefulset
NAME                                         READY   STATUS
pod/ratings-api-569d7f7b54-mrv5d             1/1     Running
pod/ratings-mongodb-0                        1/1     Running
pod/ratings-web-85667bfb86-l6vxz             1/1     Running

NAME                                         READY
deployment.extensions/ratings-api            1/1
deployment.extensions/ratings-web            1/1

NAME                                         READY
statefulset.apps/ratings-mongodb             1/1

No lado dos serviços, você vai encontrar o controlador de entrada baseado em NGINX e o endereço IP público dele:

kubectl get service
NAME                                         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)
kubernetes                                   ClusterIP      10.0.0.1       <none>        443/TCP
nginx-ingress-1588931383-controller          LoadBalancer   10.0.114.180   *public-ip*   443:30667/TCP
nginx-ingress-1588931383-default-backend     ClusterIP      10.0.76.54     <none>        80/TCP
ratings-api                                  ClusterIP      10.0.46.69     <none>        80/TCP
ratings-web                                  ClusterIP      10.0.161.124   <none>        80/TCP

O endereço "IP Externo" é o "ponto de extremidade do aplicativo". É assim que os usuários se conectarão para abrir o aplicativo e também serão usados como o ponto de extremidade para a próxima etapa, Configurar o Gerenciador de Tráfego.

Dimensionamento automático do aplicativo

Opcionalmente, você pode configurar o Dimensionador Automático de Pod Horizontal para escalar ou reduzir verticalmente com base em determinadas métricas, como a utilização da CPU. O comando a seguir criará um Dimensionador Automático de Pod Horizontal que mantém de 1 a 10 réplicas dos Pods controladas pela implantação de classificações Web. O HPA aumentará e diminuirá o número de réplicas (por meio da implantação) para manter uma utilização média da CPU em todos os pods de 80%.

kubectl autoscale deployment ratings-web --cpu-percent=80 --min=1 --max=10

Você pode verificar o status atual do dimensionador automático executando este comando:

kubectl get hpa
NAME          REFERENCE                      TARGET    MINPODS   MAXPODS   REPLICAS   AGE
ratings-web   Deployment/ratings-web/scale   0% / 80%  1         10        1          18s

Configurar o Gerenciador de Tráfego

Para distribuir o tráfego entre duas (ou mais) implantações do aplicativo, usaremos o Gerenciador de Tráfego do Azure. O Gerenciador de tráfego do Azure é um balanceador de carga de tráfego baseado em DNS no Azure.

Observação

O Gerenciador de Tráfego usa o DNS para direcionar as solicitações do cliente ao ponto de extremidade de serviço mais apropriado com base em um método de roteamento de tráfego e na integridade dos pontos de extremidade.

Em vez de usar o Gerenciador de Tráfego do Azure, você também pode usar outras soluções de balanceamento de carga global hospedadas no local. No cenário de exemplo, usaremos o Gerenciador de Tráfego do Azure para distribuir o tráfego entre duas instâncias do aplicativo. Eles podem ser executados em instâncias do Azure Stack Hub no mesmo local ou em locais diferentes:

Diagram that shows an on-premises traffic manager.

Baixe um arquivo do Visio de todos os diagramas neste artigo.

No Azure, configuramos o Gerenciador de Tráfego para apontar para as duas instâncias diferentes de aplicativo:

TM endpoint profile

Como você pode ver, os dois pontos de extremidade apontam para as duas instâncias do aplicativo implantado da seção anterior.

Neste ponto:

  • A infraestrutura do Kubernetes já foi criada, incluindo um controlador de entrada.
  • Os clusters já foram implantados em duas instâncias do Azure Stack Hub.
  • O monitoramento já foi configurado.
  • O Gerenciador de Tráfego do Azure balanceará a carga do tráfego entre as duas instâncias do Azure Stack Hub.
  • Além dessa infraestrutura, o aplicativo de três camadas de exemplo já foi implantado de maneira automatizada usando os gráficos do Helm.

A solução agora deve estar ativa e acessível aos usuários.

Há também algumas considerações operacionais referentes ao pós-implantação que vale a pena discutir, as quais são abordadas nas próximas duas seções.

Atualizar o Kubernetes

Considere os seguintes tópicos ao atualizar o cluster do Kubernetes:

As imagens mais recentes do sistema operacional de base contêm atualizações de segurança e do kernel. É responsabilidade do operador do cluster monitorar a disponibilidade de versões mais recentes do Kubernetes e das imagens do sistema operacional. O operador deve planejar e executar essas atualizações usando o mecanismo do AKS. As imagens do sistema operacional base devem ser baixadas do Marketplace do Azure Stack Hub pelo operador do Azure Stack Hub.

Escalar Kubernetes

A escala é outra operação do segundo dia que pode ser orquestrada usando o mecanismo do AKS.

O comando de escala reutiliza o arquivo de configuração do cluster (apimodel.json) no diretório de saída, como entrada para uma nova implantação do Azure Resource Manager. O mecanismo do AKS executa a operação de escala em um pool de agentes específico. Quando a operação de escala for concluída, o mecanismo do AKS atualizará a definição do cluster no mesmo arquivo apimodel.json. A definição do cluster reflete a nova contagem de nós para refletir a configuração atualizada do cluster.

Próximas etapas