В этом гайде установим и настроим minikube (однонодовый кластер), для использования в своих домашних экспериментов над кубом. У меня на данный момент установлен ArchLinux, поэтому все командные инструкции будут применимы только к этой системе. В качестве исполняемой среды, я использую libvirt, предварительно нужно установить его, или использовать VirtualBox.

Установка Minikube

В Arch, minikube ставится достаточно просто из под стандартного пакетного менеджера - pacman:

$ pacman -S minikube

После установки нужно проинициализировать и запустить наш mini-кластер:

$ minikube start
---
😄  minikube v1.28.0 on Arch 
✨  Automatically selected the kvm2 driver. Other choices: none, ssh
💾  Downloading driver docker-machine-driver-kvm2:
💿  Downloading VM boot image ...
👍  Starting control plane node minikube in cluster minikube
💾  Downloading Kubernetes v1.25.3 preload ...
🔥  Creating kvm2 VM (CPUs=2, Memory=6000MB, Disk=20000MB) ...
🐳  Preparing Kubernetes v1.25.3 on Docker 20.10.20 ...
🔎  Verifying Kubernetes components...
🌟  Enabled addons: storage-provisioner, default-storageclass
💡  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

В процессе инициализации кластера, в нашем виртуальном окружении автоматически задеплоиться виртуалка, с уже готовым для использования кубом. Убедится в этом можно, если выполнить команду:

$ sudo virsh list
--
 Id   Name       State
--------------------------
 1    minikube   running

Что бы убедится в корректности работы миникуба, можно глянуть его статус.:

$ minikube status
---
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Что бы начать что-то запускать в нашем кластере, можем использовать набор команд начинающиеся: minikube kubectl ....

Установка kubectl

Я для удобства установим утилиту - kubectl, ставится она достаточно просто из под пакетного менеджера для AUR.

$ yay -s kubectl

После установки, чтобы убедится что все работает корректно, запросим у нашего API сервера информацию о кластере, командой:

$ kubectl cluster-info 
---
Kubernetes control plane is running at https://192.168.39.55:8443
CoreDNS is running at https://192.168.39.55:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

Файл с конфигами доступа к кластеру лежит тут (в домашнем каталоге): .kube/config Или можно просто заюзать эту команду:

$ kubectl config view

Запуск приложения

Для запуска можем клонировать исходники приложения из этого репозитория на gitlab - Minikube app, далее собираем docker-образ.

$ sudo docker build -t minicube-app:v1 .

Тут важно отметить, что если мы образ собираем на нашей хост машине, то minikube не сможет стянуть его. Поэтому собираем образ внутри виртуальной машины или же пушим реджистри. Я решил идти первым способом, для этого подключаюсь через консоль к виртуальной машине - minikube:

tony@i3Arch:~/Documents/minicube-hello-server-app(main○) » sudo virsh console minikube
--
Connected to domain 'minikube'
minikube login: docker
Password: tcuser
                         _             _            
            _         _ ( )           ( )           
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __  
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

$ 

Для доступа логин - docker, пароль - tcuser. И соответственно внутри виртуальной машины собираем образ прилы.

Можем перейти к запуску приложения в minikube. Создаем новый deployment. Это такая абстракция k8s, в которой мы описываем желаемое состояние нашего нашего пода. Под (Pod) - еще одна абстракция k8s, это набор из контейнеров связанный друг с другом. Для создания нового деплоймента воспользуемся утилитой kubectl:

$ kubectl create deployment node-app-server --image minicube-app:v1
---
deployment.apps/node-app-server created

Для просмотра списка деплойментов, вызываем:

$ kubectl get deployment
---
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
node-app-server   0/1     1            0           98s

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

$ kubectl get pod
---
NAME                               READY   STATUS    RESTARTS   AGE
node-app-server-7bf6b4f9bd-2cbt8   1/1     Running   0          9s

В данный момент наше приложение доступно только из внутренней сети кластера. Что бы опубликовать контейнер вне сети кластера, нужно создать service еще одна абстракция. Она используется для того, что бы предоставить наше приложение к качестве сетевой службы.

$ kubectl expose deployment node-app-server --type=LoadBalancer --port=8080
---
service/node-app-server exposed

Вывод, списка сервисов:

$ kubectl get service
---
NAME              TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes        ClusterIP      10.96.0.1      <none>        443/TCP          175m
node-app-server   LoadBalancer   10.96.54.107   <pending>     8080:32418/TCP   54s

Для просмотра url нашего сервиса, команда:

$ minikube service node-app-server --url   
---
http://192.168.39.55:32418

В браузере открываем url, и видим: Image alt

На этом опыт можно считать успешным, и чтобы развалить(выключить) наш кластер юзаем:

$ minikube stop 
---         
✋  Stopping node "minikube"  ...
🛑  1 node stopped.