Запуск кластера 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, являются жизнеспособными альтернативами.