Exercício – Explorar a funcionalidade de um cluster do Kubernetes

Concluído

Várias opções estão disponíveis ao executar o Kubernetes localmente. Você pode instalar o Kubernetes em computadores físicos ou VMs ou usar uma solução baseada em nuvem, como o AKS (Serviço de Kubernetes do Azure).

Neste exercício, sua meta é explorar uma instalação do Kubernetes com um cluster de nó único. Neste exercício, você aprenderá a configurar e instalar um ambiente do MicroK8s que é fácil de configurar e desativar. Em seguida, você implanta um serviço do Kubernetes e o dimensiona para várias instâncias para hospedar um site.

Observação

Este exercício é opcional e inclui etapas que mostram como excluir e desinstalar o software e os recursos que você usará no exercício.

Tenha em mente que há outras opções para fazer o mesmo, como o suporte ao Kubernetes e ao MiniKube no Docker.

O que é o MicroK8s?

O MicroK8s é uma opção para implantar um cluster de nó único do Kubernetes como pacote único em estações de trabalho de destino e dispositivos IoT (Internet das Coisas). A Canonical, criadora do Ubuntu Linux, desenvolveu o MicroK8s originalmente e ainda o mantém.

Você pode instalar o MicroK8s no Linux, no Windows e no macOS. No entanto, as instruções de instalação são ligeiramente diferentes para cada sistema operacional. Escolha a opção que melhor se adapta ao seu ambiente.

Instalar o MicroK8s no Linux

A instalação do Linux do MicroK8s é a opção de instalação com o menor número de etapas. Alterne para uma janela de terminal e execute os comandos das seguintes instruções:

  1. Instale o aplicativo de ajuste MicroK8s. Essa etapa pode levar alguns minutos para ser concluída, dependendo da velocidade da sua conexão com a Internet e da área de trabalho.

    sudo snap install microk8s --classic
    

    Uma instalação bem-sucedida mostra a mensagem a seguir.

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

Agora você está pronto para instalar complementos no cluster.

Instalar o MicroK8s no Windows

Para executar o MicroK8s no Windows, use o Multipass. O Multipass é um gerenciador de VMs leve para Linux, Windows e macOS.

  1. Baixe e instale a versão mais recente do Multipass para Windows do GitHub.

  2. Em um console de comando, execute o comando de inicialização do Multipass para configurar e executar a imagem microk8s-vm. Essa etapa pode levar alguns minutos para ser concluída, dependendo da velocidade da sua conexão com a Internet e da área de trabalho.

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. Depois de receber a confirmação da inicialização da microk8s-vm, execute o comando multipass shell microk8s-vm para acessar a instância da VM.

    multipass shell microk8s-vm
    

    Depois que a multipassagem estiver funcionando, você poderá acessar a VM do Ubuntu para hospedar seu cluster e instalar o MicroK8s.

  4. Instale o aplicativo de ajuste MicroK8s. Essa etapa pode levar alguns minutos para ser concluída, dependendo da velocidade da sua conexão com a Internet e da área de trabalho.

    sudo snap install microk8s --classic
    

    Uma instalação bem-sucedida mostra a seguinte mensagem:

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

Agora você está pronto para instalar complementos no cluster.

Instalar o MicroK8s no macOS

Para executar o MicroK8s no macOS, use o Multipass. O Multipass é um gerenciador de VMs leve para Linux, Windows e macOS.

  1. Você tem duas opções para instalar o Multipass no macOS. Baixe e instale a última versão do Multipass para macOS do GitHub ou use o Homebrew para instalar o Multipass com o comando brew cask install multipass.

    brew install --cask multipass
    
  2. Em um console de comando, execute o comando de inicialização do Multipass para configurar e executar a imagem microk8s-vm. Essa etapa pode levar alguns minutos para ser concluída, dependendo da velocidade da sua conexão com a Internet e da área de trabalho.

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. Depois de receber a confirmação de inicialização da microk8s-vm, execute o comando multipass shell microk8s-vm para inserir a instância da VM.

    multipass shell microk8s-vm
    

    Nesse ponto, você poderá acessar a VM do Ubuntu que para hospedar o seu cluster. Você ainda precisa instalar o MicroK8s. Siga estas etapas.

  4. Instale o aplicativo de ajuste MicroK8s. Essa etapa pode levar alguns minutos para ser concluída, dependendo da velocidade da sua conexão com a Internet e da área de trabalho.

    sudo snap install microk8s --classic
    

    Uma instalação bem-sucedida mostra a seguinte mensagem:

    2020-03-16T12:50:59+02:00 INFO Waiting for restart...
    microk8s v1.17.3 from Canonical✓ installed
    

Agora você está pronto para instalar complementos no cluster.

Preparar o cluster

Para ver o status dos complementos instalados no cluster, execute o comando de status do MicroK8s. Esses complementos fornecem vários serviços, alguns dos quais você abordou anteriormente. Um exemplo é a funcionalidade do DNS.

  1. Para verificar o status da instalação, execute o comando microk8s.status --wait-ready.

    sudo microk8s.status --wait-ready
    

    Observe que há vários complementos desabilitados em seu cluster. Não se preocupe com os complementos que você não reconhece.

    microk8s is running
    addons:
    cilium: disabled
    dashboard: disabled
    dns: disabled
    fluentd: disabled
    gpu: disabled
    helm3: disabled
    helm: disabled
    ingress: disabled
    istio: disabled
    jaeger: disabled
    juju: disabled
    knative: disabled
    kubeflow: disabled
    linkerd: disabled
    metallb: disabled
    metrics-server: disabled
    prometheus: disabled
    rbac: disabled
    registry: disabled
    storage: disabled
    
  2. Na lista, você precisa habilitar os complementos DNS, Painel e Registro. Aqui estão as finalidades de cada complemento:

    Complementos Finalidade
    DNS Implanta o serviço coreDNS.
    Painel Implanta o serviço kubernetes-dashboard e vários outros serviços que dão suporte à funcionalidade dele. É uma interface do usuário de uso geral, baseada na Web, para clusters do Kubernetes.
    Registro Implanta um Registro privado e vários serviços que dão suporte à funcionalidade dele. Para armazenar contêineres privados, use esse Registro.

    Para instalar os complementos, execute o comando a seguir.

    sudo microk8s.enable dns dashboard registry
    

Agora estamos prontos para acessar seu cluster usando kubectl.

Explorar o cluster do Kubernetes

O MicroK8s fornece uma versão do kubectl que você pode usar para interagir com o novo cluster do Kubernetes. Essa cópia do kubectl permite que você tenha uma instalação paralela de outra instância kubectl no âmbito de todo o sistema, sem afetar a funcionalidade dela.

  1. Execute o comando snap alias para criar um alias microk8s.kubectl para kubectl. Essa etapa simplifica o uso.

    sudo snap alias microk8s.kubectl kubectl
    

    A seguinte saída aparece quando o comando é concluído com êxito:

    Added:
      - microk8s.kubectl as kubectl
    

Exibir informações sobre o nó de cluster

Lembre-se de que um cluster do Kubernetes existe fora dos painéis de controle e dos nós de trabalho. Vamos explorar o novo cluster para ver o que está instalado.

  1. Verifique os nós que estão em execução no cluster.

    Você sabe que o MicroK8s é uma instalação de cluster de nó único, portanto, você espera ver apenas um nó. Tenha em mente, contudo, que esse nó é o painel de controle e um nó de trabalho no cluster. Confirme essa configuração executando o comando kubectl get nodes. Para recuperar informações sobre todos os recursos no seu cluster, execute o comando kubectl get:

    sudo kubectl get nodes
    

    O resultado é semelhante ao exemplo a seguir, que mostra a existência de apenas um nó no cluster com o nome microk8s-vm. Observe que o nó está em um estado pronto. O estado pronto indica que o painel de controle pode agendar cargas de trabalho nesse nó.

    NAME          STATUS   ROLES    AGE   VERSION
    microk8s-vm   Ready    <none>   35m   v1.17.3
    

    É possível obter mais informações para o recurso específico solicitado. Por exemplo, vamos supor que você precise encontrar o endereço IP do nó. Para obter informações adicionais sobre o servidor de API, execute o parâmetro -o wide:

    sudo kubectl get nodes -o wide
    

    O resultado é semelhante ao do exemplo a seguir. Observe que agora é possível ver o endereço IP interno do nó, o SO em execução no nó, a versão do kernel e o runtime de contêiner.

    NAME          STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
    microk8s-vm   Ready    <none>   36m   v1.17.3   192.168.56.132   <none>        Ubuntu 18.04.4 LTS   4.15.0-88-generic   containerd://1.2.5
    
  2. A próxima etapa é explorar os serviços em execução no cluster. Assim como ocorre com os nós, para encontrar informações sobre os serviços em execução no cluster, execute o comando kubectl get.

    sudo kubectl get services -o wide
    

    O resultado é semelhante ao do exemplo a seguir, mas observe que apenas um serviço está listado. Você instalou suplementos no cluster anteriormente e espera conferir esses serviços também.

    NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   37m   <none>
    

    O motivo da listagem de serviço único é que o Kubernetes utiliza um conceito chamado namespaces para dividir logicamente um cluster em vários clusters virtuais.

    Para buscar todos os serviços em todos os namespaces, passe o parâmetro --all-namespaces:

    sudo kubectl get services -o wide --all-namespaces
    

    O resultado é semelhante ao do exemplo a seguir. Observe que há três namespaces no cluster. São eles os namespaces padrão, container-registry e kube-system. Aqui você pode ver as instâncias registry, kube-dns e kubernetes-dashboard instaladas. Você também verá os serviços de suporte que foram instalados juntamente com alguns dos complementos.

    NAMESPACE            NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE   SELECTOR
    container-registry   registry                    NodePort    10.152.183.36    <none>        5000:32000/TCP           28m   app=registry
    default              kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP                  37m   <none>
    kube-system          dashboard-metrics-scraper   ClusterIP   10.152.183.130   <none>        8000/TCP                 28m   k8s-app=dashboard-metrics-scraper
    kube-system          heapster                    ClusterIP   10.152.183.115   <none>        80/TCP                   28m   k8s-app=heapster
    kube-system          kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   28m   k8s-app=kube-dns
    kube-system          kubernetes-dashboard        ClusterIP   10.152.183.132   <none>        443/TCP                  28m   k8s-app=kubernetes-dashboard
    kube-system          monitoring-grafana          ClusterIP   10.152.183.88    <none>        80/TCP                   28m   k8s-app=influxGrafana
    kube-system          monitoring-influxdb         ClusterIP   10.152.183.232   <none>        8083/TCP,8086/TCP        28m   k8s-app=influxGrafana
    

    Agora que você pode ver os serviços em execução no cluster, você pode agendar uma carga de trabalho no nó de trabalho.

Instalar um servidor Web em um cluster

É interessante agendar um servidor Web no cluster para oferecer um site a seus clientes. Você pode escolher entre várias opções. Nesse exemplo, você usará o NGINX.

Lembre-se de que você pode usar arquivos de manifesto de pod para descrever seus pods, conjuntos de réplicas e implantações para definir cargas de trabalho. Como você não abordou esses arquivos em detalhes, você deverá usar kubectl para passar diretamente as informações ao servidor de API.

