0

practicum

Практическая работа. Первое приложение в кластере

26.04.2022

На прошлом уроке вы создали в веб-интерфейсе Yandex.Cloud кластер Kubernetes® и группу узлов в нём. Теперь с помощью командной строки вы развернёте в кластере приложение: веб-сервер nginx.

  1. Основное средство взаимодействия с кластером — инструмент kubectl. Установите его по инструкции.
  2. В веб-консоли Managed Service for Kubernetes войдите в созданный кластер и нажмите кнопку Подключиться. В открывшемся окне скопируйте команду для подключения:
yc managed-kubernetes cluster get-credentials --id cat2oek6hbp7mnhhhr4m --external 

Чтобы проверить правильность установки и подключения, посмотрите на конфигурацию:

kubectl config view 

Ответ получится примерно таким (IP-адрес сервера и название кластера будут отличаться):

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://178.154.206.242
  name: yc-managed-k8s-cat2oek6hbp7mnhhhr4m
contexts:
... 

Создание манифеста

Для описания настроек приложения в кластере создадим файл my-nginx.yaml. Такой файл называется манифестом.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: cr.yandex/crpv7tlcpgb30qpgkiij/ubuntu-nginx:latest 

Рассмотрим, из чего он состоит.

  1. Директива apiVersion определяет, для какой версии Kubernetes написан манифест. От версии к версии обозначение может меняться.
apiVersion: apps/v1 
  1. Директива kind описывает механизм использования. Она может принимать значения Deployment, Namespace, Service, Pod, LoadBalancer и т. д. Для развёртывания приложения укажите значение Deployment.
kind: Deployment 
  1. Директива metadata определяет метаданные приложения: имя, метки (labels), аннотации.

С помощью Меток можно идентифицировать, группировать объекты, выбирать их подмножества. Добавляйте и изменяйте метки при создании объектов или позднее, в любое время.Аннотации используют, чтобы добавить собственные метаданные к объектам.Укажем имя приложения:

metadata:
  name: my-nginx-deployment 
  1. В основном блоке spec содержится описание объектов Kubernetes.

Директива replicas определяет масштабирование. Для первого запуска укажите, что приложению нужен один под. Позже вы посмотрите, как приложения масштабируются, и сможете увеличить число подов.Директива selector определяет, какими подами будет управлять контейнер (подробнее о ней можно прочитать в документации). Поды отбираются с помощью метки (label).Директива template определяет шаблон пода. Метка в шаблоне должна совпадать с меткой селектора — nginx.В шаблоне содержится ещё одна, собственная директива spec: она задаёт настройки контейнеров, которые будет развёрнуты на поде. Нам нужен один контейнер. Используйте для него образ, созданный ранее с помощью Docker и помещённый в реестр Yandex Container Registry.

spec: 
  matchLabels: 
    app: nginx
  replicas: 1
  selector: ~
  template: 
    metadata: 
      labels: 
        app: nginx
    spec: 
      containers: 
        - name: nginx
          image: "cr.yandex/crpv7tlcpgb30qpgkiij/ubuntu-nginx:latest" 

Настройки манифеста для развёртывания приложения есть в документации Kubernetes.

Выполнение манифеста

  1. Для создания или обновления ресурсов в кластере используется команда apply. Файл манифеста указывается после флага -f.
kubectl apply -f my-nginx.yaml 

Если результат будет успешным, вы увидите сообщение:

deployment.apps/my-nginx-deployment created 
  1. Чтобы убедиться, что приложение создано, посмотрите список подов:
kubectl get pods 

Дождитесь статуса Running:

NAME                                   READY   STATUS    RESTARTS   AGE
my-nginx-deployment-65b9b678b6-zmfww   1/1     Running   0          5m27s 

Теперь получите более подробную информацию, выполнив ту же команду с флагом -o wide:

kubectl get pods -o wide 

Вы увидите внутренний IP-адрес, который присвоен поду. Это пригодится, если нужно узнать, где именно развёрнуто приложение.Чтобы получить максимально подробную информацию о запущенном приложении, используйте команду describe:

kubectl describe deployment/my-nginx-deployment 

Масштабирование

  1. Теперь увеличьте количество подов. Вручную это можно сделать двумя способами:
  • изменить файл манифеста, указав в директиве replicas нужное число подов, и снова выполнить команду apply;
  • если файла манифеста нет под рукой — использовать команду scale:
kubectl scale --replicas=3 deployment/my-nginx-deployment 

Если всё получится, вы увидите сообщение:

NAME                                   READY   STATUS    RESTARTS   AGE
my-nginx-deployment-65b9b678b6-6whpp   1/1     Running   0          117s
my-nginx-deployment-65b9b678b6-wtph9   1/1     Running   0          117s
my-nginx-deployment-65b9b678b6-zmfww   1/1     Running   0          14m 

На следующей практической работе мы посмотрим, как обращаться извне к кластеру Kubernetes и развёрнутому в нём приложению.

Кластер как код

Как видите, управление кластерами Kubernetes отлично вписывается в концепцию Infrastructure as Code: вы можете описать конфигурацию кластера в текстовом файле — манифесте. Вы также можете разворачивать кластеры Kubernetes с помощью Terraform.

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380