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
- Efetue login no console da IBM Cloud.
- Na barra de menus, selecione a conta que você deseja usar.
- No menu Ícone do menu
, clique em Containers > Clusters.
- Na página Clusters, clique no cluster que você deseja acessar.
- 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.
-
Obtenha suas credenciais do Kubernetes.
kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}' -
Copie o valor do token de identificação da saída.
-
Inicie o proxy.
kubectl proxyExemplo de saída
Starting to serve on 127.0.0.1:8001 -
Conecte-se ao painel.
- 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
-
Clique em + Criar.
-
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.
-
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
-
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.
-
Aplique o arquivo de configuração.
kubectl apply -f config.yaml -
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
- Efetue login na sua conta. If applicable, target the appropriate resource group. Configure o contexto para o seu cluster.
- Opcional: Configure um rótulo para o conjunto de trabalhadores em que você deseja executar o app.
Para implementar apps em nós do trabalhador específicos,
-
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 -
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 -
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 ... -
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é okeye<worker_pool_ID>é ovalue. -
Aplique o arquivo de configuração de implementação atualizado.
kubectl apply -f with-node-affinity.yaml -
Verifique se os pods de app foram implementados nos nós do trabalhador corretos.
- 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** do nó do 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
-
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/gpuno 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: NeverCompreensã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.imageForneç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.imagePullPolicyPara puxar uma nova imagem somente se a imagem não estiver atualmente no nó do trabalhador, especifique IfNotPresent.resources.limitsPara 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áquinamg1c.16x128, então tem apenas 2 GPUs nessa máquina e pode especificar um máximo de2.
- Deve-se especificar a chave como
-
Aplique o arquivo YAML. Por exemplo:
kubectl apply -f nvidia-devicequery.yaml -
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 -
Descreva o pod para ver como o plug-in do dispositivo de GPU planejou o pod.
- Nos campos
LimitseRequests, 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 ... ``` - Nos campos
-
Para verificar se a tarefa usou a GPU para calcular sua carga de trabalho, é possível verificar os logs.
kubectl logs nvidia-devicequery-ppkd4Exemplo 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 = PASSNeste 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.