Kubespray - Kubernetes Multi Master

Espero poder auxiliar com esse tutorial, todos aqueles que assim como eu tiveram dificuldades para implementar um cluster de K8S Multi-Master utilizando Ansible, por questão de dependências e versões específicas do orquestrador e do Docker.

[ Hits: 5.881 ]

Por: Dihogo Cassimiro Teixeira em 30/05/2019


Preparando o ambiente



Para iniciar o processo, precisamos entender que existem procedimentos que serão executados nos Masters e nos Nodes, preste atenção para as dependências e as regras de Firewalld, quais aplicar no master e quais aplicar nos nodes.

Antes de mais nada, é necessário trocar chave SSH RSA do master em que irá ser executado as playbooks do Ansible e enviar para todas as máquinas, possibilitando a comunicação sem necessidade de fixar usuário e senha no inventário do Ansible.

Exemplo:

ssh-keygen -t rsa
ssh-copy-id root@host01
ssh-copy-id root@host02
ssh-copy-id root@host03

Criando regras de Firewalld

Aplique essas regras em todos os Masters:

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 --permanent --add-port=2380/tcp
firewall-cmd --permanent --add-port=2379/tcp
modprobe br_netfilter
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
sysctl -w net.ipv4.ip_forward=1


Aplique essas regras em todos os Nodes:

firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=6783/tcp
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
sysctl -w net.ipv4.ip_forward=1


Desabilitando SElinux

Aplique em todos os hosts:

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

Instalando prerequisites packages em todos os hosts:

sudo yum install java-1.8.0-openjdk -y && yum install epel-release -y && yum install wget -y && yum install ansible -y && easy_install pip -y && pip2 install jinja2 --upgrade && yum install python36 -y

Instalando e configurando ETCD

Realize essas configurações em todos os Masters:

