Skip to main content

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

image.png

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.

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.

    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

    image.png

    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

    image.png

    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

    image.png

    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.

      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