Executando um cluster Kubernetes no Docker com K3d

0
18


K3d é um wrapper de código aberto em torno da distribuição Rancher/SUSE K3s Kubernetes que permite executar o plano de controle dentro do Docker. A pilha inteira é executada no Docker, oferecendo um cluster totalmente em contêiner que é leve e fácil de configurar.

Enquanto o K3s é projetado para uma ampla variedade de fluxos de trabalho, o K3d se concentra mais especificamente em situações de desenvolvimento em que você já está usando o Docker. Ele permite que você ative um cluster Kubernetes em seu host Docker existente sem executar uma máquina virtual ou qualquer outro serviço do sistema.

Este artigo mostrará como começar a usar um cluster K3d simples. Você precisará do Kubectl e do Docker v20.10.5 ou posterior já instalado em seu sistema antes de começar. O K3d funciona em Linux, Mac (inclusive via Homebrew) e Windows (via Chocolatey). Este guia se concentra no uso com Linux; k3d As instruções de instalação da CLI para outras plataformas estão disponíveis na documentação.

Instalando a CLI do K3d

a k3d A CLI fornece comandos de administração para criar e gerenciar seus clusters. Você pode encontrar a CLI mais recente no GitHub ou executar o script de instalação para obter automaticamente o download correto para seu sistema.

$ curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash

O roteiro deposita o k3d binário em seu /usr/local/bin diretório. Tente executar o k3d version Comando para verificar se sua instalação foi bem sucedida:

$ k3d version
k3d version v5.4.6
k3s version v1.24.4-k3s1 (default)

Criar um cluster

A CLI do K3d fornece uma cluster create Comando para criar e iniciar automaticamente um novo cluster:

$ k3d cluster create
INFO[0000] Prep: Network                                
INFO[0000] Created network 'k3d-k3s-default'            
INFO[0000] Created image volume k3d-k3s-default-images  
INFO[0000] Starting new tools node...                   
INFO[0001] Creating node 'k3d-k3s-default-server-0'     
INFO[0001] Pulling image 'ghcr.io/k3d-io/k3d-tools:5.4.6' 
INFO[0002] Pulling image 'docker.io/rancher/k3s:v1.24.4-k3s1' 
INFO[0002] Starting Node 'k3d-k3s-default-tools'        
INFO[0008] Creating LoadBalancer 'k3d-k3s-default-serverlb' 
INFO[0009] Pulling image 'ghcr.io/k3d-io/k3d-proxy:5.4.6' 
INFO[0012] Using the k3d-tools node to gather environment information 
INFO[0012] HostIP: using network gateway 172.25.0.1 address 
INFO[0012] Starting cluster 'k3s-default'               
INFO[0012] Starting servers...                          
INFO[0012] Starting Node 'k3d-k3s-default-server-0'     
INFO[0016] All agents already running.                  
INFO[0016] Starting helpers...                          
INFO[0016] Starting Node 'k3d-k3s-default-serverlb'     
INFO[0022] Injecting records for hostAliases (incl. host.k3d.internal) and for 2 network members into CoreDNS configmap... 
INFO[0025] Cluster 'k3s-default' created successfully!  
INFO[0025] You can now use it like this:                
kubectl cluster-info

O cluster será chamado k3s-default quando você executa o comando sem argumentos. Defina seu próprio nome incluindo-o como o primeiro argumento do comando:

$ k3d cluster create demo
...

O K3d modifica automaticamente seu arquivo de configuração do Kubernetes (.kube/config) para incluir uma conexão com seu novo cluster. Marque a conexão como padrão para que kubectl os comandos agora apontarão para o seu ambiente K3d.

$ kubectl cluster-info
Kubernetes control plane is running at https://0.0.0.0:42879
CoreDNS is running at https://0.0.0.0:42879/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://0.0.0.0:42879/api/v1/namespaces/kube-system/services/https:metrics-server:https/proxy

Corre docker ps mostrará que dois contêineres foram iniciados, um para K3s e outro para o proxy K3d que encaminha o tráfego para seu cluster:

$ docker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS         PORTS                             NAMES
9b6b610ad312   ghcr.io/k3d-io/k3d-proxy:5.4.6     "/bin/sh -c nginx-pr..."   3 minutes ago   Up 3 minutes   80/tcp, 0.0.0.0:42879->6443/tcp   k3d-k3s-default-serverlb
842cc90b78bf   rancher/k3s:v1.24.4-k3s1           "/bin/k3s server --t..."   3 minutes ago   Up 3 minutes                                     k3d-k3s-default-server-0

Usando seu cluster

Use comandos conhecidos do Kubectl para interagir com seu cluster e implantar seus pods:

$ kubectl run nginx --image nginx:latest
pod/nginx created

$ kubectl expose pod/nginx --port 80 --type NodePort
service/nginx exposed

Para acessar seu servidor NGINX, primeiro encontre o endereço IP atribuído ao seu nó Kubernetes:

$ kubectl get nodes -o wide
NAME                       STATUS   ROLES                  AGE    VERSION        INTERNAL-IP   EXTERNAL-IP   OS-IMAGE   KERNEL-VERSION      CONTAINER-RUNTIME
k3d-k3s-default-server-0   Ready    control-plane,master   102s   v1.24.4+k3s1   172.27.0.2    <none>        K3s dev    5.4.0-125-generic   containerd://1.6.6-k3s1

