Como manipular DaemonSets no Kubernetes
- Rodrigo Saito
- há 26 minutos
- 7 min de leitura
Fala pessoal, tudo bem?
Voce sabe o que são DaemonSets? São recursos especiais do K8s. São Daemons que serão colocamos em nodes do nosso cluster. Os daemosSets podem ser colocados a cada node, que podem cuidar de diversos aspéctos, podendo ser por questões de segurança, para questões de processamentos para aquele node.
DaemonSets são componentes complexos, ma que podemos usar relativamente de forma simples com o K8s.
O conceito de um Deamon em geral, são programas que ficam executando em segundo plano em um sistema operacional multitarefa.
Os Daemons não estão sob o controle direto do usuário. No k8s, podemos criar Kubernete Daemons, com o recurso chamado DaemonSets.
É muito importante saber é que os recursos DaemonSets do Kubernetes estão fortemente ligados ao Node, ao que ocorre à aquele Node específico onde os Pods criados pelo Deamon foram atribuídos.
Esses Pods podem ou não estarem relacionados também com uma de suas aplicações, pois eles podem desempenhar um papel similar a um processo de sistema executando em um Node. Assim, pode ou não estar relacionado à sua aplicação, ou seja, pode estar associado apenas ao Node, ou ao que ocorre no Node, e não ao o que ocorre com as suas aplicações.
DaemonSets faz replicas similares a que foram vistos na seção ReplicaSet, por recursos do tipo Deployment.
O objetivo do DaemonSet é garantir que cada nó no nosso cluster receba um Pod atribuído por ele, o que não é garantido, por exemplo, quando utilizamos recursos como Deployment ou replicasets que vimos anteiormente.
DaemonSets são usados para coletar Logs, fazer monitoramento, para detecção de invasões nos Nodes, ou outras necessidades específicas que a sua aplicação possa precisar, ou seja, sevem para atribuições que precisam realmente executar em cada node do cluster.
Escalonador de DaemonSets
Normalmente, um node em que um Pod é executado é selecionado por um componente chamado Kubernetes Scheduller, como ocorrer com outros recursos comuns, como o Replocaset ou Deployment já vistos.
Mas, os Pods DaemonSets s]ao craidos e agendados por um componente diferente do K8s, chamado DaemonSet Conttroller.
O DaemonSet replica um Pod em cada node. O padrão é criar 1 Pod em cada Node do nosso cluster. Importante saber se cada novo Node for adicionado no cluster, o DaemonSet irá criar automaticamente 1 pode para este Node, reforçando o DeamonSet um recurso ligado fortemente ao Node.
DaemonSet Conttroller garante que todos os Nodes do cluster receberão 1 cópia do Pod, mesmo aqueles que acabarem de ser criados.
Criação de DaemonSets e adição nos Work Nodes
Para fazer a criação de DaemonSets, a estrutura é bem parecida com a da Replicaset.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset
labels:
app: frontend
spec:
template:
metadata:
name: my-pod-webserver
labels:
apps: my-app
tier: frontend
spec:
containers:
- name: my-container-nginx
image: nginx
selector:
matchLabels:
apps: my-app
Vamos verificar a estrutura de nodes do nosso cluster:
kubectl get nodesEstamos utilizando a configuração default. Além de estar sendo utilizado como control-plane, ele é um worker node comum. Por isso que conseguimos criar nesse node todos os objetos necessários para testes no K8s.

Para que possamos testar os DaemonSets, teremos que fazer uma configuração diferente para observar esse comportamento dos recursos DaemonSets. O minikube dá opções de adiconar mais nodes em nosso cluster. Para isso, execute o comando:
minikube node addÉ um processo que pode demorar um pouco, pois estamos adicionando mais um nó em nosso cluster. É como se fosse parecido com o processo de dar o start no minikube

Quando ele acabar de concluir, deve aparecer a seguinte mensagem:

Veja mais uma vez os nós do minikube:
kubectl get nodes
Vamos aplicar o nosso arquivo my-daemonsett.yaml (veja se voce está na pasta dos arquivos de de configuração yaml)
kubectl apply -f my-daemonset.yaml
Vamos ver informações sobre o Daemonset:
kubectl get ds
Agora vamos ver os pods:
kubectl get pods
Podemos observar que na coluna READY, dentro de cada Pod temos um container
Mas onde estão esses Pods? Queremos confirmar se cada Pod estão um em cada node. Para isso, execute o comando:
kubectl get pods -o wide --field-selector spec.nodeName=minikube
Vimos aqui que temos um Pod para o nomeName minikube, que contém 1 daemonset.
Vamos executar o mesmo comando, porém direcionando para o outro node:
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m02
Também temos um daemonset executando nesse pod.
Vamos adicionar mais um novo Node:
minikube node add
Vamos verificar os DS
kubectl get ds
Vamos verificar a criação do novo Pod
kubectl get pods
O Daemonset verificou que teve um novo Node foi adicionado e criado ao cluster e adicionou um pod para este Node. (Chamado de daemonsetPord)
Vamos verificar quais são os nodes
kubectl get nodes
Vamos verificar se tem um daemonset para este node:
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m03
Vamos deletar os objetos criados. Veja quais são os pods e depois faça a deleção:
kubectl get pods
Veja que os nomes dos seus pods vai estar provavelmente diferentes. Para deletar um Pod, execute o comando:
kubectl delete pod daemonset-tnf4z && kubectl get pods
Perceba que ele deletou o pod com o final tnf4z e já criou um novo com o final pzqhk. Confira se o pode foi criado por inteiro:
kubectl get pods
Veja que agora todos estão running.
É criado novamente por que está sob os cuidados do Daemonset. Rapidamentte ele vai criar um novo node.
Vamos deletar agora um Daemonset. Execute o comando para mostrar os objetos Daemonsets
kubectl get ds 
Execute o comando para deletar:
kubectl delete ds daemonset
Vamos checar os Pods novamente:
kubectl get pods
Vimos que sem o Daemonset, ele finaliza todos os Pods.
Troubleshooting minikube de Multi-nodes
Fazer a criação de nodes e os daemonsets conseguirem estarem acoplados auttomaticamente não é um serviço fácil internamente. Por isso, em alguns casos raros podem apresentar bug.
Para resolver rápido, faça a deleção do cluster.
minikube delete
Agora,inicie o minikube, com um complementto de comando, para criar os 3 nodes:
minikube start --nodes mando irá demorar um pouco para ser concluído:
Todos os objetos que foram criados dentros dos nodes foram perdidos. Será necessário fazer a recriação novamentte dos objetos.
DaemonSets Orphan Pods
Por padrão, se os DaemonSets forem deletados, os Pods também serão deletados. Mas é possível alterar o padrão. Na criação do daemonSet, podemos colocar os parametros:
--cascade=orphan
Dessa forma, os Pods ficarão orfãos e sem o gerenciamento de nenhum Daemonset.
Para "consertar" isso, deverá ser criado um novo Daemonset, com o mesmo seletor, para que esse novo Daemonset adote os Pods Orfãos.
Vamos verificar se temos algum DaemonnSet criado:
kubectl get ds
Vamos verificar se temos algum Pod
kubectl get pods
Cascade Orphan Pods Option
Vamos analisar os DaeamonSets com Pod orfãos.
Vamos ver quais são os Daemons Sets existentes:
kubectl get ds
kubectl get pods
kubectl get nodes
Vamos aplicar o nosso arquivo my-daemonset.yaml
kubectl apply -f my-daemonset.yaml
E vamos ver agora os DaemonSets:
kubectl get ds
Vamos verificar os pods que ele subiu
kubectl get pods
Vamos observar se cada DaemonSet foi startado em cada node.
kubectl get pods -o wide --field-selector spec.nodeName=minikube
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m02
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m03
Depois verifique os nodes:
kubectl get nodes
Vamos propositalmente deixar os Pods orfãos.
kubectl delete ds daemonset --cascade=orphan
Vamos verificar se agora os DS estão Orfãos.
kubectl get ds
E o que aconteceram com os nossos pods?
kubectl get podsVeja que os Pods não foram mais deletados com o padrão, porque agora os Pods não estão mais sob os cuidados de um DaemonSet

Vamos verificar novamente se eles estão dentro de um Worker Node:
kubectl get nodes
E vamos ter que verificar em cada um dos nodes:
kubectl get pods -o wide --field-selector spec.nodeName=minikube
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m02
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m03Podemos observar que cada Pod tem oo seu daemonset.

Vamoos fazer a deleçãoo doo último Pod e vamos ver o que acontece, agora que ele está orfão. (verificar o seu nome do daemonset corretamente para voce testar)
kubectl delete pod/daemonset-7hmsqVeja que agora ele consegue deletar o pod:

Vamos verificar novamente com o comando para ver os Pods que estavam no Minikube-m03:
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m03Podemos verificar que não tem nada, que não está sob os cuidados de um DaemonSet e perceba que ele não foi mais recriado (por conta de não estar sob os cuidados doo DaemonSet)

Adoção de DaemonSet Pods (adoção de Pods Orfãos)
Vamos começar a fazer algumas analises dos DaemonSets:
kubectl get ds
Vamos veriificar quais pode temos agora:
kubectl get podsObserve agora que temos somente 2, pois deletamos 1 anteriiormente.

Vamos ver agora os nodes:
kubectl get nodes
Vamos abriir novamente o arquiivo my-daemonset.yaml
O que é preciso para fazer a adoção de Pods orfãos? é a sção selector.
Se eu tiver o mesmo Select, o meu Daemonset vai adotar os Pods orfãos.

Como não estamos alterando nada nas seções do arquiivo, e vamos aplicar o mesmo arquivo, os Pods serão adotados

Vamos aplicar o nosso arquivo:
kubectl apply -f my-daemonset.yaml
Vamos verificar se realmente teve a adoção dos Pods Orfãos.
kubectl get dsObserve que em READY, temos oos 3 Pods adotados.

Consulte os Pods e veja que temos 3 Pods:
kubectl get pods
Liste oos nodes novamente:
kubectl get nodes
Vamos veriificar se cada Node tem o seu Pod:
kubectl get pods -o wide --field-selector spec.nodeName=minikube
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m02
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m03Todos oos Poods tem um node adotado:

Vamos testar se ele realmente foi adotado, fazendo a deleção do daemonset
Liste novamente o se Deamonset:
kubectl get ds
Vamos deletar o daemonset:
kubectl delete ds daemonset
Veja os seus Pods
kubectl get pods
Vamos verificar novamente cada um dos Nodes:
kubectl get pods -o wide --field-selector spec.nodeName=minikube
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m02
kubectl get pods -o wide --field-selector spec.nodeName=minikube-m03
Isso prova que os Pods realmente foram adotados pelo DaemonSet. Na hora que deletamos o DaemonSet, os Pods também foram embora.
Gostou de aprender tudo isso sobre os DaemonSets? Comentem
obrigado e até +!
[131]


Comentários