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 :
1)Arquitetura
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/