DEV Community

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

Posted on • Edited on

1

⛴️[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.

Image of Datadog

How to Diagram Your Cloud Architecture

Cloud architecture diagrams provide critical visibility into the resources in your environment and how they’re connected. In our latest eBook, AWS Solution Architects Jason Mimick and James Wenzel walk through best practices on how to build effective and professional diagrams.

Download the Free eBook

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more