Static Pods
Antes de começar vamos entender que o Kubelet roda pods em qualquer node, seja do tipo master ou worker.
Algumas instalações de Kubernetes não possuem o Kubelet nos masters pois rodam os componentes kube-apiserver, kube-controller, etcd e kube-scheduler através de services no sistema operacional. Porém algumas instalações rodam os componente do cluster como pods dentro do próprio master, logo precisam do Kubelet em funcionamento.
O Kubelet somente entende manifestos para rodar pods e mais nada. Todos os outros objetos do Kubernetes que foram deployments, replicaset, services, etc não são entendidos pelo Kubelet.
Em uma configuração normal de um cluster k8s o Kubelet aguarda instruções do kube-apiserver de quais pods devem ser carregados no node, mas a decisão foi tomada pelo kube-scheduler e os dados guardados no etcd.
O que aconteceria se tivéssemos o seguinte cenário?
Ai vem a questão, como rodar um pod se não tem api-server, se não tem etc, se nao tem nada?
Como poderíamos prover as configurações de um pod para o Kubelet sem o kube-apiserver?
Podemos injetar os pods com os arquivos yaml de definição dos pods em uma pasta que o Kubelet esteja configurado para ler periodicamente. Qualquer alteração nessa pasta o Kubelet recriará os pods para executar as mudanças e se os arquivos forem removidos o pod será deletado automaticamente. Obviamente precisamos de um container runtime que o Kubelet possa executar. Esses pods que não possuem intervenção do kube-apiserver são os chamados static pods
.
Poderia ser qualquer diretório do sistema desde que o Kubelet esteja configurado para ler este diretório.
Você pode rodar um pod na sua própria máquina se instalar o Kubelet. Ele cuidará do processo de manter este pod funcionando na sua máquina local, mas não teremos replicaset, deployments, ou seja, cada pod como um container qualquer.
Voce poderá ver o pod rodando um
docker ps
ounerdctl
psou
crictl ps` por exemplo dentro do cluster, mas não um kubectl get pods, pois lembre-se o kubectl funciona com o kube-apiserver.
O Kubelet possui duas maneiras de executar pods:
- por arquivo, como mostramos.
- por um endpoint que é usado pelo kube-apiserver para fazer um input.
Se estamos criando um pod estático colocando o arquivo manualmente em um node, podemos ver através do comando kubectl get pods? Sim podemos, pois o Kubelet cria um objeto espelho no kube-apiserver, mas não é editável ou manipulável através do kubectl, ou seja, não pode ser deletado, mas pode ser visualizado.
Como falado anteriormente os static pods são muito usados para os próprios serviços do Kubernetes e é assim que o kubeadm cria os componentes do cluster.
O kube-scheduler não possui nenhum efeito sobre static pods.
Porém um dos requisitos do Kubernetes é ter o swap desligado.
sudo apt-get install kubelet -y
sudo swapoff -a
sudo systemctl enable kubelet --now
❯ sudo systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; preset: enabled)
Active: active (running) since Thu 2023-12-28 15:41:50 -03; 1s ago
Docs: https://kubernetes.io/docs/home/
Main PID: 64784 (kubelet)
Tasks: 21 (limit: 18778)
Memory: 26.0M
CPU: 173ms
CGroup: /system.slice/kubelet.service
└─64784 /usr/bin/kubelet
## Se algum problema acontecer faca um checkup
journalctl -xeu kubelet
As instalações do kubelet criam o serviço no sistema que é o kubelet.service então vamos procurar onde esta.
sudo find / -type f -name kubelet.service 2>/dev/null
/usr/lib/systemd/system/kubelet.service
/var/lib/systemd/deb-systemd-helper-enabled/multi-user.target.wants/kubelet.service
cat /etc/systemd/system/multi-user.target.wants/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/home/
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
Esse kubelet falta algumas configurações ainda, pois ele não sabe onde tem manifestos de pods, não sabe quem é o container runtime, não sabe nada. então vamos ajustar.
Edite o arquivo para isso se estiver com o docker instalado na sua máquina.
observe que passei o container runtime, o endpoint e o path onde terão pods.
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/home/
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/kubelet \
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
--pod-manifest-path=/etc/kubernetes/manifests \
--v=2
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
### Reinicie o serviço e veja se ele pegou as configurações
sudo systemctl daemon-reload
sudo systemctl restart kubelet.service
sudo systemctl status kubelet.service
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; preset: enabled)
Active: active (running) since Thu 2023-12-28 16:43:37 -03; 55s ago
Docs: https://kubernetes.io/docs/home/
Main PID: 186026 (kubelet)
Tasks: 28 (limit: 18778)
Memory: 28.4M
CPU: 791ms
CGroup: /system.slice/kubelet.service