Поиск по сайту:

Запуск кластера Kubernetes в Docker с помощью K3d


K3d — это оболочка с открытым исходным кодом для дистрибутива Rancher/SUSE K3s Kubernetes, которая позволяет запускать плоскость управления внутри Docker. Весь стек работает в Docker, что дает вам полностью контейнерный кластер, легкий и простой в настройке.

В то время как K3s предназначен для широкого спектра рабочих процессов, K3d более конкретно ориентирован на ситуации разработки, когда вы уже используете Docker. Он позволяет развернуть кластер Kubernetes на существующем хосте Docker без запуска виртуальной машины или каких-либо других системных служб.

Эта статья покажет вам, как начать работу с простым кластером K3d. Вам понадобятся Kubectl и Docker v20.10.5 или новее, уже установленные в вашей системе, прежде чем вы начнете. K3d работает на Linux, Mac (в том числе через Homebrew) и Windows (через Chocolatey). Это руководство посвящено использованию с Linux; Инструкции по установке k3d CLI для других платформ доступны в документации.

Установка интерфейса командной строки K3d

Интерфейс командной строки k3d предоставляет команды управления для создания кластеров и управления ими. Вы можете найти последнюю версию интерфейса командной строки на GitHub или запустить сценарий установки, чтобы автоматически получить правильную загрузку для вашей системы.

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

Сценарий помещает двоичный файл k3d в ваш каталог /usr/local/bin. Попробуйте запустить команду k3d version, чтобы проверить успешность установки:

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

Создание кластера

Интерфейс командной строки K3d предоставляет команду cluster create для автоматического создания и запуска нового кластера:

$ 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

Кластер будет называться k3s-default при запуске команды без каких-либо аргументов. Установите собственное имя, включив его в качестве первого аргумента команды:

$ k3d cluster create demo
...

K3d автоматически изменяет ваш файл конфигурации Kubernetes (.kube/config), чтобы включить подключение к вашему новому кластеру. Он помечает соединение как соединение по умолчанию, поэтому команды kubectl теперь будут нацелены на вашу среду 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

Запуск docker ps покажет, что запущены два контейнера, один для K3s, а другой для прокси-сервера K3d, который перенаправляет трафик в ваш кластер:

$ 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

Использование вашего кластера

Используйте знакомые команды Kubectl для взаимодействия с кластером и развертывания модулей:

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

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

Чтобы получить доступ к вашему серверу NGINX, сначала найдите IP-адрес, назначенный вашему узлу 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

Правильный IP-адрес: 172.27.0.2.

Затем найдите NodePort, назначенный вашей службе nginx:

$ 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

Открытый номер порта: 31214. Выполнение запроса к 172.17.0.2:31214 должно привести к появлению страницы приветствия NGINX по умолчанию:

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

Вы можете получить дополнительные рекомендации по предоставлению услуг и настройке сети Ingress в документации K3d.

Включение флагов K3s

Команда cluster create выполняет стандартный процесс создания кластера K3s. Вы можете передавать аргументы в K3s, указав флаги --k3s-arg. Значение флага должно быть аргументом, который будет включен, когда K3d вызовет двоичный файл K3s.

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

В этом примере K3s инструктируется отключить встроенный компонент Traefik.

Доступ к службам, работающим на вашем хосте

Некоторым рабочим нагрузкам, которые вы запускаете в K3d, может потребоваться доступ к службам, уже запущенным на вашем хосте Docker. K3d предоставляет имя хоста host.k3d.internal в своей конфигурации DNS по умолчанию. Это автоматически разрешится на ваш хост-компьютер. Вы можете ссылаться на это специальное имя хоста в своих модулях для доступа к существующим базам данных, файловым ресурсам и другим API, работающим за пределами Kubernetes.

Использование локальных образов Docker

Ваш кластер K3d/K3s не может получить доступ к вашим локальным образам Docker. Кластер и все его компоненты работают внутри Docker. Попытка использовать частное изображение, которое существует только на хосте, завершится ошибкой и выдаст сообщение об ошибке.

Есть два способа решить эту проблему: либо отправить образ в реестр, либо использовать функцию импорта образа K3d, чтобы скопировать локальный образ в ваш кластер. Первый метод обычно предпочтительнее, поскольку он централизует хранилище изображений и позволяет вам получать доступ к изображениям из любой среды. Однако при быстром тестировании локальных изменений вы можете захотеть напрямую импортировать только что созданный образ:

$ k3d image import demo-image:latest

Эта команда сделает demo-image:latest доступным внутри вашего кластера.

K3d также может создать и открыть для вас реестр изображений. Реестры лучше всего создавать вместе с вашим кластером, так как K3d может автоматически настроить доступ к кластеру:

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

Это запускает новый кластер с реестром под названием demo-registry. Реестр будет работать в собственном контейнере Docker. Вы можете узнать номер порта, на котором открыт реестр, запустив docker ps -f name=<имя-кластера>-registry, где <имя-кластера> — это имя вашего кластера. Отправка изображений в этот реестр сделает их доступными для модулей в вашем кластере.

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

Вы также можете создавать реестры по запросу, но вам нужно будет вручную перенастроить свой кластер, чтобы предоставить сведения о подключении.

Остановка вашего кластера

Ваш кластер K3d будет работать непрерывно, пока вы сами его не остановите. Команда cluster stop останавливает запуск контейнеров Docker, сохраняя при этом данные вашего кластера:

$ k3d cluster stop k3s-default

В будущем перезапустите кластер с помощью команды cluster start:

$ k3d cluster start k3s-default

Удаление вашего кластера

Вы можете удалить кластер в любое время, выполнив команду cluster delete и указав его имя. Это удалит все следы кластера, а также контейнеры и тома Docker, которые его предоставили. Удаление всех ваших кластеров вернет ваш хост к чистому состоянию с установленным только интерфейсом командной строки K3d.

$ 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!

Процесс удаления автоматически удаляет ссылки на кластер из вашего Kubeconfig.

Краткое содержание

K3d позволяет запускать контейнерный кластер Kubernetes. Он обеспечивает полную среду K3s везде, где доступен Docker. K3d поддерживает несколько узлов, имеет встроенную поддержку реестров образов и может использоваться для создания высокодоступных кластеров с несколькими плоскостями управления.

Разработчики, уже использующие Docker, могут использовать K3d для быстрого добавления Kubernetes в свою рабочую среду. K3d легковесен, прост в управлении и не добавляет к вашему компьютеру никаких других системных служб. Это делает его отличным выбором для локального использования, но его зависимость от Docker означает, что он может не подходить для производственных хостов, где вы не хотите добавлять еще одну зависимость. Другие дистрибутивы Kubernetes, такие как Minikube, Microk8 и простые K3, являются жизнеспособными альтернативами.