Kubernetes: Criando Pools de Workers usando Labels e NodeSelector
Um pool de servidores em um cluster Kubernetes é um grupo de Workers Nodes que tem a mesma função ou característica.
Em um exemplo podemos ter um grande cluster Kubernetes para a empresa e termos pools de workers nodes para aplicações específicas, por departamentos, por tipo de carga que necessite um disco SSD ou que tem a necessidade de workers com GPU.
Para que exista essa separação precisamos definir um Label para um Worker Node, e através de um Deployment definirmos a opção NodeSelector. Assim quando o Pod for executar, ele será executado apenas no(s) worker(s) daquele pool.
Exemplo
Definindo o label para os Workers Nodes
# kubectl label node worker-node10 appDept=RH # kubectl label node worker-node11 appDept=RH # kubectl label node worker-node12 appDept=Financeiro # kubectl label node worker-node13 appDept=Financeiro
Você poderá confirmar usando o comando:
# kubectl label nodes worker-node10 --list appDept=RH disk=SSD kubernetes.io/hostname=worker-node10
Definindo o nodeSelector
Criamos o arquivo rh-deployment.yaml com o conteúdo:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: rh-deployment
namespace: default
spec:
replicas: 2
selector:
matchLabels:
run: nginx
template:
metadata:
creationTimestamp: null
labels:
run: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx2
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
nodeSelector:
appDept: RH
E executamos com o comando:
kubectl create -f rh-deployment.yaml
Faça uma cópia do arquivo rh-deployment.yaml para
cp rh-deployment.yaml financeiro-deployment.yaml
E altere somente
name: financeiro-deployment ... nodeSelector: appDept: Financeiro
E executamos com o comando:
# kubectl create -f financeiro-deployment.yaml
Conferindo o resultado
Você poderá verificar o resultado com o comando
# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE rh-deployment-12d9... 2/2 Running 0 12m 172.17.0.5 worker-node10 rh-deployment-348e... 2/2 Running 0 12m 172.17.0.6 worker-node11 financeiro-deployment-4z9f... 2/2 Running 0 13m 172.17.0.7 worker-node12 financeiro-deployment-6765... 2/2 Running 0 13m 172.17.0.8 worker-node13
Aqui temos a aplicação de RH executando apenas no works 10 e 11, enquanto a aplicação do financeiro somente no 12 e 13, respectivamente.