Embora o uso de kubectl seja útil, o uso de arquivos de manifesto é uma melhor prática. Os arquivos de manifesto permitem que você efetue roll forward ou reverta as implantações com facilidade no cluster. Esses arquivos também ajudam a documentar a configuração de um cluster.

  1. Para criar sua implantação do NGINX, execute o comando kubectl create deployment. Especifique o nome da implantação e a imagem de contêiner para criar somente uma instância do pod.

    sudo kubectl create deployment nginx --image=nginx
    

    O resultado é semelhante ao do exemplo a seguir:

    deployment.apps/nginx created
    
  2. Para buscar as informações sobre sua implantação, execute kubectl get deployments:

    sudo kubectl get deployments
    

    O resultado é semelhante ao do exemplo a seguir. Observe que o nome da implantação corresponde ao nome que você forneceu a ela e que somente uma implantação com esse nome está em um estado pronto e disponível.

    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nginx   1/1     1            1           18s
    
  3. A implantação criou um pod. Para buscar informações sobre os pods do seu cluster, execute o comando kubectl get pods:

    sudo kubectl get pods
    

    O resultado é semelhante ao do exemplo a seguir. Observe que o nome do pod é um valor gerado prefixado com o nome da implantação, e o pod tem um status Em execução.

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-86c57db685-dj6lz   1/1     Running   0          33s
    

Testar a instalação do site

Teste a instalação do NGINX conectando-se ao servidor Web usando o endereço IP do pod.

  1. Para encontrar o endereço do pod, passe o parâmetro -o wide:

    sudo kubectl get pods -o wide
    

    O resultado é semelhante ao do exemplo a seguir. Observe que o comando retorna o endereço IP e o nome do nó no qual a carga de trabalho está agendada.

    NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE          NOMINATED NODE   READINESS GATES
    nginx-86c57db685-dj6lz   1/1     Running   0          4m17s   10.1.83.10   microk8s-vm   <none>           <none>
    
  2. Para acessar o site, execute wget no IP listado antes:

    wget <POD_IP>
    

    O resultado é semelhante ao do exemplo a seguir:

    --2020-03-16 13:34:17--  http://10.1.83.10/
    Connecting to 10.1.83.10:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 612 [text/html]
    Saving to: 'index.html'
    
    index.html                                    100%[==============================================================================================>]     612  --.-KB/s    in 0s
    
    2020-03-16 13:34:17 (150 MB/s) - 'index.html' saved [612/612]
    

Dimensionar uma implantação de servidor Web em um cluster

Suponha que você observe um aumento repentino nos usuários que acessam o seu site e que ele comece a falhar devido a essa carga. Você poderá implantar mais instâncias do site em seu cluster e dividir a carga entre as instâncias.

Para escalar o número de réplicas na sua implantação, execute o comando kubectl scale. Especifique o número de réplicas de que precisa e o nome da implantação.

  1. Para escalar o total de pods do NGINX para três, execute o comando kubectl scale:

    sudo kubectl scale --replicas=3 deployments/nginx
    

    O resultado é semelhante ao do exemplo a seguir:

    deployment.apps/nginx scaled
    

    O comando de dimensionamento permite que você dimensione a contagem de instâncias para cima ou para baixo.

  2. Para verificar o número de pods em execução, execute o comando kubectl get e passe novamente o parâmetro -o wide:

    sudo kubectl get pods -o wide
    

    O resultado é semelhante ao do exemplo a seguir. Observe que agora você vê três pods em execução, cada qual com um endereço IP exclusivo.

    NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE          NOMINATED NODE   READINESS GATES
    nginx-86c57db685-dj6lz   1/1     Running   0          7m57s   10.1.83.10   microk8s-vm   <none>           <none>
    nginx-86c57db685-lzrwp   1/1     Running   0          9s      10.1.83.12   microk8s-vm   <none>           <none>
    nginx-86c57db685-m7vdd   1/1     Running   0          9s      10.1.83.11   microk8s-vm   <none>           <none>
    ubuntu@microk8s-vm:~$
    

Você precisaria aplicar várias outras configurações ao cluster para expor efetivamente seu site como um site voltado para o público. Os exemplos incluem a instalação de um balanceador de carga e o mapeamento dos endereços IP do nó. Esse tipo de configuração faz parte dos aspectos avançados que você vai explorar futuramente. No resumo, há instruções se você optar por desinstalar e limpar sua VM.