cd /usr/local/src
sudo wget "https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz"
tar -xvf etcd-v3.3.9-linux-amd64.tar.gz
mv etcd-v3.3.9-linux-amd64/etcd* /usr/local/bin/
mkdir -p /etc/etcd /var/lib/etcd
groupadd -f -g 1501 etcd
useradd -c "etcd user" -d /var/lib/etcd -s /bin/false -g etcd -u 1501 etcd
chown -R etcd:etcd /var/lib/etcd
ETCD_HOST_IP=$(ip addr show ens160 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
ETCD_NAME=$(hostname -s)

Utilize um editor de texto para criar o arquivo de configuração do serviço, no meu caso utilizarei o Vim:

vim /lib/systemd/system/etcd.service

Insira as informações:

Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.env
User=etcd
# set GOMAXPROCS to number of processors
#ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\""
ExecStart=/usr/local/bin/etcd
RestartSec=10s
Restart=on-failure
LimitNOFILE=65536

WantedBy=multi-user.target

Feito isso, reinicie o serviço do ETCD e verifique se o mesmo está "Active":

systemctl daemon-reload
systemctl enable etcd
systemctl start etcd.service
systemctl status -l etcd.service

Download do Kubespray

Para que fique claro, o Kubespray é um projeto que visa a automatizão da instalação de um cluster com a utilização do Ansible-playbook. Existem muitas versões do Kubespray, cada uma contém uma versão do Kubernetes e do Docker diferentes.

Todas as versões podem ser localizadas para consulta em: Releases - kubernetes-sigs/kubespray - GitHub.

A versão que iremos utilizar é a v2.7.0, pois iremos instalar uma versão de K8s que ela entrega conforme a lista de componentes:
  • Kubernetes 1.11.3
  • Etcd 3.2.18
  • Flannel 0.10.0
  • Cilium 1.2.0
  • Contiv 1.2.1
  • Weave 2.4.1
  • Calico 3.1.3
  • Docker 17.03
  • Rkt 1.21.0
  • Cri-O 1.11.5
  • KubeDNS 1.14.13
  • CoreDNS 1.2.2
  • Helm 2.9.1

O link para download pode ser encontrado em: Release v2.7.0 - kubernetes-sigs/kubespray - GitHub.

Hands-on

Escolha o Master que irá realizar o deploy do cluster e realize o download do Kubespray nele:

wget https://github.com/kubernetes-sigs/kubespray/archive/v2.7.0.tar.gz

Extraindo os arquivos:

tar -zxvf kubespray-v2.7.0.tar.gz

Realizando configurações necessárias para instalação:

cd kubespray-v2.7.0

Dependências

Edite o arquivo de requerimentos para rodar as playbooks:

vim requirements.txt

Insira as informações dentro do arquivo subistituindo todas as já existentes:

coverage==4.4.1
docutils==0.13.1
requests==2.20.0
requests-mock==1.3.0
pytest==3.1.3
pytest-cov==2.5.1
ansible>=2.4.0
jinja2>=2.9.6
netaddr
pbr>=1.6
ansible-modules-hashivault>=3.9.4
hvac

Realize a instalação das dependências com o "pip":

sudo pip install -r requirements.txt

Inventário do Ansible

Em seguida, ao finalizar, ele deve gerar o arquivo inventory/sample/hosts.ini com o mapeamento de hosts que será usado como inventário do Ansible. Você pode alterar o nome da pasta "sample" para o nome da sua organização, pois não irá afetar em nada no processo de start das playbooks.

Insira dentro do arquivo "hosts.ini" em inventory/sample/ as informações do seu cluster:

node1    ansible_host=172.16.2.2 ip=172.16.2.2
node2    ansible_host=172.16.2.3 ip=172.16.2.3
node3    ansible_host=172.16.2.4 ip=172.16.2.4
node4    ansible_host=172.16.2.5 ip=172.16.2.5
node5    ansible_host=172.16.2.6 ip=172.16.2.6

node1
node2
node3

node1
node2
node3
node4
node5

node1
node2
node3

kube-node
kube-master



node1
node2
node3

Revise e altere os parâmetros abaixo em: inventory/sample/group_vars

inventory/sample/group_vars/all.yml
inventory/sample/group_vars/k8s-cluster.yml

Altere as configurações de rede em inventory/sample/group_vars/k8s-cluster.yml:

# Choose network plugin (cilium, calico, contiv, weave or flannel)
# Can also be set to 'cloud', which lets the cloud provider setup appropriate routing
kube_network_plugin: weave


Em inventory/sample/group_vars/all.yml, descomente a linha a seguir para permitir que as métricas busquem os dados de utilização de recursos de cluster para que as HPAs funcionem (para que os comandos "kubectl top nodes" e "kubectl top pods" funcionem):

# The read-only port for the Kubelet to serve on with no authentication/authorization. Uncomment to enable.
kube_read_only_port: 10255


Let's play

Agora estamos todos prontos para o grande botão vermelho:

ansible-playbook -i inventory/sample/hosts.ini cluster.yml -e ignore_assert_errors=yes -v

Na teoria, ao finalizar as playbooks, já será possível listar o cluster dos masters com o comando:

# kubectl get nodes

NAME      STATUS    ROLES         AGE       VERSION
node1     Ready     master,node   4m        v1.10.3
node2     Ready     master,node   4m        v1.10.3
node3     Ready     master,node   4m        v1.10.3
node4     Ready     node          4m        v1.10.3
node5     Ready     node          4m        v1.10.3

Caso alguma coisa dê errado, aplique a playbook para remover tudo que foi feito no cluster:

ansible-playbook -i inventory/sample/hosts.ini reset.yml -e ignore_assert_errors=yes -v

Espero que esse tutorial possa ajudar muitos e em caso de dúvidas, espero poder ajudar.

   

Páginas do artigo
   1. Preparando o ambiente
Outros artigos deste autor

Instalando Openshift Origin 3.11 com Ansible

Leitura recomendada

Principais Comandos Básicos do Docker-CE

Configurando Docker Swarm no Rocky Linux

Introdução e Utilização do Docker

Usando Docker para encapsular qualquer aplicação no GNU/Linux

Docker: Uma abordagem didática para tempos obscuros

  
Comentários
[1] Comentário enviado por rattus em 31/05/2019 - 18:21h

(* ゚∀゚)ノシ
Parabens Dihogo.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts