Você está na página 1de 13

 

INTRODUÇÃO AO KUBERNETES 
SEGUNDO SEMESTRE DE 2020 
Residência TI-JFRN 
PROFESSOR: ANDRÉ SOLINO 
andresolino@imd.ufrn.br 
ALUNA: ANA AMARANTE 
anapma22@gmail..com 
 

04 de março de 2020 

Este  documento  foi  desenvolvido  durante a disciplina DevOps na Residência em tecnologia 


da  informação  aplicada  à  área  jurídica - turma JF/IMD, na área de especialidade de Redes e 
Infraestrutura, ministrado pelo Prof Me. André Solino.   

O  objetivo  deste  é  promover  o  entendimento  dos  conceitos  referentes  ao  Kubernetes  e 


consequentemente  de  sua  estrutura  e  seu  funcionamento.  Serão  abordados  os  seguintes 
tópicos listados abaixo. 

● Introdução 
● Breve história 
● O que o Kubernetes faz? 
● Componentes do Control Plane 
● Componentes do Node 

   

 

 

 
 

Histórico de versões 

Versão  Alteração  Autor  Data 

1.0  Criação inicial do  Ana Paula  03/03/2020 


documento 

2.0  Inserção de  Ana Paula  06/03/2020 


Conceitos 
importantes  

Introdução 

 
Figura 1 - Logotipo do kubernetes 

Primeiramente,  na  figura  1,  podemos  vê  à  logotipo  do  kubernetes  (conhecido  também 
como  K8s),  que  sugere  um  leme  de  um  navio.  Mas  sabemos  que  um  navio  pode  levar 
coisas  mais  variadas  possíveis,  porém  em  larga  escala,  seja  lá  o  que  for  carregado  dentro 
de  um  navio,  está  armazenado  dentro  de  um  container.  Outra  dica  é  que  ​a  palavra 
Kubernetes vem da palavra grega Kuvernetes, que representa a pessoa que pilota o 
navio.  

Com  a  inferência  correta,  já  sabemos  que  o  Kubernetes  é  responsável  por  fazer  a 
orquestração  e  gerenciamento  de  containers!  É  um  sistema  de  orquestração  open-source 
que  automatiza  a  implantação,  o  dimensionamento  e  a  gestão  de  aplicações  em 
containers. 

 

 

 
 

O  Kubernetes  faz  o  gerenciamento  do  cluster,  que  é  composto  por  vários  containers.  O 
Docker  é  a  tecnologia  mais  utilizada  para  provisionar  os  containers O próprio Docker tem 
seu orquestrador, o Docker Swarm, porém ele não é tão maduro quanto o Kubernetes. 

Breve história 

O  K8s  (​trocadilho  com  o  nome  Kubernetes:  k  +  8  caracteres  +  s)  é i​nscrito em GO, foi 


desenvolvido  pela  Google,  para gerência dos serviços da G Suite. Em 2015 o Kubernetes foi 
doado  para  a  “Cloud  Native  Computing  foundation”  e  Linux  Foundations,  e  se  tornou  um 
projeto  Open  Source,  hoje  é  mantido  pela  comunidade.  Isso  é  mais  um  incentivo  a  sua 
popularidade  e  grande  utilização,  visto  que  por  já  ser  da  comunidade,  não  fica  restrito  a 
nenhuma alteração drástica partindo da empresa que detivesse essa ferramenta. 

O que o Kubernetes faz? 

● Descoberta de serviços e balanceamento de carga. 


○ Pode expor um contêiner usando o nome DNS ou usando seu próprio 
endereço IP.  
○ Se o tráfego para um container for alto, o Kubernetes poderá equilibrar a 
carga e distribuir o tráfego. 
● Orquestração de armazenamento. 
○ Permite que você monte automaticamente um sistema de armazenamento 
de sua escolha. 
● Lançamentos e reversões automatizados 
○ Pode automatizar a criação de novos containers, remover os existentes e 
subir todos os seus recursos para os novos containers. 
● Self-healing 
○ Pode reiniciar containers que caíram ou matar containers que não estão 
aptos para uso, além de anunciar os containers para clientes, apenas depois 
que eles estão prontos para uso. 

 

 

 
 

