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

в 9:55, , рубрики: calico, calico cni, kind, kubernetes, развертывание, установка, утилита
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 1

Чтобы развернуть готовый кластер 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
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 2
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 3

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

chmod +x ./kind

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

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

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

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

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

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

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

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

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

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

kind create cluster --image=kindest/node:v1.31.0 --name=my-first-cluster
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 6

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

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

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

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

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

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

Ранее мы создали кластер, состоящий только из одной 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
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 9

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

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

Кластер, состоящий из 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
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 11

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

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

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

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

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

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

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

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

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

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

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

kind delete cluster --name=test-first-cluster
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 15

Если при создании кластера вы не задали имя, то по умолчанию кластер будет создан с именем 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
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 16

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

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

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

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

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/calico.yaml
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 18

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

watch kubectl get pods -l k8s-app=calico-node -A
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 19

Как можно увидеть на скриншоте выше, 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
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 20

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

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

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 .
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 22

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
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 23

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

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

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

kubectl port-forward service/test-nginx-service 32700:80
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 25

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

curl -i localhost:32700
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 26

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

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

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

kind export logs --name=valuable-cluster
Как установить и использовать кластер Kubernetes при помощи утилиты kind - 27

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

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

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

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

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


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

Автор: 1shaman

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js