Cluster Kubernetes
Instalação do Cluster Kubernetes
- Instalação de Cluster K8s em 03 hosts.
- Instalação de plugin CNI de rede.
- Instalação do MetalLB (Load Balancer)
Topologia do Laboratório
Máquinas Virtuais:
- Sistema Operacional: Red Hat Enterprise Linux release 9.4
- Processador: 4vCPU
- Memória: 4GB
- Armazenamento: 50GB SSD
Endereçamento:
k8s-infra-01 | Master Node | 10.9.66.141 |
k8s-infra-02 | Worker01 | 10.9.66.142 |
k8s-infra-03 | Worker02 | 10.9.66.143 |
Linux (todas VMs)
Nota: Os procedimentos a seguir deverão ser executados nos três hosts: k8s-infra-01, k8s-infra-02 e k8s-infra-03.
Adicionar as entradas FQDN no arquivo de hosts:
tee /etc/hosts <<EOF
127.0.0.1 localhost
10.9.66.141 k8s-infra-01.lab.local k8s-infra-01
10.9.66.142 k8s-infra-02.lab.local k8s-infra-02
10.9.66.143 k8s-infra-03.lab.local k8s-infra-03
EOF
Desabilitar SWAP:
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
Carregar os módulos do kernel que serão necessários:
tee /etc/modules-load.d/containerd.conf <<EOF
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
overlay
EOF
modprobe br_netfilter
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe overlay
Configurar parâmetros no kernel, necessários para o Kubernetes:
tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512
EOF
- Faça o Reload, para carregar as configurações acima:
sysctl --system
Desabilitar o Selinux e Firewall
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
Instalação Kubernetes
Nota: Os procedimentos a seguir deverão ser executados nos três hosts: k8s-infra-01, k8s-infra-02 e k8s-infra-03.
Instalar e iniciar o CRI-O Container-Runtime:
Nota: Usando a última versão, v1.30, considerando a data da publicação do artigo. Você deverá avaliar usar a versão mais recente.
cat <<EOF | tee /etc/yum.repos.d/cri-o.repo
[cri-o]
name=CRI-O
baseurl=https://pkgs.k8s.io/addons:/cri-o:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/addons:/cri-o:/stable:/v1.30/rpm/repodata/repomd.xml.key
EOF
dnf install -y container-selinux cri-o
systemctl start crio.service
systemctl enable crio.service
systemctl status crio.service
Adicionar Repositório do Kubernetes:
Nota: Usando a última versão, v1.31, considerando a data da publicação do artigo. Você deverá avaliar usar a versão mais recente.
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
Instalar (kubelet, kubeadm e kubectl):
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet.service
Master Node
Nota: Os procedimentos a seguir deverão ser executados no host: k8s-infra-01 (Master Node)
Inicializar o cluster Kubernetes usando o comando Kubeadm:
kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--control-plane-endpoint=k8s-infra-01.lab.local
Se tudo deu certo, você receberá a mensagem acima.
Copie o comando com todos os parâmetros: kubeadm join .... ele será usado para ingressar os demais nodes ao cluster.
- Como estamos usando o 'root', execute o comando abaixo.
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /root/.zshrc
- Verificar se os componentes estão 'rodando':
Pode ser necessário aguardar alguns segundos até todos os containers serem inicializados. Tentar algumas vezes os próximos comandos.
kubectl cluster-info
kubectl get nodes
kubectl get pods -A
O status do cluster ainda está "NotReady". Precisamos, por fim, instalar o plugin CNI (container network interface) que fara a orquestração de rede no segmento dos Pods.
Worker Nodes
Nota: Os procedimentos a seguir deverão ser executados apenas nos hosts: k8s-infra-02 e k8s-infra-03
Ingressar os demais nós ao cluster
Colar nos hosts workers a linha do join, que foi informada logo após a execução do comando kubeadm init:
Exemplo:
kubeadm join docker01.lab.local:6443 --token t42p9k.zjez6kjg62viul40 \
--discovery-token-ca-cert-hash sha256:189cadfbde7ce7985....
- Caso o o aluno não tenha anotado a linha do comando join, execute no nó master o seguinte comando:
kubeadm token create --print-join-command
kubectl get nodes
Plug-ins
Nota: Os procedimentos a seguir deverão ser executados no host: k8s-infra-01 (Master Node)
Plug-in de rede
Consulte a documentação oficial do kubernetes para obter a lista dos plugins de rede que poderão ser utilizados:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Instalando o plug-in de rede flannel:
Em nosso laboratório utilizaremos o plugin flannel. Além da documentação oficial do flannel, um material didático resumido pode ser visto no site: https://mvallim.github.io/kubernetes-under-the-hood/documentation/kube-flannel.html
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl get nodes
kubectl get pods -A
MetalLB (Load Balancer)
Consulte a documentação oficial https://metallb.universe.tf/
Instalação do Metallb:
Nota: Usando a última versão, v0.14.8, considerando a data da publicação do artigo. Você deverá avaliar usar a versão mais recente.
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
Configuração do Range de IPs para atribuição através do serviço Load Balancer:
vi range.yaml
# configuração do range de IPs para
# atribuição via Load Balancer
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: lab-range-ips
namespace: metallb-system
spec:
addresses:
- 10.9.66.150-10.9.66.169
---
# Usando o modo L2
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: lab-l2-mode
namespace: metallb-system
spec:
ipAddressPools:
- lab-range-ips
kubectl apply -f range.yaml