Estrutura do Kubernetes 
● Pods: Menor unidade do K8s, pode conter um container e uma unidade de 
armazenamento, em alguns casos ainda contém mais de um container e a unidade 
de armazenamento, mas esse caso é raro. Todo pod tem um IP e id únicos.  
Pods são voláteis. 
○ Pending: Estado inicial do pod. 
○ Running: Em execução. 
○ Success: Pod concluiu a tarefa e morreu. 
○ Unknown: Estado não reconhecido, o linux retornou qualquer coisa diferente 
de 0. 
● Cluster 
○ Master: Execute o Control Plane. 
○ Worker: Geralmente executa os containers, os pods 
● Node: Servidor que roda o K8s. Menor unidade de hardware de computação no 
Kubernetes.  
● kubeadm: Automatiza parte do processo de criação do cluster. 
● kubelet: Faz a interface com o docker, atua como agente em cada node. Lida com a 
execução dos pods. Sempre conversa com o kube-apiserver. 
● kubectl: Interface de linha de comando do K8s. 
● Control Plane 
○ etcd: Armazena o estado do cluster, se um pod ta ativo, se ele falhou… 
○ kube-apiserver: API que provê os serviços do kubernetes, é baseado em 
REST. Concentra as requisições. 
○ kube-controller-manager: Conjunto de outros controladores 
É papel do controller monitorar e tomar decisões com base em quem ele 
controla. 

○ kube-scheduler: Quando um pod está no estado pending, quem decide para 


onde o pod irá será este componente. É possível interferir nesta política, por 
exemplo indicando a máquina para onde os pods devem ir 
preferencialmente. 
○ kube-proxy: Quando se cria pods, ele pode ir pra qualquer máquina e um 
pod precisa se comunicar com o outro, ou seja, é necessário a comunicação 

 

 

 
 

entre os nodes. O kube-proxy é responsável por lidar com as regras de 


firewall. 
● Remote container Image registry: Geralmente o K8s usa o docker hub e uma 
imagem local. 
● Rede 
○ Plugins que permitem criar redes virtuais ou rede de overlay. Eles criam 
túneis entre os nodes. Esses túneis são criptografados. 
○ Tipos: Flannel ou Weave. Um pod que está no node A consegue se comunicar 
com um pode no node B. 

Quando  se  implanta  o  Kubernetes,  que  é  o  ​deploy​,  você  passar  a  ter  um  ​cluster​.  Que  é 
composto  pelos  ​nodes​:  ​masters  e  os  workes​.  Os  masters  são  responsáveis  por 
controlar  os  nodes  do  Kubernetes  e  os  nodes  fazem  as  tarefas  dentro  dos 
containers.  Cada  cluster  tem  pelo  menos  ​um  node  de  trabalho.  Dentro  dos  nodes  de 
trabalho  ficam  os  ​pods​,  que  são  os  menores  componentes  do  aplicativo,  que  podem  ser 
criadas e gerenciadas no Kubernetes. 

Dentro  dos  pods,  temos  os  ​services​,  que  são  um  conjunto  de  pods  como  um  serviço  de 
rede. 

O  acesso  aos  clusters,  é  feito  por  meio  do  ​ingress​,  que  é  uma  coleção  de  regras  de 
roteamento  que  governam  como usuários externos acessam serviços em execução em um 
cluster Kubernetes. 

O  Kubernetes  possui  um  software conhecido como ​control plane​, nele é decido quando e 


onde  executar  os  pods,  além  de  gerenciar  o  roteamento  do  tráfego  e  escalar  os  pods  de 
acordo com a utilização ou outras métricas definidas.  

 

 

 
 

 
Figura 2 - Estrututura do kubernetes 

Existe  ainda  o  ​kubectl​,  que  é  um  utilitário  de  linha  de  comando  que  opera  o  cluster, 
gerenciando suas interações.  

Componentes do Control Plane 

Os  componentes  do  plano  de  controle  tomam  decisões  gerais  sobre  o  cluster,  além  de 
detectar  e  responder  a  eventos  do  cluster,  como  iniciar  um  novo  pod  quando uma réplica 
de um ​deployment ​não correta. 

Um  deployment  é  uma  implantação  de  uma  aplicação dentro do Kubernetes, por exemplo 


um  deploy  do  ngnix,  vai  subir  um  ngnix.  Um  deployment  de  aplicação  no  Kubernetes 
criado  com  configuração  padrão  não  vai  ter  High  Availability  (HA)  ou  alta  disponibilidade, 
em nosso idioma.  

Um  ​rollout  ocorre  sempre  que  alguma  alteração  é  feita  no  seu deployment. Durante esse 
processo,  precisamos  manter  os  pods  em  execução. Para isso existe o conceito de ​Replica 
Set​,  que  mantém  um  conjunto  estável  de  pods  de  réplicas  em  execução  a  qualquer 
momento. Esse conceito garante a disponibilidade de um número de pods idênticos. 
 

 

 

 
 

● kube-api-server 
Fornece  API  kubernetes  usando  Jason.  Estados  de  objetos  da  API  são  armazenados  no 
etcd, e o kubectl usa o kube-api-server para se comunicar com o cluster. 
● etcd 
É  uma  base  de  dados  de  chave  valor,  que  armazena  os  dados  de  configuração  do 
cluster e o estado do cluster. 
● kube-scheduler 
Responsável  por  executar  as  tarefas  de  agendamento,  como  execução  de 
containers nos nodes com base na disponibilidade de recursos. 
● kube-controller-manager 
● cloud-controller-manager 
O ​kube-controller-manager e o cloud-controller-manager​ monitora os controladores de 
replicação e cria os pods para manter o estado desejado; 

Componentes do Node  
Os componentes do node, rodam em todos os nodes. 
● kubelet 
Agente  que  é  executado  em  cada  nó  worker,  se  conecta  ao  Docker  e  faz  a  criação, 
execução e exclusão de containers; 
● kube-proxy 
Encaminha  o  tráfego para os containers apropriados com base no endereço IP e no 
número da porta da solicitação recebida. 

Conceitos importante 
● Arquivo de manifesto/ especificação 
○ Pode ser no JSON ou YAML, mas YAML é o mais utilizado. 
○ kind: Pod, Nodes, Deployment, ReplicaSet, Service. Na literatura isso é 
chamado de recursos ou objetos. 
● Maneira de interação 

 

 

 
 

○ Imperativa: Usa-se essa maneira quando se estar aprendendo ou em 


ambiente de testes e pode-se errar. É dito ao kubectl o que fazer. 
■ Costuma ser usada em produção quando se quer logs, para debugar 
alguma coisa. 
■ Também se pode usar manifestos. 
○ Comandos: 
■ kubectl get podes 
■ kubectl get nodes 
■ kubectl get services 
■ kubectl describe pod <namepod> 
■ kubectl describe service <nameservice> 
■ kubectl delete pod <namepod> 
■ kubectl delete deployment <namedeployment> 
■ kubectl create 
■ kubectl run 
■ kubectl scale 
■ kubectl expose 
■ kubectl exec 
■ kubectl copy 
■ kubectl logs 
○ Declarativa: Escrevendo manifestos e os usando com o kubectl apply. 
■ Se diz ao K8s o que quer, ele se vira e faz. 
■ O código sempre chegará ao mesmo resultado final. 
■ Ao atualizar o manifesto, o K8s atualiza o que foi modificado no 
documento. 
○ Comandos: 
■ kubectl apply -f <arquivo.yaml>  
■ kubectl apply -f <arquivo1.yaml> -f <arquivo2.yaml> 
■ kubectl apply -f <folder> #pode ter n arq. yaml dentro desse folder 
● Replication Controller 
○ Várias maneiras que o kubernetes tem para replicar os pods. 
● Deployment:  

 

 

 
 

● Service: Tem um IP e uma porta, quando a requisição chega ele balanceia um 
conjunto de pods. É possível fazer um balanceamento manual, porém, os pods 
nascem e morrem muito rápido, então obtém IPs diferentes rapidamentes, 
inviabilizando o balanceamento manual. 
● Exportando um manifesto 
○ Salva manifesto de um pod #enche de coisas do cluster 
■ kubectl get pod <namepod> -o yaml > <namepod>.yaml 
○ Salva manifesto sem informações específicas do cluster #o export dá uma 
limpada 
■ kubectl get pod <namepod> -o yaml --export > <namepod>.yaml 
● Namespaces 
○ Tem objetivo de organizar objetos no cluster através de uma divisão lógica. 
○ Por padrão, kubectl interage com o namespace padrão (default). 
○ Para usar um namespace diferente do padrão 
■ --namespace=<nome>, ou ainda -n <nome>.  
○ Para interagir com todos os namespaces 
■ --all-namespaces para o comando. 
○ Criar namespace 
■ kubectl create namespace dev 
■ kubectl create namespace prod 
○ Listar namespaces 
■ kubectl get namespaces 
○ Remover namespace 
■ kubectl delete namespace dev 
○ Filtrar Pods por namespace <name> 
■ kubectl get pods --namespace=<name> 
○ Filtrar Pods por namespace <name> 
■ kubectl get pods -n <name> 
○ Listar Pods de todos os namespaces #Lista inclusive os pods do K8s 
■ kubectl get pods --all-namespaces 
● Label 
○ É um par chave-valor do tipo string. Todos os objetos do K8s podem 
rotulados. Pode ser usada de dois modos difrentes: 

 

 

 
 

○ Equality-based requirement 
■ environment = production 
■ tier != frontend 
○ Set-based requirement 
■ environment in (production, qa) 
■ tier notin (frontend, backend) 
○ Mostrar labels dos recursos: 
■ kubectl get pods --show-labels 
○ Deletar Pods que têm label run=myapp 
■ kubectl delete pods -l environment=production,tier=frontend 
■ kubectl get pods -l 'environment in (production),tier in (frontend)' 
○ Atribuir label 
■ kubectl label deployment nginx-deployment tier=dev 
○  

Instalação de cluster K8s no Ubuntu 


1. Instalar Docker em todos os Nodes 
2. # Adicionar chave GPG 
a. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add 

3. # Adicionar repositório do Docker 
a. sudo add-apt-repository \ 
b. "deb [arch=amd64] https://download.docker.com/linux/ubuntu 
$(lsb_release -cs) stable" 
4. # Atualizar lista de pacotes 
a. sudo apt-get update 
5. # Listar as versões do Docker que estão disponíveis no repositório  
a. sudo apt list docker-ce -a 
6. # Instalar versão específica do Docker 
a. sudo apt-get install -y docker-ce=18.06.1~ce~3-0~ubuntu 
7. # Impedir que o Docker atualize para a versão mais recente 
a. sudo apt-mark hold docker-ce 
8. # Configurar o daemon 

 
10 
 

 
 

a. cat > /etc/docker/daemon.json <<EOF 


