Pular para o conteúdo principal

Manual Scheduling

Por padrão todos os Nodes são elegíveis pelo kube-scheduler se não definirmos em spec um nodeName.

apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 8080
#nodeName: <<<<<

Se não existir um Scheduler (kube-scheduler por exemplo) para definir qual o Node escolher, o Pod ficaria em estado de Pending.

Caso não exista um Scheduler e for definido um Node específico para o Pod, este subirá no Node definido caso exista e tenha recursos suficientes.

Vamos subir o Pod com um nodeName que não existe.

kubectl get nodes  
NAME STATUS ROLES AGE VERSION
k3d-k3d-cluster-agent-1 Ready <none> 69d v1.27.4+k3s1
k3d-k3d-cluster-agent-2 Ready <none> 69d v1.27.4+k3s1
k3d-k3d-cluster-agent-0 Ready <none> 69d v1.27.4+k3s1
k3d-k3d-cluster-server-0 Ready control-plane,master 69d v1.27.4+k3s1

cat <<EOF > pod-node-name.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 8080
nodeName: node01
EOF

# Tentando subir um Pod em um Node que não existe no cluster
kubectl apply -f pod-node-name.yaml
pod/nginx created

kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 4s

Mesmo com um Scheduler existente ele não encontrou o Node selecionado, pois não temos o node01, então ele ficou em pending e depois sumiu.

Mudar o nodeName de um Pod não é permitido pelo Kubernetes, pois não é possível mover um Pod de um Node para o outro. É necessário recriá-lo, ou seja, deletar primeiro e depois criar.

Para fazer isso com kubectl apply podemos usar kubectl replace --force

# Tentativa de mudança alterando o arquivo de node01 para node02 que também não existe
cat <<EOF > pod-node-name.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 8080
nodeName: node02
EOF

kubectl apply -f ./files/pod-node-name.yaml
pod/nginx created
kubectl apply -f ./files/pod-node-name.yaml
The Pod "nginx" is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`,`spec.initContainers[*].image`,`spec.activeDeadlineSeconds`,`spec.tolerations` (only additions to existing tolerations),`spec.terminationGracePeriodSeconds` (allow it to be set to 1 if it was previously negative)
core.PodSpec{
... // 9 identical fields
ServiceAccountName: "default",
AutomountServiceAccountToken: nil,
- NodeName: "node01",
+ NodeName: "node02",
SecurityContext: &{},
ImagePullSecrets: nil,
... // 19 identical fields
}

kubectl replace --force -f ./files/pod-node-name.yaml
pod "nginx" deleted
pod/nginx replaced

# O comando watch fica monitorando, como não temos o node02 ele se encerrou e não continuou tentando subir pois é somente um Pod sem um ReplicaSet para controlá-lo
kubectl get pods -o wide --watch
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 0/1 Pending 0 12s <none> node02 <none> <none>
nginx 0/1 Failed 0 49s <none> node02 <none> <none>
nginx 0/1 Terminating 0 49s <none> node02 <none> <none>
nginx 0/1 Terminating 0 49s <none> node02 <none> <none>

Claro que se colocássemos um Node que existe tudo funcionaria de acordo.