В этом гайде установим и настроим 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, и видим:
На этом опыт можно считать успешным, и чтобы развалить(выключить) наш кластер юзаем:
$ minikube stop
---
✋ Stopping node "minikube" ...
🛑 1 node stopped.