Implementando apps nativos do Kubernetes em clusters

Implante aplicativos em contêineres em IBM Cloud® Kubernetes Service usando técnicas de Kubernetes. Realize atualizações progressivas e reversões sem tempo de inatividade para seus usuários.

Saiba mais sobre a criação de arquivos de configuração no guia Práticas recomendadas de configuração.

Ativando o painel do Kubernetes

Acesse o painel Kubernetes para visualizar as informações do cluster e do nó de trabalho por meio do console IBM Cloud ou da CLI.

Antes de começar, verifique se você tem a função de acesso apropriada. Efetue login na sua conta. If applicable, target the appropriate resource group. Configure o contexto para o seu cluster.

Ativando o painel do Kubernetes no console do IBM Cloud

  1. Efetue login no console da IBM Cloud.
  2. Na barra de menus, selecione a conta que você deseja usar.
  3. No menu Ícone do menu , clique em Containers > Clusters.
  4. Na página Clusters, clique no cluster que você deseja acessar.
  5. Na página de detalhes do cluster, clique no botão Painel do Kubernetes.

Ativando o painel do Kubernetes por meio da CLI

O método CLI permite a automação e a integração de CI/CD. Instale a CLI antes de começar.

  1. Obtenha suas credenciais do Kubernetes.

    kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}'
    
  2. Copie o valor do token de identificação da saída.

  3. Inicie o proxy.

    kubectl proxy
    

    Exemplo de saída

    Starting to serve on 127.0.0.1:8001
    
  4. Conecte-se ao painel.

    1. Acesse o seguinte endereço URL no seu navegador:
        http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
        ```
    2. Selecione o método de autenticação **Token** na página de logon.
    
    3. Cole o valor **do id-token** no campo “**Token** ” e clique em “**ENTRAR** ”.
    
    

Use CTRL+C para sair do comando proxy. Execute kubectl proxy novamente para reiniciar o painel.

Implementando apps com o painel do Kubernetes

Implemente aplicativos por meio do painel, inserindo detalhes de configuração ou carregando um arquivo YAML.

Antes de começar, abra o painel e verifique se você tem uma função de acesso ao serviço. Efetue login na sua conta. If applicable, target the appropriate resource group. Configure o contexto para o seu cluster.

Para implementar seu aplicativo

  1. Clique em + Criar.

  2. Escolha um método de implantação:

    • Selecione “Especificar detalhes do aplicativo” e insira os detalhes.
    • Selecione Fazer upload de um arquivo YAML ou JSON para fazer upload do arquivo de configuração do app.
  3. Clique em Implantações para verificar se o aplicativo foi implantado com êxito.

Implementando apps com a CLI

O método CLI oferece controle preciso e permite a automação. Você criará arquivos de configuração que definem os recursos do seu aplicativo e podem ser controlados por versão.

Antes de começar, instale a CLI e verifique se você tem uma função de acesso ao serviço. Efetue login na sua conta. If applicable, target the appropriate resource group. Configure o contexto para o seu cluster.

Para implementar seu aplicativo

  1. Crie um arquivo de configuração que inclua os recursos Deployment, Service e Ingress, conforme necessário. Saiba mais sobre como proteger suas informações pessoais quando trabalhar com recursos do Kubernetes.

  2. Aplique o arquivo de configuração.

    kubectl apply -f config.yaml
    
  3. Verifique se você pode acessar seu aplicativo.

Implementando apps em nós do trabalhador específicos usando rótulos

Ao implementar um app, os pods de app são implementados indiscriminadamente em vários nós do trabalhador em seu cluster. Às vezes você pode querer restringir os nós do trabalhador nos quais os pods de app são implementados. Por exemplo, é possível que você queira que os pods de app sejam implementados somente em nós do trabalhador em um determinado conjunto de trabalhadores porque esses nós do trabalhador estão em máquinas bare metal. Para designar os nós do trabalhador nos quais os pods de app devem ser implementados, inclua uma regra de afinidade em sua implementação de app.

Antes de Iniciar

Para implementar apps em nós do trabalhador específicos,

  1. Obtenha o ID do conjunto de trabalhadores para o qual você deseja implementar os pods de app.

    ibmcloud ks worker-pool ls --cluster CLUSTER_NAME_OR_ID
    
  2. Liste os nós do trabalhador que estão no conjunto de trabalhadores e anote um dos endereços IP privado.

    ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
    
  3. Descreva o nó do trabalhador. Na saída Rótulos, anote o rótulo do ID do conjunto de trabalhadores, ibm-cloud.kubernetes.io/worker-pool-id.

    As etapas neste tópico usam um ID do conjunto de trabalhadores para implementar pods de app apenas para nós do trabalhador dentro desse conjunto de trabalhadores. Para implementar os pods de app em nós do trabalhador específicos usando um rótulo diferente, anote esse rótulo. Por exemplo, para implementar os pods de app apenas para os nós do trabalhador em uma VLAN privada específica, use a etiqueta privateVLAN=.

    kubectl describe node <worker_node_private_IP>
    

    Exemplo de saída

    NAME:               10.xxx.xx.xxx
    Roles:              <none>
    Labels:             arch=amd64
                        beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/instance-type=b3c.4x16.encrypted
                        beta.kubernetes.io/os=linux
                        failure-domain.beta.kubernetes.io/region=us-south
                        failure-domain.beta.kubernetes.io/zone=dal10
                        ibm-cloud.kubernetes.io/encrypted-docker-data=true
                        ibm-cloud.kubernetes.io/ha-worker=true
                        ibm-cloud.kubernetes.io/iaas-provider=softlayer
                        ibm-cloud.kubernetes.io/machine-type=b3c.4x16.encrypted
                        ibm-cloud.kubernetes.io/sgx-enabled=false
                        ibm-cloud.kubernetes.io/worker-pool-id=00a11aa1a11aa11a1111a1111aaa11aa-11a11a
                        ibm-cloud.kubernetes.io/worker-version=1.36_1534
                        kubernetes.io/hostname=10.xxx.xx.xxx
                        privateVLAN=1234567
                        publicVLAN=7654321
    Annotations:        node.alpha.kubernetes.io/ttl=0
    ...
    
  4. Inclua uma regra de afinidade para o rótulo do ID do conjunto de trabalhadores para a implementação do app.

    Exemplo de YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: with-node-affinity
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ibm-cloud.kubernetes.io/worker-pool-id
                    operator: In
                    values:
                    - <worker_pool_ID>
    ...
    

    Na seção afinidade do exemplo YAML, ibm-cloud.kubernetes.io/worker-pool-id é o key e <worker_pool_ID> é o value.

  5. Aplique o arquivo de configuração de implementação atualizado.

    kubectl apply -f with-node-affinity.yaml
    
  6. Verifique se os pods de app foram implementados nos nós do trabalhador corretos.

    1. Liste os pods em seu cluster.
        kubectl get pods -o wide
        ```
        Exemplo de saída
        ```sh {: screen}
        NAME                   READY     STATUS              RESTARTS   AGE       IP               NODE
        cf-py-d7b7d94db-vp8pq  1/1       Running             0          15d       172.30.xxx.xxx   10.176.48.78
        ```
    2. Na saída, identifique um pod para seu app. Anote o endereço IP privado do **NODE** dodo trabalhador no qual o pod está.
    
        Na saída de exemplo anterior, o pod de app `cf-py-d7b7d94db-vp8pq` está em um nó do trabalhador com o endereço IP `10.xxx.xx.xxx`.
    
    3. Liste os nós do trabalhador no conjunto de trabalhadores que você designou em sua implementação de app.
    
    ```sh {: pre}
        ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
        ```
        Exemplo de saída
    
        ```sh {: screen}
        ID                                                 Public IP       Private IP     Machine Type      State    Status  Zone    Version
        kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w7   169.xx.xxx.xxx  10.176.48.78   b3c.4x16          normal   Ready   dal10   1.8.6_1504
        kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w8   169.xx.xxx.xxx  10.176.48.83   b3c.4x16          normal   Ready   dal10   1.8.6_1504
        kube-dal12-crb20b637238bb471f8b4b8b881bbb4962-w9   169.xx.xxx.xxx  10.176.48.69   b3c.4x16          normal   Ready   dal12   1.8.6_1504
        ```
        Se você criou uma regra de afinidade de app baseada em outro fator, obtenha esse valor no lugar. Por exemplo, para verificar se o pod do app está implementado em um nó do trabalhador em uma VLAN específica, visualize a VLAN na qual o nó do trabalhador se encontra executando `ibmcloud ks worker get --cluster CLUSTER_NAME_OR_ID --worker WORKER_ID`.
        {: tip}
    
    4. Na saída, verifique se o nó do trabalhador com o endereço IP privado que você identificou na etapa anterior está implementado nesse conjunto de trabalhadores.
    
    

