Как установить и использовать кластер Kubernetes при помощи утилиты kind

от автора

Чтобы развернуть готовый кластер Kubernetes, можно использовать разные способы — например, самому подготовить виртуальные машины или выделенные серверы, настроить операционную систему и установить необходимые программы. Однако данный способ может показаться довольно долгим и затратным (если арендовать ресурсы ВМ). 

Также можно арендовать уже готовый кластер (Kubernetes как услуга). Наконец, можно развернуть кластер локально на своем устройстве при помощи утилиты minikube. Однако при ее использовании необходимо, чтобы процессор устройства поддерживал виртуализацию, а еще понадобится установить программ-гипервизор. 

Но существует еще один способ, при помощи которого кластер Kubernetes можно запустить, прилагая минимум усилий. Сегодня речь пойдет об утилите kind.

Описание утилиты kind

kind (сокращение от Kubernetes in Docker — Kubernetes в Docker) — это инструмент, при помощи которого можно развернуть готовый кластер Kubernetes прямо на своем устройстве — будь то стационарный компьютер или ноутбук. Kind полагается на систему контейнеризации Docker. Вместо Docker можно использовать podman или nerdctl. Ноды (узлы) кластера kind представляют собой запущенные Docker-контейнеры — kind использует метод Docker-in-Docker (DinD). Это немного противоречит концепции Kubernetes, где каждая нода — это отдельная физическая или виртуальная машина, на которой запущен агент kubelet.

kind можно применять для тестирования своих сервисов в кластере Kubernetes, с целью использования в локальной разработке и для встраивания в процессы CI.

Преимущества использования kind

Главные преимущества kind:

  • Простая и быстрая установка Kubernetes-кластера на устройстве;

  • Поддержка мультинодовых кластеров (2 и более нод);

  • Кроссплатформенность — установить и использовать kind можно на ОС Windows, Linux и macOS;

  • Проект разрабатывается под эгидой CNCF — некоммерческой организации, которая разрабатывает и поддерживает различные сетевые и DevOps-утилиты с открытым исходным кодом.

Предварительные требования

Сперва необходимо установить Docker. Для этого воспользуйтесь официальной документацией, предварительно выбрав нужный Linux-дистрибутив. kind поставляется с встроенным инструментом командной строки для управления кластером, но можно установить и использовать kubectl. Инструкция по установке утилиты kubectl приведена по ссылке.

Установка kind

kind можно установить на все популярные операционные системы — Windows, Linux, macOS. Дополнительно доступна установка из файлов исходного кода при помощи утилиты make и go install

Мы будем устанавливать утилиту на Ubuntu версии 22.04. Инструкции по установке на остальные ОС приведены по ссылке. Все команды, перечисленные ниже, необходимо выполнять из-под имени root пользователя или из-под обычного пользователя, у которого есть права sudo.

1) Скачиваем бинарный файл kind (для архитектуры AMD64 / x86_64):

[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64

2) Делаем файл исполняемым:

chmod +x ./kind

3) Перемещаем kind в директорию /usr/local/bin/kind:

mv ./kind /usr/local/bin/kind

4) Проверяем, что установка была успешно выполнена путем вывода версии kind:

kind --version

Как можно увидеть на скриншоте выше, kind отобразил версию, а это значит, что утилита была успешно установлена.

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

При создании кластера можно указать необходимый образ с тегом (версией). Т. к. у нас используется kubectl с версией 31.0,

kubectl version --client

то развернем кластер тоже с версией 31.0. Образы kind доступны на Docker Hub

При работе с любым кластером Kubernetes важно соблюдать версии компонентов кластера — они должны быть одинаковыми во избежание потенциальных проблем работоспособности. Также на этапе инициализации кластера можно задать имя. Наша команда для создания кластера будет следующей:

kind create cluster --image=kindest/node:v1.31.0 --name=my-first-cluster

Процесс создания кластера занимает считанные минуты. В нашем примере был создан один нодовый кластер с именем my-first-cluster. Если имя не было задано, то по умолчанию будет использоваться имя node.

Когда кластер будет готов, можно проверить запущенные контейнеры docker:

docker ps

А также воспользоваться утилитой kubectl, например, для вывода всех нод кластера:

kubectl get nodes

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