b. { "exec-opts": ["native.cgroupdriver=systemd"], 
c. "log-driver": "json-file", 
d. "log-opts": { 
e. "max-size": "100m"}, 
f. "storage-driver": "overlay2"} 
g. EOF 
9. # Configurar o daemon 
a. mkdir -p /etc/systemd/system/docker.service.d 
10. # Reiniciar o docker. 
a. systemctl daemon-reload 
b. systemctl restart docker 
11. # Verificar a versão instalada 
a. sudo docker version 
12. Instalar K8s em todos os Nodes 
13. # Adicionar chave GPG 
a. curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo 
apt-key add - 
14. # Adicionar repositório do Kubernetes 
a. cat << EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list 
b. deb https://apt.kubernetes.io/ kubernetes-xenial main 
c. EOF 
15. # Atualizar lista de pacotes 
a. sudo apt-get update 
16. # Listar as versões do K8s que estão disponíveis no repositório  
a. sudo apt list kubelet -a 
17. # Instalar versões específicas das ferramentas 
a. sudo apt-get install -y kubelet=1.12.7-00 kubeadm=1.12.7-00 
kubectl=1.12.7-00 
18. # Impedir que atualizações das ferramentas sejam instaladas 
a. sudo apt-mark hold kubelet kubeadm kubectl 
19. # Verificar a versão instalada 
a. sudo kubeadm version 

 
11 
 

 
 

20. # Desabilitar o Swap nos nós do Kubernetes 


21. ## Desabilitar swap imediatamente 
a. sudo swapoff -a  
22. ## Atualizar fstab para que o swap permaneça desabilitado após o reboot 
a. sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 
 

Configurando o Cluster K8s 


1. Iniciar o Master Node (ao fim, salvar o comando kubeadm join) 
a. kubeadm init --apiserver-advertise-address $(hostname -i) 
2. Setar arquivo de configuração para poder interagir com o cluster 
a. sudo cp /etc/kubernetes/admin.conf $HOME/ 
b. sudo chown $(id -u):$(id -g) $HOME/admin.conf 
c. export KUBECONFIG=$HOME/admin.conf 
3. Configurar a rede do K8s com o Plugin Weave 
a. kubectl apply -n kube-system -f \ 
b. "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | 
base64 |tr -d '\n')" 
4. Listar os Nodes 
a. kubectl get nodes 
5. Listar os Pods do namespace kube-system  
a. kubectl get pod -n kube-system 
6. Adicionar os Worker Nodes ao cluster (usar o comando salvo após configurar o 
Master Node)  
a. kubeadm join 172.17.0.8:6443 --token <TOKEN> \ 
b. --discovery-token-ca-cert-hash <SHA256> 
7. Listar os Nodes continuamente 
kubectl get nodes -w 
8. Mostrar detalhes do Node com nome master 
kubectl describe node master 
9. Mostrar detalhes do Node com nome node01 
kubectl describe node node01 
10. Listar o status dos componentes 

 
12 
 

 
 

11. kubectl get componentstatuses 


12. Listar os Pods de todos os namespaces 
kubectl get pod --all-namespaces 
13. Mostrar algumas informações do cluster 
kubectl cluster-info 
14. Permitir que o node master execute Pods 
kubectl taint node <MASTER> node-role.kubernetes.io/master:NoSchedule- 
15. Outros comandos úteis 
a. kubectl logs deployment/myapp 
b. kubectl -n kube-system logs -f POD_NAME 
c. kubectl exec POD_NAME -it sh 
d. kubectl cp POD_NAME:<FILE> <LOCAL FILE> 
e. kubectl top pod POD_NAME --containers 
f. kubectl -n my-ns delete pod,svc --all  
g. kubectl edit svc/docker-registry   

Fontes:  

1. Tudo o que você precisa saber sobre Kubernetes – Parte 0. iMasters. Acessado em 
23 de fev. 2020. Disponível em: 
<​https://imasters.com.br/desenvolvimento/tudo-o-que-voce-precisa-saber-sobre-ku,
bernetes-parte-01​>.  
2. What is Kubernetes. Kubernetes. Acessado em 23 de fev. 2020. Disponível em: 
<​https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/​>. 
3. Kubernetes Components. Kubernetes. Acessado em 23 de fev. 2020. Disponível em: 
<​https://kubernetes.io/docs/concepts/overview/components/​>. 
4.  
https://medium.com/tech-grupozap/alta-disponibilidade-com-kubernetes-na-pr%C3
%A1tica-b9cf4261d2f7 
5. https://aws.amazon.com/pt/kubernetes/ 

 
13 

Você também pode gostar