Entendendo os nós no k8s
Published: 2021-10-12 18:53:59


![Kubernetes](https://higordiego.com.br/posts/img/k8s/no.png)

## Introdução

O kubernetes gerência sua carga de trabalho alocando os containers em **pods** com o intuito de executa-lós em nós. Um nó pode ser uma maquina física ou virtual
dependendo da configuração do seu cluster. Cada nó contém o seu [control plane](https://higordiego.com.br/posts/k8s-introduction/#control-panel) contendo os recursos necessários para executarem os seus **pods**. A maquina do tipo master é responsável por controlar os nós.

Os componentes inclusos no nó são os [kubelet](https://higordiego.com.br/posts/k8s-introduction/#kubelet), [container runtime](https://higordiego.com.br/posts/k8s-introduction/#container-runtime) e [kube-proxy](https://higordiego.com.br/posts/k8s-introduction/#kube-proxy).



## Gestão de nós

Existe duas formas para ter um nó adicionado ao [Kube-apiserver](https://higordiego.com.br/posts/k8s-introduction/#kube-apiserver).

* O [kubelet](https://higordiego.com.br/posts/k8s-introduction/#kubelet) se registrando no [control plane](https://higordiego.com.br/posts/k8s-introduction/#control-panel).
* De forma manual, criando o seu registro com base na configuração de objeto do tipo nó.


No ato da criação do objeto do tipo nó, o [control plane](https://higordiego.com.br/posts/k8s-introduction/#control-panel) é responsável por validar, caso esteja correto, o mesmo cria. Segue abaixo um exemplo do [json](https://pt.stackoverflow.com/questions/4042/o-que-%C3%A9-json-para-que-serve-e-como-funciona) para criação.

```json
{
    "kind": "Node",
    "apiVersion": "v1",
    "metadata": {
    "name": "10.20.10.125",
    "labels": {
      "name": "criando_nó_k8s"
    }
  }
}
```

Após o registar o nó no kubernetes, o kubelet valida se foi criado com o seu `metada.data` correspondente. Caso o nó esteja disponível, o mesmo está apto para receber criações de **pods**, caso contrário o mesmo será ignorado até que esteja pronto
para o recebimento da nova carga.

Quando o nó criado estiver indisponível, sempre será verificado a forma de [loop](https://pt.wikipedia.org/wiki/Loop_(programa%C3%A7%C3%A3o)) para identificação de um novo status.
Caso queira que não siga a rotina padrão, o mesmo terá que ser excluído de forma manual.


### Nó e as suas exclusividades

Cada nó possui o seu nome de identificação, e se houver repetição do mesmo, pode haver duplicação da configuração, e com isso, acabar gerando dificuldade para atualização de dados para o nó, tornando necessário a exclusão de um dos nós em duplicidade, para poder criar um nó com as suas modificações.

Para registrar o nó no kubelet existem alguns comandos, segue abaixo:

* `--kubeconfig` essa flag realiza autenticação de dados na [Kube-apiserver](https://higordiego.com.br/posts/k8s-introduction/#kube-apiserver).
* `--cloud-provider` essa flag realiza a leitura de dados do seu [cloud-controller-manager](http://localhost:1313/posts/k8s-introduction/#cloud-controller-manager).
* `--register-node` essa flag realiza o autorregistro em [Kube-apiserver](https://higordiego.com.br/posts/k8s-introduction/#kube-apiserver).
* `--node-up` essa flag informa o endereço físico o famoso [ip](https://canaltech.com.br/software/o-que-e-ip/) do nó.
* `--node-status-update-frequency` essa flag informa para o [kubelet](https://higordiego.com.br/posts/k8s-introduction/#kubelet) com qual frequência será verificado a saúde do ambiente do nó.


Para criação dos nós, o administrador tem o livre acesso para manusear(manualmente) usando a ferramenta kubectl.

### *O que é kubectl ?*

Kubectl é uma ferramenta em linha de comando com propósito de gerir cluster em kubernetes. Para poder acessar o cluster, necessitar-se de um arquivo de acesso que se localiza no caminho `$HOME/.kube`.
Caso esse arquivo esteja em outro local, utilize o comando a seguir:

```shell
kubectl --kubeconfig "caminho do arquivo"
```

Podemos instalar a ferramentas nas plataformas [GNU/Linux](https://www.gnu.org/gnu/linux-and-gnu.pt-br.html), [MacOS](https://www.apple.com/br/macos) e [Windows](https://www.microsoft.com/pt-br/windows), para instalação dos seus respetivos S.O.

Para a instalação no [GNU/Linux](https://www.gnu.org/gnu/linux-and-gnu.pt-br.html) segue os comandos abaixo:

```shell
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
```


```shell
chmod +x ./kubectl
```

```shell
sudo mv ./kubectl /usr/local/bin/kubectl
```

```shell
kubectl version --client
```

Para a instalação no [MacOS](https://www.apple.com/br/macos) segue os comandos abaixo:

```shell
sudo brew install kubectl
```

```shell
kubectl version --client
```

Para a instalação no [Windows](https://www.microsoft.com/pt-br/windows) [clique aqui](https://dl.k8s.io/release/v1.22.0/bin/windows/amd64/kubectl.exe).

Para saber mais sobre a instalação temos a documentação oficial [clique aqui](https://kubernetes.io/docs/tasks/tools/).

Com o kubectl podemos modificar os objetos do nó, criando um nó de forma manual usando a flag `--register-node=false`. Cada nó tem o seu status que contém algumas informações, que são:

* **Address**: O uso desse campo muda conforme o seu provedor de nuvem ou configuração manual;
  * **Hostname**: esse campo é para sinalizar o nome do nó, podendo mudar o nome usando a seguinte flag `--hostname-override;
  * **ExternalIP**: esse campo é para sinalizar o IP externo do seu cluster;
  * **InternalIP**: esse campo é para sinalizar o IP interno do seu cluster;
* **Conditions**: esse campo é responsável por sinalizar a condição do status dos nós em execução;
  * **Ready**: esse campo sinaliza se o nó está integro ou não com o valor (`True` ou `False`);
  * **DiskPressure**: esse campo sinaliza se contém espaço no disco rígido com o valor (`True` ou `False`);
  * **MemoryPressure**: esse campo sinaliza se contém espaço em memória com o valor (`True` ou `False`);
  * **PIDPressure**: esse campo sinaliza se contém muitos processos no nó com o valor (`True` ou `False`);
  * **NetworkUnavailable**: esse campo sinaliza se a rede do nó está configurado com o valor (`True` ou `False`);
* **Capacity and Allocatable**: esse campo determinar a quantidade de recursos que estão disponíveis no nó, como CPU, memória e a quantidade de pods que cabem no nó;
* **Info**: esse campo determina as informações sobre os nós, por exemplo: versão de kernel, tempo de execução do containers e dados sobre o sistema operacional do nó.


## Heartbeats

Esse recurso é responsável por validar a disponibilidade dos nós, com intuito de identificar falha computacional, e agir quando ocorrerem. Existindo assim, duas formas para o heartbeats, que são:

* Atualizações com o status de um nó;
* Com *Lease* no seu namespace no kube-node-lease e cada nó possui o seu objeto.


O kubelet é responsável por atualizar e criar o `.status` dos nós quando houverem mudanças.

O intervalo para atualização do `.status` do nó por padrão é de 5 minutos, já os nós inacessíveis são apenas 40 segundos.


Então é isso galera, espero que tenham gostado e até a próxima!

### Referências
https://kubernetes.io/docs/concepts/architecture/nodes/#node-controller
https://kubernetes.io/docs/reference/kubernetes-api/cluster-resources/lease-v1/
https://livro.descomplicandokubernetes.com.br/pt/day_one/descomplicando_kubernetes.html