Pesquisa na minha base

Kubernetes sem docker (containerd e runc)

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

Documentação

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

Documentação

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

Refência Documentação Oficial

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