# Пособие для самостоятельного изучения по теме "Kubernetes Intro"
1. Как поставить kubernetes
2. Как пользоваться
3. Основные команды
::: info
**Kubetnetes**(**k8s**) - система для оркестрации, автоматической установки, масштабирования и управления контейнерными средами. Проект с открытым исходным кодом, который располагается [тут](https://github.com/kubernetes/kubernetes).
:::
## Как поставить kubernetes
k8s предоставляется в нескольких вариациях. Установка отличается способом установки и потребляемых ресурсов системы. Раздличают:
- **kubectl** - просто набор команд для командной строки, может быть поставлена отдельно от кластера и остальной системы kubernetes.
- **kind** - позволяет запускать kubernetes на локальной машине.. Единственное усовие для установки это установленный Docker.
- **minikube** - локальный кластер, который можно использовать на одной машине. Используется для изучения функционала k8s и может быть использован для разработки.
- **kubeadm** - инструмент для полуавтоматической установки k8s локально.
::: warning
Рекомендуемое максимальное количество нод в кластере - 50. Большее количество будет вызывать проблемы в конфигурации и управлении.
:::
::: danger
Для практического изучения k8s будем использовать **minikube**.
:::
**Минимальные системные требования для minikube:**
1. 2 ядра процессора
2. 2Гб свободной оперативной памяти
3. 20Гб свободного места на жестком диске
4. Доступ в интернет
5. Установленная среда виртуализации
Скачать соответствующий пакет для используемой операционной системы можно [тут](https://minikube.sigs.k8s.io/docs/start/).
Пример установки для системы macOS:
```
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64
sudo install minikube-darwin-arm64 /usr/local/bin/minikube
```
После выполнения команд нужно запустить команду в терминале:
```
minikube start
```
Далее minikube выполнит все необходимые действия для создания окружения k8s и откроет доступ к готовому кластеру.
Консоль при установке должна выводить аналогичные сообщения:

## Как пользоваться
### Проверка состояния кластера
::: success
Внутри **Kubernetes** всё является объектом. Объекты включаются следующим образом **container->pod->namespace**. Поэтому нужно команды конструировать по отношению к объекту.
:::
Любые команды, которые отправляются в k8s должны быть прописаны через оснастку kubectl. Если она не подтянулась автоматически, можно установить её при помощи команды:
```
minikube kubectl -- get po -A
```
В этом случае скачивание и установка необходимой версии kubectl произойдет автоматически.
Введенная команда должна вывести информацию о том в каком состоянии сейчас находятся ресурсы кластера. Пример вывода команды:

Чтобы посмотреть более подробно на состояние и настройки кластера, можно использовать команду:
```
minikube dashboard
```
После выполнения команды автоматически происходит открытие ссылки на dashboard:

Набор данных пуст, так как это запущенная команда сразу после старта и установки нового кластера.
### Установка нового приложения
У k8s как и у docker есть тестовое приложение, которое можно развернуть для тестирования функциональности. В k8s это приложение **echoserver**.
Чтобы установить приложение ужно запустить следущие команды:
```
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment hello-minikube --type=NodePort --port=8080
minikube service hello-minikube
```
Запущенный сервис будет просто собирать запросы. В логе можно посомтреть обращения к системе. Могут быть пробелмы с работой сетевого интерфейса, обычно решается установкой более новой версии minikube или перезагрузкой системы.
### Дополнительные полезные команды
Попробуем рассмотреть команды, на примере minikube ноды, которые могут понадобиться для полноценного взаимодействия с k8s.
Первой командой получем все ноды:
```
kubectl get nodes
```
Команду выше можно использовать с фильтром по имени ноды:
```
kubectl get nodes node1
```
Чтобы собрать полную информацию по ноде, можно запустить команду:
```
kubectl describe nodes node1
```
::: danger
Информации будет очень много, все они касаются характеристик ноды и её возможностей в кластере.
:::
Чтобы запустить новый pod, в кластере можно пользоваться наименованиями, которые обнаруживаются в реестре image для контейнеров, например в dockerhub:
```
kubectl run devopsrep --image=nginx
```
Теперь иожно получить список всех pod через команду `get`:
```
kubectl get pods
```
Вывод команды будет примерно такой:
```
NAME READY STATUS RESTARTS AGE
devopsrep 1/1 Running 0 57s
```
Удаоение pod выполняется командой:
```
kubectl delete pod devopsrep
```
### Деплой через YAML
kubernetes как и ansible может конфигурироваться чреез yaml файлы. Рассмотрим простой пример. Создадим pod:
```
kubectl run devopsrep --image=nginx
```
Теперь получим данные о конфигурации pod:
```
kubectl get pods devopsrep -o yaml
```
Вывод информации о созданном pod как раз будет в формате yaml. Фрагмент вывода команды:

Ниже приведен пример pos, если бы мы создавали его в системе:
```yaml
# This is an example of a pod
---
apiVersion: v1
kind: Pod
metadata:
name: "devopsrep-pod"
labels:
name: "devopsrep-pod"
spec:
containers:
- image: "nginx:alpine"
name: nginx
```
Кстати, конфигурацию можно задеплоить командой:
```
kubectl apply -f test.yaml
```
Проверить создание pod можно командой:
```
kubectl get pods devopsrep-pod
```
Переконфигурирование pod, который уже был создан возможно проводить через новый файл или видоизмененный исходный. Ниже исправлена строка с наименованием image:
```yaml
# This is an example of a pod
---
apiVersion: v1
kind: Pod
metadata:
name: "devopsrep-pod"
labels:
name: "devopsrep-pod"
spec:
containers:
- image: "nginx:latest"
name: nginx
```
Запустить обновление можно вот так:
```
kubectl apply -f test1.yaml
```
Now, what do we see when we execute the following command?
```
kubectl get pods devopsrep-pod -o yaml
```
Чтобы pod был доступен снаружи в k8s используется понятие service. Это прослойка, которая позволяет получить доступ к данным pod и одновременно с этим прослойка может заниматься задачами балансировки. Изучить этот механизм можно [здесь](https://kubernetes.io/docs/concepts/services-networking/service/).
В качесте самостоятельного задания можно попробовать пробросить порты для того чтобы открыть привествтенную страницу nginx в браузере. (Все нужные команды рассмотрены в документе выше).
### Полезные ссылки
https://kubernetes.io/docs/home/