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.