DEV Community

Cover image for ⛴️[pt-BR] Ray no k8s - Criando cluster com k3d
Jessica Cardoso
Jessica Cardoso

Posted on • Updated on

⛴️[pt-BR] Ray no k8s - Criando cluster com k3d

Foto de Growtika na Unsplash

Motivação

Recentemente, estive buscando meios de executar aplicações do python paralelamente. Eu costumava usar a biblioteca multiprocessing para paralelizar minhas aplicações. Entretanto, o multiprocessing é focado em paralelizar processos na máquina local e eu precisava executar no kubernetes, após algumas buscas encontrei o Ray.

Assim, nesse tutorial, apresento alguns dos passos que segui para configurar o Ray em um cluster local do kubernetes. A primeira parte é focada na configuração do cluster com o k3d e a segunda em usar esse cluster via Ray.

1. Preparando ambiente

Para começar, precisamos ter as seguintes ferramentas instaladas:

1.1 Configuração base

O sistema operacional usado foi o Ubuntu 22.04 com um ambiente virtual python na versão 3.10. Já a versão do kubectl usada foi a v1.27.3.

docker --version
# Docker version 24.0.3, build 3713ee1

helm version --short
# v3.12.1+gf32a527

kubectl version --client --output=yaml
# clientVersion:
#   buildDate: "2023-06-14T09:53:42Z"
#   compiler: gc
#   gitCommit: 25b4e43193bcda6c7328a6d147b1fb73a33f1598
#   gitTreeState: clean
#   gitVersion: v1.27.3
#   goVersion: go1.20.5
#   major: "1"
#   minor: "27"
#   platform: linux/amd64
# kustomizeVersion: v5.0.1

k3d --version
# k3d version v5.5.1
# k3s version v1.26.4-k3s1 (default)

python --version
# Python 3.10.12

ray --version
# ray, version 2.6.1
Enter fullscreen mode Exit fullscreen mode

1.2 Criando cluster local do kubernetes

Nós definimos um arquivo de configuração para subir o cluster com o k3d. Segundo a documentação, os atributos apiVersion e kind são os únicos obrigatórios, ambos se referem as características do arquivo de configuração em si.

apiVersion: k3d.io/v1alpha5 # versão mais recente no momento
kind: Simple 
metadata:
    name: mycluster # nome do nosso cluster (k3d-mycluster)
servers: 1  # quantidade de servidores
agents: 2  # quantidade de nós que serão criados
image: rancher/k3s:v1.26.4-k3s1 # versão do k3s a ser usada
ports: # mapear as portas dos nós do container para o host (https://k3d.io/v5.5.1/usage/exposing_services/)
  - port: 8265:80
    nodeFilters: 
      - loadbalancer
options:
  k3s:
    nodeLabels: # adiciona rótulos aos nós do cluster
      - label: type=node1
        nodeFilters:
          - agent:0
      - label: type=node2
        nodeFilters:
          - agent:1
Enter fullscreen mode Exit fullscreen mode

1.3 Criando cluster local

Para criar um cluster local, usamos o comando a seguir:

k3d cluster create --config k3d-config.yml
Enter fullscreen mode Exit fullscreen mode

Se tudo correr como esperado, no final do comando é exibida a mensagem que o cluster foi criado com sucesso:

exibição da mensagem de cluster criado com sucesso

Rotulamos os nós para facilitar no gerenciamento desses nós, por exemplo, podemos buscar um nó específico com o comando abaixo:

# label de interesse (type=node1)
kubectl get nodes --selector type=node1 
# NAME                    STATUS   ROLES    AGE   VERSION
# k3d-mycluster-agent-0   Ready    <none>   21m   v1.26.4+k3s1
Enter fullscreen mode Exit fullscreen mode

1.3.1 Labels e selectors

Os rótulos atribuídos em cada nó podem ser usados para definir qual nó um recurso do kubernetes usará, nessa subseção fazemos isso em um pod.

Especificamos no campo nodeSelector o rótulo do nó de interesse a ser vinculad ao pod. No arquivo yaml abaixo, definimos o rótulo do nó k3d-mycluster-agent-1. Para subir a aplicação usamos o comando kubectl apply -f pod.yaml.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  nodeSelector: 
    type: node2 # atribuir esse pod ao nó de interesse
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
Enter fullscreen mode Exit fullscreen mode

Em seguida, podemos verificar que o recurso foi atribuído ao nó designado ao consultar o campo NODE da mensagem:

kubectl get pods --output=wide
# NAME    READY   STATUS    RESTARTS   AGE   IP          NODE                    NOMINATED NODE   READINESS GATES
# nginx   1/1     Running   0          18s   10.42.0.5   k3d-mycluster-agent-1   <none>           <none>
Enter fullscreen mode Exit fullscreen mode

Como essa aplicação do nginx foi criada apenas para mostrar o uso de labels, podemos removê-la do nosso cluster com o seguinte comando.

kubectl delete -f pod.yaml
Enter fullscreen mode Exit fullscreen mode

Para compreender melhor o conceito de labels e selectors, a documentação do kubernetes pode ser consultada.

Top comments (0)