Ранее мы создали кластер, состоящий только из одной master-ноды. Kind поддерживает установку кластера с двумя и более нодами, но для этого необходимо воспользоваться конфигурационным файлом. Конфигурационный файл — файл на языке разметки YAML. Точно такие же используются при работе с обычными кластерами Kubernetes. С синтаксисом конфигурационного файла можно ознакомиться по ссылке. Ниже приведен пример конфигурации для кластера состоящего из 3 нод — 1 мастер ноды и 2 рабочие ноды:

kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 kubeadmConfigPatches: - |   apiVersion: kubelet.config.k8s.io/v1beta1   kind: KubeletConfiguration   evictionHard:     nodefs.available: "0%" kubeadmConfigPatchesJSON6902: - group: kubeadm.k8s.io   version: v1beta3   kind: ClusterConfiguration   patch: |     - op: add       path: /apiServer/certSANs/-       value: my-hostname nodes: - role: control-plane - role: worker - role: worker

Сохраним конфигурацию выше в отдельный файл и передадим данный файл команде kind create:

kind create cluster --config test-cluster-config.yaml --image=kindest/node:v1.31.0 --name=my-second-cluster

Проверяем статус и количество нод кластера:

Кластер, состоящий из 3 нод, был успешно создан.

Создание кластера с двумя и более control plane-нодами

Kind поддерживает создание отказоустойчивых кластеров с 2 и более control plane-нодами. Для этого в конфигурационном файле достаточно указать необходимое количество control plane-нод. Например, создадим кластер с 2 control plane-нодами и одной рабочей нодой:

kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 … nodes: - role: control-plane - role: control-plane - role: worker

Полная конфигурация:

kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 kubeadmConfigPatches: - |   apiVersion: kubelet.config.k8s.io/v1beta1   kind: KubeletConfiguration   evictionHard:     nodefs.available: "0%" kubeadmConfigPatchesJSON6902: - group: kubeadm.k8s.io   version: v1beta3   kind: ClusterConfiguration   patch: |     - op: add       path: /apiServer/certSANs/-       value: my-hostname nodes: - role: control-plane - role: control-plane - role: worker

Сохраняем конфигурацию в файл и создаем кластер:

kind create cluster --config cluster-wth-two-cp-node.yaml --image=kindest/node:v1.31.0 --name=my-third-cluster

Проверим ноды кластера:

kubectl get nodes

При использовании кластера с 2 и более control plane-нодами, kind в качестве балансировщика запросов использует HAProxy:

Ранее мы уже упоминали, что одна нода кластера kind равна одному запущенному контейнеру в Docker. На скриншоте выше это отчетливо видно.

Удаление кластера

Чтобы удалить запущенный кластер, достаточно выполнить команду:

kind delete cluster --name=<имя-кластера>

Чтобы узнать имя кластера, необходимо выполнить команду:

kind get clusters

Удалим кластер с именем test-first-cluster:

kind delete cluster --name=test-first-cluster

Если при создании кластера вы не задали имя, то по умолчанию кластер будет создан с именем kind. Для удаления кластера с дефолтным именем достаточно выполнить команду:

kind delete cluster

Установка Calico CNI

По умолчанию в качестве сетевого плагина (CNI — container network interface) в kind используется собственная реализация под названием kindnetd, основанная на плагинах ptp и host-local. Вместо kindnetd можно установить другой сетевой интерфейс — заявлена поддержка Calico, Cilium, Flannel. В качестве теста рассмотрим процесс установки Calico.

1) Перед установкой стороннего CNI-плагин, необходимо выключить дефолтный плагин. Подготовим конфигурацию со следующим содержимым:

kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 networking:   disableDefaultCNI: true   podSubnet: 192.168.0.0/16 nodes: - role: control-plane - role: worker

Где:

disableDefaultCNI: true выключает стандартный CNI-плагин;
podSubnet: 192.168.0.0/16 — задается подсеть для подов. 192.168.0.0/16 — стандартная подсеть, для Calico используемая по умолчанию.

2) Создаем кластер:

kind create cluster --config cluster-with-calico.yaml --image=kindest/node:v1.31.0 --name=cluster-with-calico

3) Когда кластер будет готов, в статусе нод будет отображено NotReady:

Это связано с тем, что на данный момент у нас отсутствует CNI-плагин, а стандартный мы выключили.

4) Установим Calico при помощи официального манифеста:

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/calico.yaml

5) Убедимся, что поды с Calico были успешно запущены:

watch kubectl get pods -l k8s-app=calico-node -A

Как можно увидеть на скриншоте выше, Calico был успешно установлен.

Разворачиваем тестовое приложение в кластере kind

Kind кластер отлично подходит для тестирования приложений. Развернем тестовый Nginx, предварительно собрав его образ.

