#3 DevOps. Установка Kubernetes и deploy nginx

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 // сохраним токен

Проверим

https://ip_address:10443

Вставляем токен и логинимся

Полезные команды 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

Посмотрим на наш мониторинг сейчас

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