Kubernetes — это open-source платформа контейнерной оркестрации.
Преимущества:
High Availability (HA) — высокая доступность приложения,
запущенного в нескольких экземплярах
Scalability — масштабируемость за счёт быстроты развёртывания
контейнеров при увеличении нагрузки
Disaster Recovery (DR) — отказоустойчивость за счёт распределённого
количества серверов кластера
В файле config стоит обратить внимание на:
clusters
Информация о кластерах, включая сертификаты доступа к кластеру
users
Информация о пользователях, включая сертификаты доступа
contexts
Это сочетание cluster, user и namespace
Кластер состоит минимум из одной ноды, но для отказоустойчивости, как правило из нескольких.
Нода (узел) — bare metal или виртуальная машина, на которой запускаются контейнеры с приложениями. Узел содержит сервисы, которые нужны для запуска подов.
Master node — управляет кластером, следит за другими нодами, распределяет нагрузку. Для отказоустойчивости запускают несколько мастер нод.
Worker node — на ней работают контейнеры.
Nodes — машины в кластере K8s.
Pods — группа контейнеров с общими разделами, которые запускаются как одно приложение.
Replication Controllers способ репликации, который гарантирует, что определенное количество «реплик» будут запущены в любой момент времени.
Services — набор логически объединенных подов и политик доступа.
Volumes — доступная в контейнере директория с данными или без них.
Labels — пары ключ/значение, которые прикрепляются к объектам. Например, к подам. Labels могут применяться для создания и выбора наборов объектов.
Операторы — ПО Kubernetes, необходимое для включения в кластер сервисов, сохраняющих состояние между выполнениями (stateful). Например, СУБД.
Kubectl — интерфейс командной строки для управления Kubernetes.
Установим и настроим Kubernetes и kubectl
sudo apt update
sudo apt install snapd
sudo snap install microk8s --classic
sudo usermod -a -G microk8s devops // добавляем локального пользователя в группу
sudo chown -f -R $USER ~/.kube // изменяем права на папку с конфигурацией
sudo curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
sudo chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
sudo echo "source <(kubectl completion bash)" >> ~/.bashrc // добавим автодополнение в командную оболочку bash
su - $USER // перелогинимся
microk8s enable dashboard
nano /var/snap/microk8s/current/certs/csr.conf.template
# [ alt_names ]
# Add
# IP.3 = 192.168.6.238
sudo microk8s refresh-certs --cert front-proxy-client.crt
microk8s config > ~/.kube/config
cat ~/.kube/config
microk8s.kubectl port-forward -n kube-system service/kubernetes-dashboard 10443:443 --address 0.0.0.0
microk8s kubectl create token default // сохраним токен
Проверим
Вставляем токен и логинимся

Полезные команды microk8s
microk8s status --wait-ready // проверить статус
microk8s kubectl get nodes // подключиться к microK8s и получить информацию
microk8s status // список addon
microk8s enable // включить addon
microk8s config // вывод конфигурации
microk8s kubectl port-forward -n kube-system service/kubernetes-dashboard 10443:443 // проброс порта для подключения локально
Полезные команды Kubernetes
Список кластеров
kubectl config get-clusters
Список пользователей
kubectl config get-users
Список контекстов
kubectl config get-contexts
Текущий контекст
kubectl config current-context
Переключение текущего контекста
kubectl config use-context name
Установка доступов
kubectl config set-credentials
Получение информации о всех нодах кластера
kubectl get nodes
Получение дополнительной информации о всех нодах кластера
kubectl get nodes -o wide
Получение детальной информации о конкретной ноде
kubectl describe nodes node_name
microk8s stop
microk8s start
В качестве бонуса рассмотрим deploy реального приложения на примере nginx. Мы пока не делим кластер на master и worker, а запускаем все на одной машине, просто для примера.
kubectl run nginx --image=nginx:latest --port=80
Ждем пока запустится
kubectl port-forward nginx --address 0.0.0.0 8888:80
Проверяем
ip_address:8888

Далее заменим страницу на свою
nano index.html
<h1>Hello from devopslife.ru</h1>
kubectl get pods
kubectl cp index.html nginx:/usr/share/nginx/html // скопируем наш файл
Проверяем еще раз

Посмотрим наш dashboard


Посмотрим дополнительную информацию и удалим под
kubectl describe pods nginx
kubectl logs nginx
kubectl delete pods nginx
На проде запуск осуществляются с помощью манифестов. Рассмотрим самый простой
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
nano nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
kubectl apply -f nginx-service.yaml
kubectl get svc nginx
Проверяем
ip_address:port
В моем случае это 192.168.6.238:30444
Видим стандартную страницу nginx
Посмотрим на наш мониторинг сейчас

На настоящем проде все намного масштабнее и сложнее, мы для примера рассмотрели самый простой вариант