Exercício – Implementar uma aplicação no seu cluster do Azure Kubernetes Service
Neste exercício, implante o site da sua empresa como um aplicativo de teste no Serviço Kubernetes do Azure (AKS). O site é estático e tem uma pilha de tecnologia subjacente de HTML, CSS e JavaScript. Não recebe tantos pedidos como os outros serviços e fornece-nos a forma mais segura de testar opções de implementação.
Nota
O código da aplicação Web está disponível neste repositório do GitHub se quiser explorar o código fonte em maior detalhe. Além disso, esse aplicativo de exemplo será implantado somente em um pool de nós Linux.
Importante
Precisa da sua própria subscrição do Azure para executar este exercício e poderá incorrer em custos. Se ainda não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.
Criar um manifesto de implementação
Irá criar um ficheiro de manifesto de implementação para implementar a sua aplicação. O ficheiro de manifesto permite-lhe definir que tipo de recurso quer implementar e todos os detalhes associados à carga de trabalho.
O Kubernetes agrupa contentores em estruturas lógicas denominadas pods, que não possuem informações. As implementações adicionam as informações em falta para criar a sua aplicação. Vamos criar um ficheiro de implementação.
Entre no Azure Cloud Shell.
No Cloud Shell, crie um ficheiro de manifesto para a implementação do Kubernetes chamado
deployment.yaml
através do editor integrado.touch deployment.yaml
Abra o editor integrado no Cloud Shell ao introduzir
code .
Abra o ficheiro
deployment.yaml
e adicione a seguinte secção de código de 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
No código acima, adicionou as duas primeiras chaves para indicar ao Kubernetes os campos
apiVersion
ekind
de manifesto que está a criar. O camponame
é o nome da implementação. Use-o para identificar e consultar as informações de implantação quando você usarkubectl
o .Gorjeta
Para obter mais informações sobre
apiVersion
e quais os valores a colocar nesta chave, veja a documentação oficial do Kubernetes. Encontrará uma ligação no final deste módulo.Uma implementação encapsula um pod. O utilizador dá uso a uma definição de modelo para definir as informações do pod dentro do ficheiro de manifesto. O modelo é colocado no ficheiro de manifesto por baixo da secção de especificações de implementação.
Atualize o ficheiro
deployment.yaml
para corresponder ao YAML seguinte.# 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 das implantações. O nome do pod é uma mistura do nome da implantação com um ID aleatório adicionado ao final.
Repare na utilização da chave
labels
. Adiciona a chavelabels
para permitir que as implementações encontrem e agrupem os pods.Um pod encapsula um ou mais contentores. Todos os pods têm uma secção de especificações que lhe permite definir os contentores dentro desse pod.
Atualize o ficheiro
deployment.yaml
para corresponder ao YAML seguinte.# 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 das especificações de contentores, pois um pod pode ter um ou mais contentores. A especificação define umimage
, aname
, ,ports
resources
e outras informações importantes sobre o recipiente.Todos os pods em execução seguem o nome
contoso-website-<UUID>
, onde UUID é um ID gerado para identificar todos os recursos exclusivamente.É uma boa prática definir uma quantidade mínima e máxima de recursos que o aplicativo pode usar do cluster. Utiliza a chave
resources
para especificar estas informações.Atualize o ficheiro
deployment.yaml
para corresponder ao YAML seguinte.# 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 secção de recursos lhe permite especificar a quantidade mínima de recursos como um pedido e a quantidade máxima de recursos como um limite.
A última etapa é definir as portas que esse contêiner expõe externamente através da
ports
chave. A chaveports
é uma matriz dos objetos, o que significa que um contentor num pod pode expor múltiplas portas com múltiplos nomes.Atualize o ficheiro
deployment.yaml
para corresponder ao YAML seguinte.# 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
Repare como é atribuído o nome à porta com a chave
name
. Atribuir nomes às portas permite-lhe alterar a porta exposta sem alterar os ficheiros que referenciam essa porta.Por fim, adicione uma seção seletora para definir as cargas de trabalho gerenciadas pela implantação. A chave
selector
é colocada dentro da secção de especificações de implementação do ficheiro de manifesto. Utilize a chavematchLabels
para listar as etiquetas de todos os pods geridos pela implementação.Atualize o ficheiro
deployment.yaml
para corresponder ao YAML seguinte.# 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
Nota
Em um cluster 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 para dizer ao cluster AKS para executar o pod do aplicativo de exemplo em um
nodeSelector
nó que possa executar contêineres Linux.Os nós Linux não podem executar contêineres do Windows e vice-versa.
Guarde o ficheiro de manifesto e feche o editor.
Aplicar o manifesto
No Cloud Shell, execute o comando
kubectl apply
para submeter o manifesto de implementação ao seu cluster.kubectl apply -f ./deployment.yaml
O comando deve ter um resultado semelhante ao do seguinte exemplo.
deployment.apps/contoso-website created
Execute o comando
kubectl get deploy
para verificar se a implementação foi concluída com êxito.kubectl get deploy contoso-website
O comando deve apresentar uma tabela semelhante à do seguinte exemplo.
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 deve apresentar uma tabela semelhante à do seguinte exemplo.
NAME READY STATUS RESTARTS AGE contoso-website-7c58c5f699-r79mv 1/1 Running 0 63s