Kubernetes : Overview

Kubernetes é um sistema de código aberto que foi desenvolvido pelo Google para gerenciamento de aplicativos em containers através de múltiplos hosts de um cluster. Tem como principal objetivo facilitar a implantação de aplicativos baseados em microservices. Ele foi baseado na experiência do Google de muitos anos trabalho com containers, adaptando-o para se trabalhar com Docker.

Segue abaixo o site do projeto :

http://kubernetes.io/

1)Arquitetura

kubernetes-cluster-with-docker

Componentes do Kubernetes :

etcd – Alta disponibilidade de chaves guardadas para compartilhar configuração compartilhada e descoberta de serviços.
flannel – Usa o etcd para distribuir conectividade entre os containers.
kube-apiserver – API para os Kubernetes.
kube-controller-manager – Responsável pelos serviços Kubernetes ativos.
kube-scheduler – Agenda tarefas nos containers.
kubelet – Agentes que rodam nos hosts do cluster.
kube-proxy – Mantém regras de rede que permitem a comunicação com seus Pods a partir de sessões de rede dentro ou fora do cluster.

Tipos de nodes:

MASTER – Responsável por gerenciar o estado do cluster. Ele roda o Etcd, que armazena dados de cluster entre componentes que fazem o scheduling de cargas de trabalho para nodes worker ou nodes de trabalho.

WORKER – Nodes worker são os servidores onde suas cargas de trabalho (i.e. aplicações e serviços containerizados) irão executar. Um worker continuará a executar sua carga de trabalho uma vez que estejam atribuídos a ela, mesmo se o master for desativado quando o scheduling estiver concluído. A capacidade de um cluster pode ser aumentada adicionando workers.

2) Laboratório

Usaremos um laboratório com VMS CentOS7 (1 Master e 2 servidores Minions), todas VMs com 2Gbs e 2 vcpus em ambiente VMWARE.

10.0.0.30 MASTER1
10.0.0.31 WORKER1
10.0.0.32 WORKER2

3) Requisitos

Regras do firewalld para o MASTER

firewall-cmd --permanent --add-port=6443/tcp 
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp 
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp 
firewall-cmd --permanent --add-port=10255/tcp 
firewall-cmd --reload

Regras de FirewallD para o Worker.

firewall-cmd --permanent --add-port=6783/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd  --reload

Habilite o módulo mod_netfilter

https://ebtables.netfilter.org/documentation/bridge-nf.html

modprobe br_netfilter
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

Coloque o SELINUX para permissive

 setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux

Configure o repositório

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

Instale os pacotes necessários

yum install kubeadm kubelet docker -y

Inicie e habilite o serviços

systemctl enable docker
systemctl start docker
systemctl enable kubelet
systemctl start kubelet

Desabilite o swap

swapoff -a 

3) Configure o cluster no node Master

Na nossa configuração troque o IP-MASTER pelo ip do host master e em nossa configuração utilizaremos na rede do pod a rede 192.168.0.0/16 .

kubeadm init --apiserver-advertise-address="IP-MASTER" --apiserver-cert-extra-sans="IP-MASTER"  --node-name MASTER-NODENAME --pod-network-cidr=192.168.0.0/16

Guarde o comando abaixo para rodar nos servidores workers .

kubeadm join MASTERIP:6443 --token nu06lu.xrsux0ss0ixtnms5  --discovery-token-ca-cert-hash sha256:f996ea3564e6a07fdea2997a1cf8caeddafd6d4360d606dbc82314688425cd

Crie o diretório e copie configurações

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown -R $(id -u):$(id -g) $HOME/.kube/config

Execute o comando abaixo para ver o status do node

[root@master1 ~]# kubectl get nodes
...

NAME                   STATUS   ROLES    AGE     VERSION
master1.fajlinux.lab   NotReady    master   6m46s   v1.17.3

Estamos com o status NotReady porque não configuramos a rede dos Pods ainda.

Para configuração da rede dos Pods utilizaremos o Calico .

 kubectl create -f https://docs.projectcalico.org/v3.9/getting-started/kubernetes/installation/hosted/calico.yaml

Acompanhe a subida do serviço

watch  kubectl get pods --all-namespaces  

...

Every 2.0s: kubectl get pods --all-namespaces                                                                        Sun Mar  1 23:45:34 2020

NAMESPACE     NAME                                           READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-6b9d4c8765-cvr2n       1/1     Running   0          89s
kube-system   calico-node-9949s                              1/1     Running   0          89s
kube-system   coredns-6955765f44-569k5                       1/1     Running   0          6m8s
kube-system   coredns-6955765f44-gzsp6                       1/1     Running   0          6m8s
kube-system   etcd-master1.fajlinux.lab                      1/1     Running   0          6m
kube-system   kube-apiserver-master1.fajlinux.lab            1/1     Running   0          6m
kube-system   kube-controller-manager-master1.fajlinux.lab   1/1     Running   0          6m
kube-system   kube-proxy-xhxj5                               1/1     Running   0          6m9s
kube-system   kube-scheduler-master1.fajlinux.lab            1/1     Running   0          6m

Após a subia dos serviços , estará Ready o Master.

[root@master1 ~]# kubectl get nodes

...
NAME                   STATUS   ROLES    AGE     VERSION
master1.fajlinux.lab   Ready    master   6m46s   v1.17.3

4) Adicione o Worker Node no cluster

Execute o comando abaixo guardado nos passos do Master no Worker node

kubeadm join MASTERIP:6443 --token nu06lu.xrsux0ss0ixtnms5  --discovery-token-ca-cert-hash sha256:f996ea3564e6a07fdea2997a1cf8caeddafd6d4360d606dbc82314688425cd

Verifique os nodes novamente com o comando abaixo

[root@master1 ~]# kubectl get nodes
NAME                   STATUS   ROLES    AGE    VERSION
k8s-master             Ready    master   2m1s   v1.17.3
worker1.fajlinux.lab   Ready    <none>   74s    v1.17.3
worker2.fajlinux.lab   Ready    <none>   75s    v1.17.3

5) Extras : Ansible

Deixei a role criada no meu repo para execução via Ansible.

https://github.com/fabioabreureis/ansible-kubernetes-role/

Referências

https://kubernetes.io/docs/concepts/overview/components/