Implantação de um aplicativo em uma máquina com GPU do NVIDIA

Se você tiver um tipo de máquina GPU, será possível acelerar o tempo de processamento necessário para cargas de trabalho intensivas de cálculo, como IA, aprendizado de máquina, inferência e mais.

Mudanças importantes no driver a partir da versão Kubernetes 1.36: IBM Cloud Kubernetes Service não instala mais os drivers de GPU NVIDIA em nós de trabalho com GPUs a partir da versão Kubernetes 1.36. Se você planeja executar cargas de trabalho de GPU na versão 1.36 ou em clusters posteriores, deverá gerenciar a instalação e o ciclo de vida do driver da GPU em seus próprios nós de trabalho. Para clusters que executam a versão 1.35 ou anterior, os drivers de GPU fornecidos pela IBM continuam disponíveis. Para obter orientação sobre migração, consulte Migração para drivers de GPU autogerenciados NVIDIA.

Nas etapas a seguir, você aprenderá como implementar cargas de trabalho que requerem a GPU. No entanto, também é possível implantar aplicativos que não precisam processar suas cargas de trabalho tanto na GPU quanto na CPU.

Você também pode experimentar cargas de trabalho matematicamente intensivas, como a estrutura de TensorFlow aprendizado de máquina, com esta Kubernetes demonstração.

Pré-requisitos

Antes de Iniciar

  • Crie um cluster ou um conjunto de trabalhadores que use um tipo de GPU Tenha em mente que a configuração de uma máquina bare metal pode levar mais de um dia útil para ser concluída. Para obter uma lista de tipos disponíveis, consulte os links a seguir:

  • Certifique-se de que esteja designado a uma função de acesso ao serviço que concede a função apropriada de RBAC do Kubernetes para poder trabalhar com recursos do Kubernetes no cluster.

Para a versão Kubernetes 1.36 e posteriores: Você deve instalar e gerenciar a pilha de drivers da GPU NVIDIA por conta própria. IBM Cloud Kubernetes Service não fornece mais drivers de GPU pré-instalados nos nós de trabalho. Siga o guia de instalação do NVIDIA GPU Operator para instalar os componentes necessários:

  • NVIDIA driver do kernel
  • Componentes de tempo de execução do contêiner (por exemplo, nvidia-container-toolkit)
  • Kubernetes plug-in de dispositivo

Até que o driver seja instalado, os pods que solicitam GPUs permanecerão no estado Pending. Eles farão a transição para Running automaticamente depois que um driver compatível estiver disponível no nó.

Para a versão Kubernetes 1.35 e anteriores: IBM- os drivers de GPU fornecidos são instalados automaticamente nos nós de trabalho da GPU. Não é necessário instalar nenhum driver adicional.

