Coder Social home page Coder Social logo

k8s-cluster-ha's Introduction

Alta Disponibilidade No Seu Cluster Kubernetes com HAProxy

O objetivo deste laboratório é mostrar a instalação e configuração básica de um cluster multi Control Plane kubernetes com o HAProxy. Ideal para ambiente on-premise e gerenciado.
HA significa High Availability. Ou seja, alta disponibilidade.

Visão do conceito deste laboratório:

arquitetura de um cluster multi control plane com ha

Escolhemos a DigitalOcean (DO) para subir a infraestrutura básica utilizando os droplets (máquinas virtuais da DO). As imagens dos droplets foram baseadas em Debian e os IPs privados utilizados para a comunicação dos hosts.

Dica:

Considerando este um laboratório, simule o DNS utilizando o arquivo hosts em cada droplet. A princípio, pode ser feito para o ip-privado-haproxy + nome-haproxy

TAMANHOS DE MÁQUINAS NA DIGITALOCEAN

Os slugs (ex. s-1vcpu-1gb) de droplets podem ser consultados aqui.

TERRAFORM

Os passos para o provisionamento dos droplets no DO podem ser vistos em Como Utilizar Terraform Com DigitalOcean.

Aqui estão alguns comandos básicos para que sejam executados no diretório do projeto, onde temos os arquivos .tf. Os paths e variáveis estão declarados para uso em sistemas operacionais Windows. Para os baseados em Linux, é só adaptar!

Iniciar o Terraform

terraform init

Executar o plano do Terraform

terraform plan -var "do_token=%DO_PAT%" -var "pvt_key=<path\your-private-key>"

Deploy com Terraform na DigitalOcean

terraform apply -var "do_token=%DO_PAT%" -var "pvt_key=<path\your-private-key>"

Destruir com Terraform droplets na DigitalOcean

terraform destroy -var "do_token=%DO_PAT%" -var "pvt_key=<path\your-private-key>"

Caso queira acessar os droplets via SSH a partir do seu computador:

ssh -i <path\your-private-key> <user>@<public-ip>

Note que utilizamos a chave privada pois, anteriormente, geramos um par de chaves e cadastramos a pública na DO.

ARQUITETURA DESTE LABORATÓRIO

Após subirmos a infraestrutura básica e configurarmos o cluster com ha, chegaremos ao seguinte esboço:

cluster multi control plane com ha

INSTALAÇÃO DO HAPROXY

Documentação de Referência

Instalação do HAProxy

sudo apt-get install haproxy -y

Após a instalação, ir no respectivo arquivo de configuração /etc/haproxy/haproxy.cfg e inserir as entradas abaixo. Após isso, salve o arquivo.

frontend cluster-kubernetes
        mode tcp
        bind 10.108.0.5:6443
        option tcplog
        default_backend control-planes

backend control-planes
        mode tcp
        balance roundrobin
        option tcp-check
        server control-plane-0 10.108.0.3:6443 check fall 2 rise 1
        server control-plane-1 10.108.0.6:6443 check fall 2 rise 1
        server control-plane-2 10.108.0.7:6443 check fall 2 rise 1

Reinicie e cheque o status do serviço haproxy.

	systemctl restart haproxy
	systemctl status haproxy

Você também pode verificar os logs em /var/log/haproxy.log

Comandos úteis:

netstat -atunp --> Para checar as portas no host do HAProxy. Neste nosso caso, verifique se a porta 6443 está presente.

nc -v ip-haproxy 6443 --> Este comando é executado nos demais hosts deste laboratório para validar a conexão com o haproxy na porta 6443. Um excelente comando para troubleshooting.

INSTALAÇÃO DO CONTAINERD

Este vídeo pode te ajudar nesta instalação.
Não esqueça de habilitar o swap off. Esta configuração evita perda de performance e está aderente ao design e uso de containers limitando até 100% do recurso e não mais que isso.

Precisamos de um container runtime e, neste caso, escolhemos o containerd (poderia ser CRI-O ou outro).

Basicamente ele baixa, executa e extrai qualquer imagem que seja compatível com a OCI. Além de executar processos do runC.

Executar os passos abaixo em cada Control Plane e Nó.

PRÉ-INSTALAÇÃO

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# Configurações requeridas no sysctl, estas persistem após reiniciar o host.
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Aplicar as configurações no sysctl sem a necessidade de reiniciar o host
sudo sysctl --system

INSTALAÇÃO

sudo apt-get install containerd -y
	
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

sudo systemctl restart containerd

INSTALAÇÃO KUBELET KUBEADM KUBECTL

Essa trinca (kubelet, kubeadm e kubectl) é necessária para podermos levantar o nosso cluster kubernetes Multi Control Plane!

PRÉ-INSTALAÇÃO

Verifique se o módulo br_netfilter está carregado. Isso pode ser feito da seguinte forma:

lsmod | grep br_netfilter

Caso não encontre, carregue-o da seguinte forma:

sudo modprobe br_netfilter

As configurações dos nós linux no que se refere ao iptables precisam estar corretas para que a comunicação do cluster funcione. O net.bridge.bridge-nf-call-iptables tem que estar igual a 1 na configuração do sysctl.

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

INSTALAÇÃO

Atualize a indexação/lista de pacotes e instale os pacotes necessários para poder utilizar o repositório do kubernetes:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

Baixe a chave de assinatura pública do Google Cloud:

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

Adicione o repositório do kubernetes:

echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

Atualize a indexação/lista de pacotes e instale a trinca kubelet, kubeadm e kubectl. Ao final, fixe a versão instalada com o hold ;)

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

INICIANDO SEU CLUSTER KUBERNETES HA

Escolha somente um Control Plane para executar:

sudo kubeadm init --control-plane-endpoint "haproxy-ip:6443" --upload-certs

Pronto! Isso irá iniciar o seu Cluster Kubernetes Multi Control Plane pois o --control-plane-endpoint é o IP interno do nosso HAProxy. Poderia ser o Virtual IP (VIP) do HAProxy caso tivéssemos mais de um com keep-alive.

Ao final, você terá os comandos para gerenciar o seu cluster e colocar os demais Control Planes e Nós (workers) no cluster.

Exemplo:

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of the control-plane node running the following command on each as root:

kubeadm join haproxy-01:6443 --token 42i35p.wgxvowimiy4ub9mp
--discovery-token-ca-cert-hash sha256:20a5adc8095fd25cf2d9a72cc89362818c8dbb7ac37b4461900526ae65ba99e5
--control-plane --certificate-key 018a256e7ff705be89224231e184f6cee8bdf019fec1d72780da8f3d78db2685

Please note that the certificate-key gives access to cluster sensitive data, keep it secret! As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use "kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join haproxy-01:6443 --token 42i35p.wgxvowimiy4ub9mp
--discovery-token-ca-cert-hash sha256:20a5adc8095fd25cf2d9a72cc89362818c8dbb7ac37b4461900526ae65ba99e5

Instale um plugin referente ao Container Network Interface (CNI). Neste caso, vamos instalar o Weave Net:

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

Agora sim você pode ver os componentes do Control Plane inicializando:

kubectl get pod -n kube-system -w

APROVEITE O SEU CLUSTER

Que tal através do Control Plane criar ou escalar um Pod?!

kubect create deployment nginx --image nginx
kubectl scale deployment nginx --replicas 5

Pause ou desligue um Control Plane e veja se ainda conseguirá gerenciar os recursos do seu cluster ;)

k8s-cluster-ha's People

Contributors

igormw avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.