ПР. Первое приложение в кластере

Кратко:

  • Развертывание приложения - веб-сервера NGINX в кластере Kubernetes с помощью командной строки.
  • Основное средство взаимодействия с кластером - инструмент kubectl.
  • Создание манифеста для описания настроек приложения в кластере.
  • Выполнение манифеста с помощью команды kubectl apply.
  • Получение подробной информации о развернутом приложении с помощью команд kubectl get pods и kubectl describe.
  • Масштабирование приложения с помощью изменения файла манифеста или команды kubectl scale.
  • Управление кластерами Kubernetes в концепции Infrastructure as Code и возможность развертывания с помощью Terraform.

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

На прошлом уроке вы создали в консоли управления Yandex Cloud кластер Kubernetes и группу узлов в нём. Теперь с помощью командной строки вы развернете в кластере приложение — веб-сервер NGINX.
  1. Основное средство взаимодействия с кластером — инструмент kubectl. Установите его по инструкции.
  2. В консоли управления войдите в созданный кластер Managed Service for Kubernetes и нажмите кнопку Подключиться. В открывшемся окне скопируйте команду для подключения:
     yc managed-kubernetes cluster get-credentials \
       --id <идентификатор_кластера> \
       --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/<идентификатор_реестра>/ubuntu-nginx:latest
Рассмотрим, из чего он состоит.
  1. Директива apiVersion определяет, для какой версии Kubernetes написан манифест. От версии к версии обозначение может меняться.
    apiVersion: apps/v1
     
     
  2. Директива kind описывает механизм использования. Она может принимать значения Deployment, Namespace, Service, Pod, LoadBalancer и т. д. Для развёртывания приложения укажите значение Deployment.
    kind: Deployment
     
     
  3. Директива metadata определяет метаданные приложения: имя, метки (labels), аннотации.
    С помощью Меток можно идентифицировать, группировать объекты, выбирать их подмножества. Добавляйте и изменяйте метки при создании объектов или позднее, в любое время.
    Аннотации используют, чтобы добавить собственные метаданные к объектам.
     
     
    Укажем имя приложения:
     metadata:
       name: my-nginx-deployment 
     
  4. В основном блоке 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/<идентификатор_реестра>/ubuntu-nginx:latest" 
     
     
    Настройки манифеста для развёртывания приложения есть в документации Kubernetes.

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

  1. Для создания или обновления ресурсов в кластере используется команда apply. Файл манифеста указывается после флага -f.
    kubectl apply -f <путь_к_файлу_my-nginx.yaml>
     
    Если результат будет успешным, вы увидите сообщение:
    deployment.apps/my-nginx-deployment created
     
  2. Чтобы убедиться, что приложение создано, посмотрите список подов:
    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
       
Если всё получится, в выводе команды kubectl get pods вы увидите сообщение:
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.