Exercício – Implantar um aplicativo no seu cluster do Serviço de Kubernetes do Azure
Neste exercício, implante o site da sua empresa como um aplicativo de teste no AKS (Serviço de Kubernetes do Azure). O site é estático, com uma pilha de tecnologia subjacente composta por HTML, CSS e JavaScript. Ele não recebe tantas solicitações quanto os outros serviços e nos proporciona uma forma segura de testar as opções de implantação.
Observação
O código do aplicativo Web está disponível neste repositório GitHub caso deseje explorar o código-fonte mais detalhadamente. Além disso, esse aplicativo de exemplo será implantado somente em um pool de nós do Linux.
Importante
É preciso ter uma assinatura do Azure para fazer esse exercício, e isso pode gerar encargos. Caso ainda não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar.
Criar um manifesto de implantação
Você cria um arquivo de manifesto de implantação para implantar seu aplicativo. O arquivo de manifesto permite que você defina o tipo de recurso que deseja implantar e todos os detalhes associados à carga de trabalho.
O Kubernetes agrupa os contêineres em estruturas lógicas chamadas pods, que não têm inteligência. As implantações adicionam a inteligência ausente para criar o seu aplicativo. Vamos criar um arquivo de implantação.
Entre no Azure Cloud Shell.
No Cloud Shell, crie um arquivo de manifesto para a implantação do Kubernetes chamado
deployment.yaml
usando o editor integrado.touch deployment.yaml
Abra o editor integrado no Cloud Shell inserindo
code .
Abra o arquivo
deployment.yaml
e adicione a seguinte seção de código do YAML.# deployment.yaml apiVersion: apps/v1 # The API resource where this workload resides kind: Deployment # The kind of workload we're creating metadata: name: contoso-website # This will be the name of the deployment
Nesse código, você adicionou as duas primeiras chaves para informar ao Kubernetes o
apiVersion
e okind
do manifesto que você está criando. Oname
é o nome da implantação. Use-o para identificar e consultar as informações da implantação quando usar okubectl
.Dica
Para obter mais informações sobre o
apiVersion
e quais valores colocar nessa chave, consulte a documentação oficial do Kubernetes. O link está localizado no final deste módulo.Uma implantação encapsula um pod. Você usa uma definição de modelo para definir as informações do pod dentro do arquivo de manifesto. O modelo é colocado no arquivo de manifesto na seção de especificação da implantação.
Atualize o arquivo
deployment.yaml
para que ele corresponda ao seguinte YAML.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: # Metadata for the pod labels: app: contoso-website
Os pods não usam os mesmos nomes que as implantações. O nome do pod é uma combinação do nome da implantação com uma ID aleatória adicionada ao final.
Observe o uso da chave
labels
. A chavelabels
é adicionada para permitir que as implantações encontrem e agrupem os pods.Um pod encapsula um ou mais contêineres. Todos os pods têm uma seção de especificação que permite a definição de contêineres dentro do pod em questão.
Atualize o arquivo
deployment.yaml
para que ele corresponda ao YAML a seguir.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: # Here we define all containers - name: contoso-website
A chave
containers
é uma matriz de especificações de contêiner, pois um pod pode ter um ou mais contêineres. A especificação define umaimage
, umname
, osresources
, asports
e outras informações importantes sobre o contêiner.Todos os pods em execução seguem o nome
contoso-website-<UUID>
, em que a UUID é uma ID gerada para identificar todos os recursos de maneira exclusiva.É uma boa prática definir uma quantidade mínima e máxima de recursos que o aplicativo tem permissão para usar no cluster. A chave
resources
é usada para especificar essas informações.Atualize o arquivo
deployment.yaml
para que ele corresponda ao seguinte YAML.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: # Minimum amount of resources requested cpu: 100m memory: 128Mi limits: # Maximum amount of resources requested cpu: 250m memory: 256Mi
Observe como a seção de recursos permite que você especifique a quantidade mínima de recursos como uma solicitação e o valor máximo do recurso como um limite.
A última etapa é definir as portas que são expostas externamente por esse contêiner por meio da chave
ports
. A chaveports
é uma matriz de objetos, o que significa que um contêiner em um pod pode expor várias portas com vários nomes.Atualize o arquivo
deployment.yaml
para que ele corresponda ao YAML a seguir.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 # This container exposes port 80 name: http # We named that port "http" so we can refer to it later
Observe como a porta é nomeada usando a chave
name
. A nomeação de portas permite que você altere a porta exposta sem alterar os arquivos que referenciam essa porta.Por fim, adicione uma seção de seletor para definir as cargas de trabalho gerenciadas pela implantação. A chave
selector
é colocada dentro da seção de especificação de implantação do arquivo de manifesto. Use a chavematchLabels
para listar os rótulos de todos os pods gerenciados pela implantação.Atualize o arquivo
deployment.yaml
para que ele corresponda ao YAML a seguir.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: selector: # Define the wrapping strategy matchLabels: # Match all pods with the defined labels app: contoso-website # Labels follow the `name: value` template template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 name: http
Observação
Em um cluster do AKS que tem vários pools de nós (Linux e Windows), o arquivo de manifesto de implantação listado anteriormente também define um
nodeSelector
para instruir o cluster do AKS a executar o pod do aplicativo de exemplo em um nó que possa executar contêineres do Linux.Os nós do Linux não podem executar contêineres do Windows e vice-versa.
Salve o arquivo de manifesto e feche o editor.
Aplicar o manifesto
No Cloud Shell, execute o comando
kubectl apply
para enviar o manifesto de implantação ao cluster.kubectl apply -f ./deployment.yaml
O comando vai gerar um resultado semelhante ao exemplo a seguir.
deployment.apps/contoso-website created
Execute o comando
kubectl get deploy
para verificar se a implantação foi bem-sucedida.kubectl get deploy contoso-website
O comando vai gerar uma tabela semelhante ao exemplo a seguir.
NAME READY UP-TO-DATE AVAILABLE AGE contoso-website 0/1 1 0 16s
Execute o comando
kubectl get pods
para verificar se o pod está em execução.kubectl get pods
O comando vai gerar uma tabela semelhante ao exemplo a seguir.
NAME READY STATUS RESTARTS AGE contoso-website-7c58c5f699-r79mv 1/1 Running 0 63s