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
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
1.3 Criando cluster local
Para criar um cluster local, usamos o comando a seguir:
k3d cluster create --config k3d-config.yml
Se tudo correr como esperado, no final do comando é exibida a mensagem que o cluster foi 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
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
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>
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
Para compreender melhor o conceito de labels e selectors, a documentação do kubernetes pode ser consultada.
Top comments (0)