Distribuição utilizada ubuntu 20.04 LTS
Imagem vagrant ubuntu/focal64(virtualbox, 20211026.0.0)
Ajustando a hora
sudo timedatectl set-timezone America/Sao_Paulo
Garantindo modulos necessários
cat << EOF > /etc/modules-load.d/k8s.conf
overlay
br_netfilter
#ip_vs_rr
#ip_vs_wrr
#ip_vs_sh
#nf_conntrack_ipv4
#ip_vs
EOF
Adicioando parametros de kernel necessários
cat << EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
Desabilitando a swap
swapoff -a
vim /etc/fstab
# Comente a linha da swap
Habilitando os parametros criados acima.
sysctl --system
reboot
Adicioando o repositório do kubernetes
#Aqui vamos a versão do repositório a ser instalada
export K8SVERSION=v1.28
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/${K8SVERSION}/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${K8SVERSION}//deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
Instalando o containerd (no lugar docker)
Obs. Usei o repositório do docker, mas só instalei o containerd.io.
Tive problemas com o containerd do repositório oficial do Ubuntu 20.04 em 10/12/22 na versão do Kubernetes 1.26.0.
# Adicionando a chave do repositório
install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
# Instalando o containerd
sudo apt install -y containerd.io
Configurando o Cgroups no Containerd.
#sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
Instalação do Kubernetes
# Istalando a ultima versão
# apt-get install -y kubelet kubeadm kubectl
# Localizando versão específica
apt-cache madison kubelet
# Instalando uma versão específica
apt-get install -y kubelet=1.21.7-00 kubeadm=1.21.7-00 kubectl=1.21.7-00
#https://kubernetes.io/releases/
# Marcando para os pacotes não serem atualizado automaticamente
sudo apt-mark hold kubelet kubeadm kubectl
# Baixando as imagens
kubeadm config images pull
Inicializando o cluster
Caso seja apenas um master sem HA
kubeadm init --apiserver-advertise-address 192.168.1.51 --pod-network-cidr 192.168.1.0/24 --upload-certs
Caso o cluster tenha HA, necessário apontar para um LB
- LB (Load Balancer) – pode ser um HA-Proxy ou Nginx
- HA – Highly Available (Alta Disponibilidade)
# Inicialização do Cluster com HA apontando para um LB
kubeadm init --apiserver-advertise-address 192.168.1.51 --pod-network-cidr 192.168.1.0/24 \
--control-plane-endpoint 192.168.1.50:6443 --upload-certs
Consultando antes de aplicar o CNI
Obs. Observe o coredns-… com status de Pending!
root@km1:~# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-558bd4d5db-24lqk 0/1 Pending 0 17m
coredns-558bd4d5db-hfj95 0/1 Pending 0 17m
etcd-km1.lab.local 1/1 Running 0 17m
kube-apiserver-km1.lab.local 1/1 Running 0 17m
kube-controller-manager-km1.lab.local 1/1 Running 0 17m
kube-proxy-vk8wh 1/1 Running 0 17m
kube-scheduler-km1.lab.local 1/1 Running 0 17m
weave-net-7tjlj 0/2 Init:0/1 0 4s
Instalando o Weav como CNI (Container Network Interface)
Obs. Este passo é realizado apenas no control-plane inicial.
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
Consultando após de aplicar o Weav – CNI
Depois de alguns segundos o status do coredns-… deve passar para Running!
Caso positivo bom sinal, tudo certo com o seu cluster K8S.
root@km1:~# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-558bd4d5db-24lqk 1/1 Running 0 18m
coredns-558bd4d5db-hfj95 0/1 Running 0 18m
etcd-km1.lab.local 1/1 Running 0 18m
kube-apiserver-km1.lab.local 1/1 Running 0 18m
kube-controller-manager-km1.lab.local 1/1 Running 0 18m
kube-proxy-vk8wh 1/1 Running 0 18m
kube-scheduler-km1.lab.local 1/1 Running 0 18m
weave-net-7tjlj 2/2 Running 1 44s
Configutando o .kubeconfig conforme saída do init
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
Adicionando outros nodes conforme saída do init
Repite o procedimento de instalação nos demais nós, utilize os comandos da saída do init para ingressa-los nos cluster de a acordo coma a função desejada: control-plane ou worker. Fique atento as quantidades para o control-plane, trabalhe com 1, 3, ou 5.
Configure o auto complete nos nodes control-plane
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
Comandos para interação inicial com o cluster
kubectl get nodes
kubectl get namespaces
kubectl get pods -A
kubectl get pods -n kube-system