1) Создадим конфигурацию, включающую в себя 3 ноды — 1 мастер-ноду и 2 рабочие:

vim test-deployment-app.yaml
apiVersion: kind.x-k8s.io/v1alpha4 kind: Cluster nodes: - role: control-plane   extraPortMappings:   - containerPort: 25400     hostPort: 32700     listenAddress: "0.0.0.0"     protocol: tcp - role: worker - role: worker

В конфигурационном файле мы используем опцию extraPortMappings (перенаправление портов), чтобы получить доступ к запускаемому контейнеру в кластере kind с хостовой ОС. В качестве портов можно указать любой порт, который находится в диапазоне — с 30000 до 32767.

Параметр listenAddress: «0.0.0.0» означает, что запросы будут прослушиваться на всех сетевых адресах.

2) Создаем кластер:

kind create cluster --config test-deployment-app.yaml --image=kindest/node:v1.31.0 --name=test-deployment

Проверяем, что все ноды кластера запущены:

kubectl get nodes

3) Создаем структуру папок для тестового образа:

mkdir -p test-k8s/files

4) Создадим html-страницу в директории test-k8s/files/:

vim test-k8s/files/index.html
<html>   <head>     <title>Test-deployment</title>   </head>   <body>       <h1>Nginx test</h1>       <p>This Nginx pod is running in kind Kubernetes cluster</p>     </div>   </body> </html>

5) Подготовим конфигурационный файл для Nginx:

vim test-k8s/files/default.conf
server {     listen 80 default_server;            root /usr/share/nginx/html;     index index.html index.htm;     server_name _;     location / {         try_files $uri $uri/ =404;     } }

6) Создаем Dockerfile:

vim test-k8s/Dockerfile
FROM ubuntu:24.04   RUN  apt -y update && apt -y install nginx COPY files/default /etc/nginx/sites-available/default COPY files/index.html /usr/share/nginx/html/index.html EXPOSE 80 CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

7) Переходим в директорию с Dockerfile и собираем образ:

cd test-k8s  docker build -t nginx-test:01 .

8) Собранный образ отправляем в кластер:

kind load docker-image nginx-test:01 --name test-deployment

9) Чтобы загрузить готовый образ в Kubernetes-кластер, его необходимо «упаковать», используя тип объекта deployment:

vim nginx-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata:   name: test-nginx   namespace: default spec:   replicas: 1   selector:     matchLabels:       app: test-nginx   template:     metadata:       labels:         app: test-nginx     spec:       containers:       - name: nginx-test-kind         image: nginx-test:01         imagePullPolicy: Never         ports:         - containerPort: 80 --- apiVersion: v1 kind: Service metadata:   name: test-nginx-service   namespace: default spec:   selector:     app: test-nginx   type: NodePort   ports:   - name: http     port: 80     targetPort: 80     nodePort: 32700

В примере выше мы создали 2 объекта — deployment и сервис со значением NodePort.

10) Создаем deployment в кластере:

kubectl apply -f nginx-deployment.yaml

11) Проверяем статус пода:

kubectl get po

12) Т. к. в качестве сетевого взаимодействия при инициализации кластера мы выбрали перенаправление портов, необходимо открыть туннель между локальным портом кластера и портом запущенного приложения (где test-nginx-service это имя ранее созданного сервиса):

kubectl port-forward service/test-nginx-service 32700:80

13) Отправим запрос на локальный адрес и порт приложения:

curl -i localhost:32700

В ответ мы получили ранее созданную страницу Nginx.

Экспорт логов кластера

В kind присутствует функционал для экспорта логов кластера. Для этого достаточно выполнить команду (где valuable-cluster это имя запущенного кластера):

kind export logs --name=valuable-cluster

Лог-файлы будут сохранены в директории /tmp в специальной папке (в данном примере в директории 3791338842):

Логи для нод кластера будут сохранены в отдельных директориях:

Утилита Kind может оказаться полезной для быстрого развертывания готового кластера Kubernetes. Вам потребуется только установить Docker и, при желании, инструмент командной строки kubectl. Kind хорошо подходит для разработчиков, которым необходимо быстро поднять кластер Kubernetes и протестировать свое приложение.


НЛО прилетело и оставило здесь промокод для читателей нашего блога:
-15% на заказ любого VDS (кроме тарифа Прогрев) — HABRFIRSTVDS


ссылка на оригинал статьи https://habr.com/ru/articles/844002/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *