VK Cloud logo

Быстрый старт

Быстрый старт поможет вам начать работу с сервисом и познакомиться с его возможностями.

Пройдя все шаги быстрого старта, вы:

  1. Создадите небольшой кластер Kubernetes.
  2. Научитесь подключаться к нему.
  3. Познакомитесь с Kubernetes и аддонами для него:
    1. Подключите инструменты для управления и мониторинга.
    2. Загрузите Docker-образы в реестр Docker.
    3. Развернете простые приложения на основе загруженных образов, с возможностью использовать хранилище VK Cloud.
    4. Предоставите доступ к развернутым приложениям с помощью Ingress-контроллера.
    5. Убедитесь, что эти приложения действительно работают.

Работающий кластер Kubernetes потребляет вычислительные ресурсы.

После прохождения быстрого старта остановите или удалите кластер, если он вам больше не нужен.

1. Подготовительные шаги

1.1. Создайте кластер

  1. Перейдите в личный кабинет VK Cloud.

  2. Выберите проект, где будет размещен кластер.

  3. Выберите регион Москва.

  4. Перейдите в раздел КонтейнерыКластеры Kubernetes.

  5. Если в выбранном регионе пока нет ни одного кластера, нажмите кнопку Создать кластер.

    Иначе нажмите кнопку Добавить.

  6. На шаге «Конфигурация»:

    1. Выберите конфигурацию кластера Dev-среда с самой новой версией Kubernetes.

      Обратите внимание на выбранную версию Kubernetes. Это важно при дальнейшей установке kubectl.

    2. Нажмите кнопку Следующий шаг.

  7. На шаге «Создание кластера» задайте:

    1. Имя кластера: например, vk-cloud-k8s-quickstart.

    2. Тип виртуальной машины Master: Standard-2-8.

    3. Зона доступности: Москва (MS1).

      Конфигурационные файлы для создания и настройки ресурсов в кластере рассчитаны на использование именно этой зоны.

      При выборе другой зоны скорректируйте конфигурационные файлы.

    4. Сеть: Создать новую сеть.

    5. Назначить внешний IP: убедитесь, что эта опция выбрана.

    6. Другие настройки оставьте без изменений.

    7. Нажмите кнопку Следующий шаг.

  8. На шаге «Группы узлов» задайте:

    1. Тип Node-узлов: Standard-4-4.

    2. Зона доступности: Москва (MS1).

      Конфигурационные файлы для создания и настройки ресурсов в кластере рассчитаны на использование именно этой зоны.

      При выборе другой зоны скорректируйте конфигурационные файлы.

    3. Другие настройки оставьте без изменений.

    4. Нажмите кнопку Создать кластер.

Дождитесь завершения создания кластера, этот процесс может занять длительное время.

1.2. Установите аддоны в кластер

При установке аддонов Docker Registry и Ingress NGINX для них будут созданы стандартные балансировщики нагрузки.

Использование балансировщиков тарифицируется.

  1. Установите аддон docker-registry.

    Запишите данные для доступа к реестру Docker.

  2. Установите аддон kube-prometheus-stack.

    Запишите пароль для доступа к веб-интерфейсу Grafana.

  3. Установите аддон ingress-nginx с параметрами по умолчанию.

    Запишите плавающий IP-адрес для балансировщика нагрузки.

Далее в командах и конфигурационных файлах для примера будут использоваться следующие значения. Замените их на актуальные для вас.

ПараметрЗначение
IP-адрес балансировщика нагрузки
для Ingress-контроллера
192.0.2.2
URL эндпоинта реестра Docker
192.0.2.22:5000
Логин пользователя реестра Docker
registry
Пароль пользователя реестра Docker
registry-password-123456
Пароль пользователя admin для Grafana
grafana-password-123456

1.3. Настройте окружение для работы с кластером

Настройте хост, с которого вы будете работать с кластером. Это может быть как реальный компьютер, так и виртуальная машина.

Установите на хост следующие инструменты:

1.4. Подключитесь к кластеру

  1. Добавьте в личном кабинете роль Администратор Kubernetes для пользователя, от имени которого будет выполняться подключение к кластеру:

    1. Перейдите в личный кабинет VK Cloud.
    2. Выберите проект и регион, где находится созданный ранее кластер.
    3. Перейдите в раздел Управление доступами.
    4. Раскройте меню нужного пользователя и выберите пункт Редактировать.
    5. Выберите роль Администратор Kubernetes из выпадающего списка.
    6. Сохраните изменения.
  2. Активируйте доступ по API для этого пользователя.

  3. Получите kubeconfig для кластера в личном кабинете VK Cloud:

    1. Перейдите в раздел Контейнеры → Кластеры Kubernetes.
    2. Найдите в списке нужный кластер, затем в его меню выберите пункт Получить Kubeconfig для доступа к кластеру.
  4. Переместите kubeconfig в директорию ~/.kube, чтобы при использовании kubectl не указывать дополнительные аргументы.

    В приведенных ниже командах предполагается, что kubeconfig был загружен в директорию ~/Downloads под именем mycluster_kubeconfig.yaml.

    1mkdir ~/.kube && \
    2mv ~/Downloads/mycluster_kubeconfig.yaml ~/.kube/config
  5. Проверьте, что kubectl может подключиться к кластеру:

    1. Выполните команду:

      kubectl cluster-info
    2. Введите пароль пользователя от личного кабинета VK Cloud.

    Если кластер работает нормально и kubectl настроен на работу с ним, будет выведена похожая информация:

    1Kubernetes control plane is running at...
    2CoreDNS is running at...
    3
    4To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
    

2. Получите доступ к средствам мониторинга кластера

В кластере был установлен аддон со средствами мониторинга на базе Prometheus и Grafana. Также для всех кластеров Kubernetes VK Cloud доступен Kubernetes Dashboard, который позволяет не только управлять кластером, но и осуществлять его мониторинг.

  1. В отдельной сессии терминала выполните команду:

    kubectl -n prometheus-monitoring port-forward service/kube-prometheus-stack-grafana 8001:80
    
    • Не закрывайте эту сессию, иначе доступ к веб-интерфейсу Grafana пропадет.
    • Если порт 8001 уже используется другим приложением, скорректируйте команду, указав свободный порт.
  2. Откройте веб-интерфейс Grafana:

    1. В браузере перейдите по URL http://127.0.0.1:8001/.
    2. Авторизуйтесь с помощью пары логин/пароль admin/grafana-password-123456.
    3. Если будет запрошена смена пароля, смените его.
  3. Выберите в боковом меню Dashboards → Browse любой преднастроенный дашборд для получения информации о ресурсах кластера.

3. Загрузите нужные образы в реестр Docker

В кластере был установлен аддон реестра Docker, в котором будут храниться Docker-образы.

Чтобы наиболее полно продемонстрировать возможности кластера, далее будет собран особый Docker-образ с веб-сервером NGINX. Образ основан на plaintext-версии демо-образа от NGINX.

Чтобы поместить собственные образы в реестр Docker кластера:

  1. Добавьте реестр Docker в список доверенных реестров:

    1. Добавьте в конфигурационный файл Docker daemon.json следующий параметр c URL эндпоинта реестра Docker:

      1{
      2  ...
      3
      4  "insecure-registries": [
      5    "192.0.2.22:5000"
      6  ],
      7
      8  ...
      9}

      Расположение этого файла для разных инсталляций Docker Engine приведено в официальной документации Docker.

    2. Перезапустите Docker Engine.

      Выполните одно из следующих действий:

      • Используйте одну из команд для перезапуска:

        sudo systemd restart docker
        sudo service docker restart
      • Перезапустите Docker Engine из графического интерфейса Docker Desktop (если он установлен).

  2. Соберите Docker-образ:

    1. Создайте директорию для файлов и перейдите в нее:

      mkdir ~/image-build && cd ~/image-build
    2. Поместите в эту директорию следующие файлы:

      Dockerfile
      1FROM nginx:mainline-alpine
      2
      3RUN chmod -R a+w /var/cache/nginx/ \
      4        && touch /var/run/nginx.pid \
      5        && chmod a+w /var/run/nginx.pid \
      6        && rm /etc/nginx/conf.d/*
      7
      8COPY nginx-config.conf /etc/nginx/conf.d/
      9USER nginx
      
      nginx-config.conf
      1server {
      2    listen 8080;
      3
      4    location / {
      5
      6        set $k8s_pv "not present";
      7
      8        if (-d /etc/nginx/k8s_demo_pv/) {
      9          set $k8s_pv "present";
      10        }
      11
      12        default_type text/plain;
      13        expires -1;
      14        return 200 'Server address: $server_addr:$server_port\nServer name: $hostname\nDate: $time_local\nURI: $request_uri\nRequest ID: $request_id\nRemote address (NGINX Ingress Controller): $remote_addr\nX-Forwarded-For (Request source): $http_x_forwarded_for\n\nK8S Persistent Volume status: $k8s_pv\n';
      15    }
      16}
      
    3. Запустите сборку образа:

      docker build . -t 192.0.2.22:5000/nginx-k8s-demo:latest

    Дождитесь завершения сборки образа.

  3. Разместите собранный образ в реестре Docker:

    1. Выполните вход в реестр:

      docker login 192.0.2.22:5000 --username registry --password registry-password-123456
    2. Запушьте образ в реестр:

      docker push 192.0.2.22:5000/nginx-k8s-demo:latest
    3. Проверьте, что образ находится в реестре:

      curl -k -X GET -u registry:registry-password-123456 https://192.0.2.22:5000/v2/_catalog

      Должна быть выведена похожая информация:

      {"repositories":["nginx-k8s-demo"]}
    4. Создайте секрет Kubernetes, чтобы можно было получить доступ к загруженному образу из Kubernetes:

      kubectl create secret docker-registry k8s-registry-creds --docker-server=192.0.2.22:5000 --docker-username=registry --docker-password=registry-password-123456

4. Разверните демо-приложения

На основе загруженного в реестр Docker образа nginx-k8s-demo будет развернуто два приложения: tea и coffee. Для каждого из приложений будут созданы:

  • Persistent Volume Claim, чтобы внутрь приложения можно было монтировать тома с данными.
  • Deployment, в котором будут заданы:
    • Количество реплик.
    • Том для монтирования в под.
  • Service для обеспечения доступа к приложению. В дальнейшем Ingress-контроллер будет пересылать входящие запросы к этому Service.

Чтобы развернуть приложения:

  1. Создайте директорию для файлов и перейдите в нее:

    mkdir ~/k8s-deployments && cd ~/k8s-deployments
  2. Поместите в эту директорию следующие файлы:

    deploy-coffee.yaml
    1kind: PersistentVolumeClaim
    2apiVersion: v1
    3metadata:
    4  name: k8s-demo-pvc-coffee
    5spec:
    6  storageClassName: "csi-ceph-hdd-ms1"
    7  accessModes:
    8    - ReadWriteOnce
    9  resources:
    10    requests:
    11      storage: 1Gi
    12
    13---
    14apiVersion: apps/v1
    15kind: Deployment
    16metadata:
    17  name: coffee
    18spec:
    19  replicas: 3
    20  selector:
    21    matchLabels:
    22      app: coffee
    23  template:
    24    metadata:
    25      labels:
    26        app: coffee
    27    spec:
    28      volumes:
    29        - name: k8s-pv-coffee
    30          persistentVolumeClaim:
    31            claimName: k8s-demo-pvc-coffee
    32      imagePullSecrets:
    33        - name: k8s-registry-creds
    34      containers:
    35        - name: coffee
    36          image: 192.0.2.22:5000/nginx-k8s-demo:latest
    37          imagePullPolicy: Always
    38          ports:
    39            - containerPort: 8080
    40          volumeMounts:
    41            - name: k8s-pv-coffee
    42              mountPath: /etc/nginx/k8s_demo_pv
    43
    44---
    45apiVersion: v1
    46kind: Service
    47metadata:
    48  name: coffee-svc
    49spec:
    50  ports:
    51    - port: 80
    52      targetPort: 8080
    53      protocol: TCP
    54      name: http
    55  selector:
    56    app: coffee
    deploy-tea.yaml
    1kind: PersistentVolumeClaim
    2apiVersion: v1
    3metadata:
    4  name: k8s-demo-pvc-tea
    5spec:
    6  storageClassName: "csi-ceph-hdd-ms1"
    7  accessModes:
    8    - ReadWriteOnce
    9  resources:
    10    requests:
    11      storage: 1Gi
    12
    13---
    14apiVersion: apps/v1
    15kind: Deployment
    16metadata:
    17  name: tea
    18spec:
    19  replicas: 2
    20  selector:
    21    matchLabels:
    22      app: tea
    23  template:
    24    metadata:
    25      labels:
    26        app: tea
    27    spec:
    28      volumes:
    29        - name: k8s-pv-tea
    30          persistentVolumeClaim:
    31            claimName: k8s-demo-pvc-tea
    32      imagePullSecrets:
    33        - name: k8s-registry-creds
    34      containers:
    35        - name: tea
    36          image: 192.0.2.22:5000/nginx-k8s-demo:latest
    37          imagePullPolicy: Always
    38          ports:
    39            - containerPort: 8080
    40          volumeMounts:
    41            - name: k8s-pv-tea
    42              mountPath: /etc/nginx/k8s_demo_pv
    43
    44---
    45apiVersion: v1
    46kind: Service
    47metadata:
    48  name: tea-svc
    49spec:
    50  ports:
    51    - port: 80
    52      targetPort: 8080
    53      protocol: TCP
    54      name: http
    55  selector:
    56    app: tea

    Обратите внимание, что в конфигурационных файлах deploy-coffee.yaml и deploy-tea.yaml для Persistent Volume Claim указывается класс хранения, соответствующий зоне доступности узла (MS1), на котором планируется развернуть приложения.

    Попытка разместить на узле в одной зоне доступности приложение, к которому примонтирован том из другой зоны доступности, завершится неудачей.

  3. Разверните приложения:

    kubectl apply -f deploy-coffee.yaml -f deploy-tea.yaml
  4. Проверьте корректность развертывания:

    Воспользуйтесь одним из способов:

    • kubectl: выполните команду.

      kubectl get pv
    • Grafana: откройте дашборд Kubernetes → Compute Resources → Persistent Volumes.

    • Kubernetes Dashboard: откройте дашборд Cluster → Persistent Volumes.

    Будет видна информация о том, что присутствуют постоянные тома объемом 1 ГБ, созданные при помощи Persistent Volume Claim для deployments tea и coffee.

5. Настройте Ingress для демо-приложений

В кластере был установлен аддон Ingress-контроллера NGINX, позволяющий маршрутизировать входящие запросы пользователей к развернутым в кластере приложениям.

Чтобы Ingress-контроллер маршрутизировал запросы к соответствующим ресурсам Service, через которые опубликованы демо-приложения tea и coffee:

  1. Поместите в директорию ~/k8s-deployments следующий файл:

    deploy-ingress.yaml
    1apiVersion: networking.k8s.io/v1
    2kind: Ingress
    3metadata:
    4  name: cafe-ingress
    5spec:
    6  ingressClassName: nginx
    7  rules:
    8    - host: cafe.example.com
    9      http:
    10        paths:
    11          - path: /tea
    12            pathType: Prefix
    13            backend:
    14              service:
    15                name: tea-svc
    16                port:
    17                  number: 80
    18          - path: /coffee
    19            pathType: Prefix
    20            backend:
    21              service:
    22                name: coffee-svc
    23                port:
    24                  number: 80
  2. Разверните ресурс Ingress:

    kubectl apply -f deploy-ingress.yaml
  3. Проверьте корректность развертывания с помощью kubectl, выполнив команду:

    kubectl get ingress

    Будет видна информация о том, что есть работающий ресурс Ingress.

6. Проверьте работоспособность всех созданных ресурсов в кластере

Чтобы проверить работоспособность примера, выполните с помощью curl запросы к IP-адресу 192.0.2.2 балансировщика нагрузки. Связанный с балансировщиком Ingress-контроллер затем доставит эти запросы нужным приложениям.

Запросы:

curl --resolve cafe.example.com:80:192.0.2.2 http://cafe.example.com/tea

Должна быть выведена похожая информация:

1Server address: 10.100.109.3:8080
2Server name: tea-8697dc7b86-s5vgn
3Date: 24/Aug/2022:09:27:34 +0000
4URI: /tea
5Request ID: ed83bd555afd25c103bfa05ee12cbfff
6Remote address (NGINX Ingress Controller): <IP-адрес Ingress-контроллера>
7X-Forwarded-For (Request source): <IP-адрес хоста, с которого выполнялся запрос>
8
9K8S Persistent Volume status: present

Такой результат демонстрирует, что:

  1. Можно запускать приложения, использующие Docker-образы из кластерного реестра Docker.
  2. Можно монтировать хранилище VK Cloud к подам с помощью Persistent Volume Claim.
  3. Предоставляемый с кластером Ingress-контроллер настроен корректно, т. к. показывает реальный IP-адрес источника запроса.

Проконтролируйте использование ресурсов

Работающий кластер потребляет вычислительные ресурсы. Если он вам больше не нужен:

Что дальше?