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 ~]#