O IP correto a ser usado é 172.27.0.2.

Em seguida, encontre o NodePort atribuído ao seu nginx Serviço:

$ kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1       <none>        443/TCP        5m49s
nginx        NodePort    10.43.235.233   <none>        80:31214/TCP   1s

O número da porta exposta é 31214. faça um pedido para 172.17.0.2:31214 deve gerar a página de boas-vindas padrão do NGINX:

$ curl http://172.17.0.2:31214
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

Você pode obter mais orientações sobre como expor serviços e configurar redes do Ingress na documentação do K3d.

Ativando os sinalizadores do K3s

a cluster create O comando envolve o processo padrão de criação do cluster K3s. Você pode passar argumentos pelo K3 fornecendo --k3s-arg flags O valor do flag deve ser um argumento a ser incluído quando o K3d chama o binário K3s.

$ k3s cluster create --k3s-arg "--disable=traefik"

Este exemplo diz ao K3s para desabilitar seu componente Traefik integrado.

Serviços de acesso em execução em seu host

Algumas cargas de trabalho executadas no K3d podem precisar acessar serviços já em execução no host do Docker. O K3d fornece um nome de host chamado host.k3d.internal dentro de suas configurações de DNS padrão. Isso se resolverá automaticamente em sua máquina host. Você pode fazer referência a esse nome de host especial em seus pods para acessar bancos de dados existentes, compartilhamentos de arquivos e outras APIs executadas fora do Kubernetes.

Usando imagens locais do Docker

Seu cluster K3d/K3s não pode acessar suas imagens locais do Docker. O cluster e todos os seus componentes estão em execução. no interior Estivador. A tentativa de usar uma imagem privada que existe apenas no host falhará e relatará um erro.

Há duas maneiras de resolver isso: enviar sua imagem para um registro ou usar o recurso de importação de imagem do K3d para copiar uma imagem local para seu cluster. Em geral, o primeiro método é o preferido, pois centraliza o armazenamento de imagens e permite acessar imagens de qualquer ambiente. No entanto, ao testar rapidamente as alterações locais, você pode importar diretamente uma imagem que acabou de criar:

$ k3d image import demo-image:latest

Este comando fará demo-image:latest disponível em seu cluster.

O K3d também pode criar e expor um registro de imagem para você. Os logs são criados melhor junto com seu cluster, pois o K3d pode configurar automaticamente o acesso ao cluster:

$ k3d cluster create --registry-create demo-registry

Isso inicia um novo cluster com um registro chamado demo-registry. O registro será executado em seu próprio contêiner do Docker. Você pode descobrir o número da porta em que o registro está exposto executando docker ps -f name=<cluster-name>-registryOnde <cluster-name> é o nome do seu cluster. O envio de imagens para esse registro permite que os pods em seu cluster os acessem.

$ docker tag demo-image:latest k3d-demo-registry.localhost:12345/demo-image:latest
$ docker push k3d-demo-registry.localhost:12345/demo-image:latest

Você também pode criar logs sob demanda, mas precisará reconfigurar manualmente seu cluster para fornecer detalhes de conexão.

Pare seu cluster

Seu cluster K3d será executado continuamente até que você o interrompa. a cluster stop O comando interrompe a execução de contêineres do Docker enquanto preserva os dados do cluster:

$ k3d cluster stop k3s-default

Reinicie seu cluster no futuro usando o cluster start domínio:

$ k3d cluster start k3s-default

Excluir seu cluster

Você pode remover um cluster a qualquer momento executando o cluster delete comando e fornecendo seu nome. Isso removerá todos os rastreamentos do cluster, removendo os contêineres e volumes do Docker que o forneceram. A remoção de todos os seus clusters retornará seu host a um quadro limpo com apenas a CLI do K3d instalada.

$ k3d cluster delete k3s-default
INFO[0000] Deleting cluster 'k3s-default'               
INFO[0001] Deleting cluster network 'k3d-k3s-default'   
INFO[0001] Deleting 2 attached volumes...               
INFO[0001] Removing cluster details from default kubeconfig... 
INFO[0001] Removing standalone kubeconfig file (if there is one)... 
INFO[0001] Successfully deleted cluster k3s-default!

O processo de remoção remove automaticamente as referências ao cluster do seu Kubeconfig.

Resumo

O K3d permite que você execute um cluster Kubernetes em contêiner. Fornece um ambiente K3s completo, desde que o Docker esteja disponível. O K3d suporta vários nós, tem suporte integrado para registros de imagem e pode ser usado para criar clusters altamente disponíveis com vários planos de controle.

Os desenvolvedores que já executam o Docker podem usar o K3d para adicionar rapidamente o Kubernetes ao seu ambiente de trabalho. O K3d é leve, fácil de gerenciar e não adiciona nenhum outro serviço de sistema à sua máquina. Isso o torna uma ótima opção para uso local, mas sua dependência do Docker significa que pode não ser adequado para hosts de produção nos quais você não deseja adicionar outra dependência. Outras distribuições do Kubernetes como Minikube, Microk8s e K3s simples são alternativas viáveis.