Cluster Kubernetes CentOS 7

Este laboratório foi montado utilizando virtualização com o QEMU, ferramenta de virtualização nativa no Fedora 30. Criei 3 VMs com o CentOS 7.

Um detalhe importante antes de prosseguir com a instalação do cluster será configurar o DNS local em todos os hosts que farão parte do cluster!

192.168.122.10          master.local          master

192.168.122.20          no1.local             no1

192.168.122.30          no2.local             no2

Não podemos esquecer do Firewall! Vamos liberar as portas que serão necessárias para o cluster no nó 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

As regras de firewall para os nós escravos serão estas!

firewall-cmd --permanent --add-port=10250/tcp

firewall-cmd --permanent --add-port=10255/tcp

firewall-cmd --permanent --add-port=8472/udp

Agora vamos para instalação e configuração!  O script está bem fácil de entender, praticamente desativamos o SELinux e swap. Instalamos o Docker, criamos o repositório do Kubernetes, instalamos o Kubernetes e criamos configurações de rede para o k8s.

sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

swapoff -a

yum install -y docker

systemctl enable docker && systemctl start docker

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

exclude=kube*

EOF

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable kubelet && systemctl start kubelet


cat <<EOF> /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

sysctl --system

Um detalhe importante é não esquecer de desativar o swap no /etc/fstab. Neste script ele desativa temporariamente, ao reiniciar o swap volta a funcionar. O Kubernetes não aceita swap e até dá pra entender o motivo. Em alguns players de Cloud as distribuições escolhidas para provisionar serviços já vem sem swap.

Na segunda parte vamos fazer alguns ajustes finais para que o nó master entre em operação. O comando abaixo serve pra iniciarmos as configurações do cluster que praticamente é feita automaticamente pelo kubeadm. Qualquer coisa que sair fora do esperado será retornado um mensagem sobre como prosseguir.

kubeadm init --apiserver-advertise-address $(hostname -i)

Repare que a saída do comando poderá demorar um pouco porque ele irá baixar algumas imagens do Docker. Pra verificar o processo de download das imagens você pode usar o comando watch -n1 docker images

Se tudo ocorrer bem deverá aparecer a mensagem Your Kubernetes control-plane has initialized successfully!

Outra informação importante na saída do comando é a chave que será utilizada nos nós escravos para serem adicionadas ao cluster.

kubeadm join 192.168.122.84:6443 --token x92kfn.j95xqjm7ky497hyz     --discovery-token-ca-cert-hash sha256:f7c293b80d941e9f5065af3fcc6f3aa4dfe576c8f32aa189267109b9e105e0b8

Se por acaso você esqueceu de anotar ou limpou o terminal você pode visualizar novamente com o comando:

kubeadm token create --print-join-command

Os próximos comandos serão necessários e também são mencionados na saída do comando acima. Em ordem, será criado uma pasta oculta, copia do arquivo admin.conf para o diretório .kube com nome config e atribuído permissões de leitura/escrita do usuário atual no arquivo config.

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

Terminado estas etapas vamos verificar se o nó master do cluster está em execução, pra isso basta rodar o comando:

kubectl get nodes

Perceba que o status do serviço esta como NotReady, pra resolver isso precisamos baixar as imagens que criarão Pods de rede para estabelecer conectividade entre os nós do cluster.

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

Este processo poderá demorar um pouco porque novamente irá baixar imagens Docker, você pode acompanhar o processo através do comando watch -n1 docker images

Efetuado o download das imagens execute o comando novamente e verifique que o status do serviço mudou para Ready.

[root@master ~]# kubectl get nodes

NAME           STATUS   ROLES    AGE   VERSION

master.local   Ready    master   24h   v1.16.0

no1.local      Ready    <none>   8h    v1.16.1

no2.local      Ready    <none>   8h    v1.16.1

[root@master ~]#