Implementando uma carga de trabalho

  1. Crie um arquivo YAML. Neste exemplo, um arquivo YAML do tipo “ Job ” gerencia cargas de trabalho semelhantes a processamento em lote, criando um pod de curta duração que é executado até que o comando seja concluído e seja encerrado com sucesso.

    Para cargas de trabalho de GPU, é necessário especificar o campo resources: limits: nvidia.com/gpu no arquivo YAML da tarefa.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: nvidia-devicequery
      labels:
        name: nvidia-devicequery
    spec:
      template:
        metadata:
          labels:
            name: nvidia-devicequery
        spec:
          containers:
          - name: nvidia-devicequery
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04
            imagePullPolicy: IfNotPresent
            resources:
              limits:
                nvidia.com/gpu: 2
          restartPolicy: Never
    
    Compreensão de seus componentes YAML
    Componente Descrição
    Metadados e nomes de rótulo Insira um nome e um rótulo para a tarefa e use o mesmo nome nos metadados do arquivo e nos metadados do spec template. Por exemplo, nvidia-devicequery.
    containers.image Forneça a imagem da qual o contêiner é uma instância em execução. Neste exemplo, o valor é configurado para usar a imagem de consulta do dispositivo CUDA DockerHub:nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04.
    containers.imagePullPolicy Para puxar uma nova imagem somente se a imagem não estiver atualmente no nó do trabalhador, especifique IfNotPresent.
    resources.limits

    Para máquinas de GPU, deve-se especificar o limite de recurso. O Plug-in do dispositivo do Kubernetes configura a solicitação de recursos padrão para corresponder ao limite.

    • Deve-se especificar a chave como nvidia.com/gpu.
    • Insira o número inteiro de GPUs solicitado, como 2. Observe que os pods de contêiner não compartilham GPUs e as GPUs não podem ser supercomprometidas. Por exemplo, se você tem somente 1 máquina mg1c.16x128, então tem apenas 2 GPUs nessa máquina e pode especificar um máximo de 2.
  2. Aplique o arquivo YAML. Por exemplo:

    kubectl apply -f nvidia-devicequery.yaml
    
  3. Verifique o pod de tarefa filtrando seus pods pelo rótulo “ nvidia-devicequery ”. Verifique se o STATUS é Concluído.

    kubectl get pod -A -l 'name in (nvidia-devicequery)'
    

    Exemplo de saída

    NAME                  READY     STATUS      RESTARTS   AGE
    nvidia-devicequery-ppkd4      0/1       Completed   0          36s
    
  4. Descreva o pod para ver como o plug-in do dispositivo de GPU planejou o pod.

    • Nos campos Limits e Requests, veja se o limite de recurso que você especificou corresponde à solicitação que o plug-in do dispositivo configurou automaticamente.
    • Nos eventos, verifique se o pod está designado ao seu nó do trabalhador da GPU.
        kubectl describe pod nvidia-devicequery-ppkd4
        ```
        Exemplo de saída
        ```sh {: screen}
        NAME:           nvidia-devicequery-ppkd4
        Namespace:      default
        ...
        Limits:
            nvidia.com/gpu:  1
        Requests:
            nvidia.com/gpu:  1
        ...
        Events:
        Type    Reason                 Age   From                     Message
        ----    ------                 ----  ----                     -------
        Normal  Scheduled              1m    default-scheduler        Successfully assigned nvidia-devicequery-ppkd4 to 10.xxx.xx.xxx
        ...
        ```
    
  5. Para verificar se a tarefa usou a GPU para calcular sua carga de trabalho, é possível verificar os logs.

    kubectl logs nvidia-devicequery-ppkd4
    

    Exemplo de saída

    /cuda-samples/sample Starting...
    CUDA Device Query (Runtime API) version (CUDART static linking)
    Detected 1 CUDA Capable device(s)
    Device 0: "Tesla P100-PCIE-16GB"
    CUDA Driver Version / Runtime Version          11.4 / 11.7
    CUDA Capability Major/Minor version number:    6.0
    Total amount of global memory:                 16281 MBytes (17071734784 bytes)
    (056) Multiprocessors, (064) CUDA Cores/MP:    3584 CUDA Cores
    GPU Max Clock rate:                            1329 MHz (1.33 GHz)
    Memory Clock rate:                             715 Mhz
    Memory Bus Width:                              4096-bit
    L2 Cache Size:                                 4194304 bytes
    Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
    Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
    Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
    Total amount of constant memory:               65536 bytes
    Total amount of shared memory per block:       49152 bytes
    Total shared memory per multiprocessor:        65536 bytes
    Total number of registers available per block: 65536
    Warp size:                                     32
    Maximum number of threads per multiprocessor:  2048
    Maximum number of threads per block:           1024
    Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
    Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
    Maximum memory pitch:                          2147483647 bytes
    Texture alignment:                             512 bytes
    Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
    Run time limit on kernels:                     No
    Integrated GPU sharing Host Memory:            No
    Support host page-locked memory mapping:       Yes
    Alignment requirement for Surfaces:            Yes
    Device has ECC support:                        Enabled
    Device supports Unified Addressing (UVA):      Yes
    Device supports Managed Memory:                Yes
    Device supports Compute Preemption:            Yes
    Supports Cooperative Kernel Launch:            Yes
    Supports MultiDevice Co-op Kernel Launch:      Yes
    Device PCI Domain ID / Bus ID / location ID:   0 / 175 / 0
    Compute Mode:
    < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.4, CUDA Runtime Version = 11.7, NumDevs = 1
    Result = PASS
    

    Neste exemplo, você vê que uma GPU foi usada para executar a tarefa, pois a GPU foi planejada no nó do trabalhador Se o limite for configurado para 2, apenas 2 GPUs serão mostradas.

Agora que você implementou uma carga de trabalho de GPU de teste, talvez deseje configurar o cluster para executar uma ferramenta que conte com processamento de GPU, como IBM Maximo Visual Inspection.

Migração para drivers de GPU NVIDIA autogerenciados

Para obter orientações detalhadas sobre a migração de drivers de GPU fornecidos pela IBM para drivers autogerenciados ao atualizar para a versão Kubernetes 1.36, consulte Migração para drivers de GPU autogerenciados NVIDIA para Kubernetes 1.36.