Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex Managed Service for Kubernetes
  • Сопоставление с другими сервисами Yandex Cloud
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Подключение к узлу по SSH
    • Обновление Kubernetes
    • Настройка автомасштабирования
    • Подключение к кластеру
      • Обзор способов подключения
      • Настройка групп безопасности
      • Создание статического файла конфигурации
    • Установка приложений из Cloud Marketplace
      • Основы работы с Cloud Marketplace
      • Установка Argo CD
      • Установка Container Storage Interface для S3
      • Установка Crossplane
      • Установка External Secrets Operator
      • Установка Falco
      • Установка Filebeat
      • Установка Fluent Bit
      • Установка Gateway API
      • Установка GitLab Agent
      • Установка GitLab Runner
      • Установка HashiCorp Vault
      • Установка Ingress-контроллера Application Load Balancer
      • Установка Jaeger
      • Установка Kyverno & Kyverno Policies
      • Установка Loki
      • Установка Metrics Provider
      • Установка NodeLocal DNS
      • Установка Policy Reporter
      • Установка Thumbor
    • Сетевые сценарии
      • Обеспечение доступа к приложению, запущенному в кластере Kubernetes
      • Настройка контроллера сетевых политик Calico
      • Настройка контроллера сетевых политик Cilium
      • Настройка NodeLocal DNS для контроллера сетевых политик Cilium
    • Работа с постоянными томами
      • Динамическая подготовка тома
      • Статическая подготовка тома
      • Управление классами хранилищ
      • Увеличение размера тома для подов
      • Увеличение размера тома для контроллера StatefulSet
      • Подключение тома в блочном режиме
      • Интеграция с Object Storage
    • Управление кластером Kubernetes
      • Получение информации о кластере Kubernetes
      • Создание кластера Kubernetes
      • Изменение кластера Kubernetes
      • Создание пространства имен в кластере Kubernetes
      • Удаление кластера Kubernetes
    • Управление группой узлов
      • Информация об имеющихся группах узлов
      • Создание группы узлов
      • Подключение к узлу по SSH
      • Настройка автомасштабирования
      • Изменение группы узлов
      • Управление метками узлов кластера Kubernetes
      • Удаление группы узлов
    • Подключение внешних узлов к кластеру
  • Практические руководства
    • Все руководства
    • Создание нового Kubernetes-проекта в Yandex Cloud
    • Интеграция с Container Registry
    • Подпись и проверка Docker-образов Container Registry
    • Сканирование уязвимостей Container Registry при непрерывном развертывании приложений с помощью GitLab
    • Запуск рабочих нагрузок с GPU
    • Установка Ingress-контроллера NGINX с Let's Encrypt®
    • Установка Ingress-контроллера NGINX с сертификатом из Certificate Manager
    • Резервное копирование в Object Storage
    • Горизонтальное масштабирование приложения в кластере
    • Вертикальное масштабирование приложения в кластере
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
    • Работа со снапшотами
    • Интеграция с корпоративной зоной DNS
    • Автоматическое масштабирование DNS по размеру кластера
    • Настройка локального кеширования DNS
    • Проверка DNS Challenge для сертификатов Let's Encrypt®
    • Мониторинг кластера с помощью Prometheus и Grafana
    • Непрерывное развертывание контейнеризованных приложений с помощью GitLab
    • Изменение параметров сервера метрик (Metrics Server)
    • Использование продуктов Cloud Marketplace
      • Интеграция с Argo CD
      • Интеграция с Crossplane
      • Синхронизация с секретами Yandex Lockbox
      • Настройка Fluent Bit для работы с Cloud Logging
      • Настройка Gateway API
      • Настройка Application Load Balancer Ingress-контроллера
      • Использование Jaeger для трассировки запросов в Managed Service for YDB
      • Настройка Kyverno & Kyverno Policies
      • Использование Metrics Provider для трансляции метрик
  • Концепции
    • Взаимосвязь ресурсов сервиса
    • Релизные каналы и обновления
    • Шифрование секретов
    • Использование объектов API Kubernetes
      • Том
      • Сервис
    • Группа узлов
      • Автоматическое масштабирование группы узлов
      • Расселение подов с узла
      • Динамическое резервирование ресурсов для узла
      • Группы узлов с GPU
    • Сеть в Managed Service for Kubernetes
    • Внешние узлы кластера
    • Сетевые настройки и политики кластера
    • Автоматическое масштабирование
    • Квоты и лимиты
    • Рекомендации по использованию Managed Service for Kubernetes
  • Управление доступом
  • Правила тарификации
  • Справочник API
    • Аутентификация в API
    • gRPC (англ.)
      • Overview
      • ClusterService
      • NodeGroupService
      • VersionService
      • OperationService
    • REST (англ.)
      • Overview
      • Cluster
        • Overview
        • create
        • delete
        • get
        • list
        • listNodeGroups
        • listNodes
        • listOperations
        • start
        • stop
        • update
      • NodeGroup
        • Overview
        • create
        • delete
        • get
        • list
        • listNodes
        • listOperations
        • update
      • Version
        • Overview
        • list
  • Вопросы и ответы
    • Общие вопросы
    • Хранилище данных
    • Настройка и обновление
    • Автоматическое масштабирование
    • Ресурсы
    • Логи
    • Все вопросы на одной странице
  1. Практические руководства
  2. Создание нового Kubernetes-проекта в Yandex Cloud

Создание нового Kubernetes-проекта в Yandex Cloud

Статья создана
Yandex Cloud
  • Перед началом работы
    • Создайте сеть и подсеть
    • Зарегистрируйте доменную зону и добавьте сертификат
  • Создайте сервисные аккаунты
    • Сервисный аккаунт для ресурсов
    • Сервисный аккаунт для узлов
    • Сервисный аккаунт, необходимый для работы Application Load Balancer Ingress-контроллера
  • Подготовьте ресурсы Kubernetes
    • Создайте кластер Kubernetes
    • Создайте группу узлов
  • Подготовьте ресурсы Container Registry
    • Создайте реестр
    • Сконфигурируйте Docker Credential helper
    • Подготовьте Docker-образ
    • Запустите тестовое приложение
  • Установите Application Load Balancer
  • Создайте балансировщик нагрузки
  • Удалите созданные ресурсы

В этой статье описан запуск нового Kubernetes-проекта в Yandex Cloud. Приложение из Yandex Container Registry будет развернуто в кластере Managed Service for Kubernetes и опубликовано в интернете через Ingress-контроллер Yandex Application Load Balancer.

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

  1. Создайте сервисные аккаунты.
  2. Подготовьте ресурсы Kubernetes.
  3. Подготовьте ресурсы Container Registry.
  4. Установите Application Load Balancer.
  5. Создайте балансировщик нагрузки.

Если созданные ресурсы вам больше не нужны, удалите их.

Перед началом работы

  1. Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.

    По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

  2. Установите утилиту потоковой обработки JSON-файлов jq:

    sudo apt update && sudo apt install jq
    

Создайте сеть и подсеть

  1. Создайте сеть с именем yc-auto-network:

    yc vpc network create --name yc-auto-network
    
  2. Создайте подсеть в зоне доступности ru-central1-a:

    yc vpc subnet create \
      --name yc-auto-subnet-0 \
      --network-name yc-auto-network \
      --range 192.168.1.0/24 \
      --zone ru-central1-a
    

Зарегистрируйте доменную зону и добавьте сертификат

  1. Зарегистрируйте публичную доменную зону и делегируйте домен.

  2. Если у вас уже есть сертификат для доменной зоны, добавьте сведения о нем в сервис Yandex Certificate Manager.

    Если у вас нет сертификата, создайте новый сертификат от Let's Encrypt®.

  3. Получите идентификатор сертификата:

    yc certificate-manager certificate list
    

    Результат выполнения команды:

    +-----------------+-------+----------------+---------------------+----------+--------+
    |       ID        | NAME  |    DOMAINS     |      NOT AFTER      |   TYPE   | STATUS |
    +-----------------+-------+----------------+---------------------+----------+--------+
    | <идентификатор> | <имя> | <доменное имя> | 2022-04-06 17:19:37 | IMPORTED | ISSUED |
    +-----------------+-------+----------------+---------------------+----------+--------+
    

Создайте сервисные аккаунты

Для работы кластера Kubernetes и балансировщика нагрузки нужны сервисные аккаунты:

  • С ролью editor на каталог, в котором создается кластер Kubernetes. От имени этого сервисного аккаунта будут создаваться ресурсы, необходимые кластеру Kubernetes.
  • С ролью container-registry.images.puller на каталог с реестром Docker-образов. От имени этого сервисного аккаунта узлы будут скачивать из реестра необходимые Docker-образы.
  • Для работы Ingress-контроллера Application Load Balancer, с ролями:
    • alb.editor — для создания необходимых ресурсов.
    • vpc.publicAdmin — для управления внешней связностью.
    • certificate-manager.certificates.downloader — для работы с сертификатами, зарегистрированными в сервисе Certificate Manager.
    • compute.viewer — для использования узлов кластера Kubernetes в целевых группах балансировщика нагрузки.

Сервисный аккаунт для ресурсов

Чтобы создать сервисный аккаунт, от имени которого будут создаваться ресурсы, необходимые кластеру Managed Service for Kubernetes:

  1. Запишите в переменную идентификатор каталога из конфигурации вашего профиля Yandex Cloud CLI:

    Bash
    PowerShell
    FOLDER_ID=$(yc config get folder-id)
    
    $FOLDER_ID = yc config get folder-id
    
  2. Создайте сервисный аккаунт:

    Bash
    PowerShell
    yc iam service-account create --name k8s-res-sa-$FOLDER_ID
    
    yc iam service-account create --name k8s-res-sa-$FOLDER_ID
    
  3. Запишите в переменную идентификатор сервисного аккаунта:

    Bash
    PowerShell
    RES_SA_ID=$(yc iam service-account get --name k8s-res-sa-$FOLDER_ID --format json | jq .id -r)
    
    $RES_SA_ID = (yc iam service-account get --name k8s-res-sa-$FOLDER_ID --format json | ConvertFrom-Json).id
    
  4. Назначьте сервисному аккаунту роль editor на каталог:

    yc resource-manager folder add-access-binding \
      --id $FOLDER_ID \
      --role editor \
      --subject serviceAccount:$RES_SA_ID
    

Сервисный аккаунт для узлов

Чтобы создать сервисный аккаунт, от имени которого узлы будут скачивать из реестра необходимые Docker-образы.

  1. Запишите в переменную идентификатор каталога из конфигурации вашего профиля Yandex Cloud CLI:

    Bash
    PowerShell
    FOLDER_ID=$(yc config get folder-id)
    
    $FOLDER_ID = yc config get folder-id
    
  2. Создайте сервисный аккаунт:

    Bash
    PowerShell
    yc iam service-account create --name k8s-node-sa-$FOLDER_ID
    
    yc iam service-account create --name k8s-node-sa-$FOLDER_ID
    
  3. Запишите в переменную идентификатор сервисного аккаунта:

    Bash
    PowerShell
    NODE_SA_ID=$(yc iam service-account get --name k8s-node-sa-$FOLDER_ID --format json | jq .id -r)
    
    $NODE_SA_ID = (yc iam service-account get --name k8s-node-sa-$FOLDER_ID --format json | ConvertFrom-Json).id
    
  4. Назначьте сервисному аккаунту роль container-registry.images.puller на каталог:

    yc resource-manager folder add-access-binding \
      --id $FOLDER_ID \
      --role container-registry.images.puller \
      --subject serviceAccount:$NODE_SA_ID
    

Сервисный аккаунт, необходимый для работы Application Load Balancer Ingress-контроллера

  1. Запишите в переменную идентификатор каталога из конфигурации вашего профиля Yandex Cloud CLI:

    Bash
    PowerShell
    FOLDER_ID=$(yc config get folder-id)
    
    $FOLDER_ID = yc config get folder-id
    
  2. Создайте сервисный аккаунт:

    Bash
    PowerShell
    yc iam service-account create --name k8s-ic-sa-$FOLDER_ID
    
    yc iam service-account create --name k8s-ic-sa-$FOLDER_ID
    
  3. Запишите в переменную идентификатор сервисного аккаунта:

    Bash
    PowerShell
    IC_SA_ID=$(yc iam service-account get --name k8s-ic-sa-$FOLDER_ID --format json | jq .id -r)
    
    $RES_SA_ID = (yc iam service-account get --name k8s-ic-sa-$FOLDER_ID --format json | ConvertFrom-Json).id
    
  4. Назначьте сервисному аккаунту роли на каталог:

    • alb.editor.
    • vpc.publicAdmin.
    • certificate-manager.certificates.downloader.
    • compute.viewer.
    yc resource-manager folder add-access-binding \
      --id $FOLDER_ID \
      --role alb.editor \
      --role vpc.publicAdmin \
      --role certificate-manager.certificates.downloader \
      --role compute.viewer \
      --subject serviceAccount:$IC_SA_ID
    
  5. Создайте для сервисного аккаунта авторизованный ключ и сохраните в файл sa-key.json:

    yc iam key create \
      --service-account-id $IC_SA_ID \
      --output sa-key.json
    

Подготовьте ресурсы Kubernetes

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

Создайте кластер Kubernetes и укажите ранее созданные сервисные аккаунты в параметрах --service-account-id и --node-service-account-id.

Bash
PowerShell

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

yc managed-kubernetes cluster create \
  --name k8s-demo --network-name yc-auto-network \
  --zone ru-central1-a --subnet-name yc-auto-subnet-0 \
  --public-ip \
  --service-account-id $RES_SA_ID \
  --node-service-account-id $NODE_SA_ID

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

> yc managed-kubernetes cluster create `
  --name k8s-demo --network-name yc-auto-network `
  --zone ru-central1-a --subnet-name yc-auto-subnet-0 `
  --public-ip `
  --service-account-id $RES_SA_ID `
  --node-service-account-id $NODE_SA_ID

Создайте группу узлов

  1. Проверьте, что создание кластера Kubernetes успешно завершено.

    1. В консоли управления выберите каталог, в котором был создан кластер Kubernetes.
    2. В списке сервисов выберите Managed Service for Kubernetes.
    3. Проверьте, что кластер Kubernetes успешно создан:
      • В столбце Статус должно быть указано Running.
      • В столбце Состояние должно быть указано Healthy.
  2. Создайте группу узлов:

    Bash
    PowerShell
    yc managed-kubernetes node-group create \
      --name k8s-demo-ng \
      --cluster-name k8s-demo \
      --platform standard-v3 \
      --public-ip \
      --cores 2 \
      --memory 4 \
      --core-fraction 50 \
      --disk-type network-ssd \
      --fixed-size 2 \
      --location subnet-name=yc-auto-subnet-0,zone=ru-central1-a \
      --async
    
    > yc managed-kubernetes node-group create `
      --name k8s-demo-ng `
      --cluster-name k8s-demo `
      --platform standard-v3 `
      --public-ip `
      --cores 2 `
      --memory 4 `
      --core-fraction 50 `
      --disk-type network-ssd `
      --fixed-size 2 `
      --location subnet-name=yc-auto-subnet-0,zone=ru-central1-a `
      --async
    
  1. Настройте группы безопасности кластера Kubernetes и группы узлов. Группа безопасности группы узлов должна разрешать входящие TCP-соединения к портам 10501 и 10502 из подсетей балансировщика нагрузки или из его группы безопасности (позже подсети и группу нужно будет указать для создания балансировщика).

  2. Убедитесь, что вы можете подключиться к кластеру с помощью kubectl:

    kubectl cluster-info
    

Подготовьте ресурсы Container Registry

Создайте реестр

Создайте реестр контейнеров:

yc container registry create --name yc-auto-cr

Сконфигурируйте Docker Credential helper

Для упрощения аутентификации в Container Registry сконфигурируйте Docker Credential helper. Он позволяет работать с приватными реестрами Yandex Cloud, не выполняя команду docker login.

Для настройки Credential helper выполните команду:

yc container registry configure-docker

Подготовьте Docker-образ

Соберите Docker-образ и загрузите его в реестр.

  1. Создайте Dockerfile hello.dockerfile и сохраните в него следующие строки:

    FROM nginx
    CMD echo "Hi, I'm inside"
    
  2. Соберите Docker-образ.

    1. Получите идентификатор реестра, созданного ранее, и запишите его в переменную:

      Bash
      PowerShell
      REGISTRY_ID=$(yc container registry get --name yc-auto-cr --format json | jq .id -r)
      
      $REGISTRY_ID = (yc container registry get --name yc-auto-cr --format json | ConvertFrom-Json).id
      
    2. Соберите Docker-образ:

      docker build . -f hello.dockerfile -t cr.yandex/$REGISTRY_ID/nginx:hello
      
    3. Загрузите Docker-образ в реестр:

      docker push cr.yandex/$REGISTRY_ID/nginx:hello
      
  3. Проверьте, что Docker-образ загрузился в реестр:

    yc container image list
    

    Результат выполнения команды:

    +----------------------+---------------------+----------------------------+-------+-----------------+
    |          ID          |       CREATED       |            NAME            | TAGS  | COMPRESSED SIZE |
    +----------------------+---------------------+----------------------------+-------+-----------------+
    | crpa2mf008mpjig73rp6 | 2019-11-20 11:52:17 | crp71hkgiolp6677hg9i/nginx | hello | 27.5 MB         |
    +----------------------+---------------------+----------------------------+-------+-----------------+
    

Запустите тестовое приложение

Создайте под с приложением из Docker-образа и убедитесь, что для загрузки Docker-образа не потребовалась дополнительная аутентификация в Container Registry.

  1. Запустите под с приложением из Docker-образа:

    kubectl run --attach hello-nginx --image cr.yandex/$REGISTRY_ID/nginx:hello
    
  2. Убедитесь, что под перешел в состояние Running, и узнайте его полное имя:

    kubectl get pods
    

    Результат выполнения команды:

    NAME                          READY  STATUS   RESTARTS  AGE
    hello-nginx-5847fb96b4-54g48  1/1    Running  0         1h
    
  3. Посмотрите логи контейнера, запущенного на этом поде:

    kubectl logs hello-nginx-5847fb96b4-54g48
    

    Результат выполнения команды:

    Hi, I'm inside
    

    Под загрузил Docker-образ без дополнительной аутентификации на стороне Container Registry.

Установите Application Load Balancer

Чтобы установить Application Load Balancer, воспользуйтесь инструкцией.

Создайте балансировщик нагрузки

  1. Создайте балансировщик нагрузки для сервисов Kubernetes.
    1. Создайте файл ingress.yaml с манифестом Ingress-контроллера:

      ---
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: alb-demo-tls
        annotations:
          ingress.alb.yc.io/subnets: <список идентификаторов подсетей>
          ingress.alb.yc.io/security-groups: <список идентификаторов групп безопасности>
          ingress.alb.yc.io/external-ipv4-address: <auto или статический IP-адрес>
          ingress.alb.yc.io/group-name: <имя Ingress-группы>
      spec:
        tls:
          - hosts:
              - <доменное имя>
            secretName: yc-certmgr-cert-id-<идентификатор TLS-сертификата>
        rules:
          - host: <доменное имя>
            http:
              paths:
                - pathType: Prefix
                  path: "/"
                  backend:
                    service:
                      name: service-hello
                      port:
                        name: http
      ---
      apiVersion: v1
        kind: Service
        metadata:
          name: service-hello
        spec:
          selector:
            run: hello-nginx
          type: NodePort
          ports:
            - name: http
              port: 80
              targetPort: 80
              protocol: TCP
              nodePort: 30080
      

      Где:

      • ingress.alb.yc.io/subnets — укажите одну или несколько подсетей, с которыми будет работать Application Load Balancer.
      • ingress.alb.yc.io/security-groups — укажите одну или несколько групп безопасности для Application Load Balancer. Если параметр не задан, используется группа безопасности по умолчанию. Хотя бы одна из групп безопасности должна разрешать исходящие TCP-соединения к портам 10501 и 10502 в подсети группы узлов или в ее группу безопасности.
      • ingress.alb.yc.io/external-ipv4-address — чтобы получить новый и предоставить публичный доступ к Application Load Balancer из интернета, укажите заранее полученный IP-адрес, либо установите значение auto.
      • ingress.alb.yc.io/group-name — укажите имя группы. Группа объединяет ресурсы Kubernetes Ingress, обслуживаемые отдельным экземпляром Application Load Balancer.
    2. Создайте балансировщик нагрузки:

      kubectl apply -f ingress.yaml
      
    3. Дождитесь создания балансировщика нагрузки и получения им публичного IP-адреса, это может занять несколько минут:

      kubectl get ingress alb-demo-tls
      

      Ожидаемый результат — непустое значение в поле ADDRESS для созданного балансировщика нагрузки:

      NAME          CLASS   HOSTS           ADDRESS     PORTS    AGE
      alb-demo-tls  <none>  <доменное имя>  <IP-адрес>  80, 443  15h
      

      По конфигурации балансировщика нагрузки будет автоматически развернут L7-балансировщик.

  2. Перейдите по ссылке https://<доменное имя> и убедитесь, что ваше приложение успешно опубликовано.

Удалите созданные ресурсы

Если созданные ресурсы вам больше не нужны, удалите их.

  1. Удалите кластер Kubernetes:

    yc managed-kubernetes cluster delete --name k8s-demo
    
  2. Удалите сервисные аккаунты.

    • Удалите сервисный аккаунт для ресурсов:

      yc iam service-account delete --id $RES_SA_ID
      
    • Удалите сервисный аккаунт для узлов:

      yc iam service-account delete --id $NODE_SA_ID
      
    • Удалите сервисный аккаунт для балансировщика нагрузки:

      yc iam service-account delete --id $IC_SA_ID
      
  3. Удалите ресурсы Container Registry.

    1. Узнайте идентификатор Docker-образа, загруженного в реестр:

      Bash
      PowerShell
      IMAGE_ID=$(yc container image list --format json | jq .[0].id -r)
      
      $IMAGE_ID = (yc container image list --format json | ConvertFrom-Json).id
      
    2. Удалите Docker-образ:

      yc container image delete --id $IMAGE_ID
      
    3. Удалите реестр:

      yc container registry delete --name yc-auto-cr
      
  4. Удалите L7-балансировщик нагрузки.

Была ли статья полезна?

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Перед началом работы
  • Создайте сеть и подсеть
  • Зарегистрируйте доменную зону и добавьте сертификат
  • Создайте сервисные аккаунты
  • Сервисный аккаунт для ресурсов
  • Сервисный аккаунт для узлов
  • Сервисный аккаунт, необходимый для работы Application Load Balancer Ingress-контроллера
  • Подготовьте ресурсы Kubernetes
  • Создайте кластер Kubernetes
  • Создайте группу узлов
  • Подготовьте ресурсы Container Registry
  • Создайте реестр
  • Сконфигурируйте Docker Credential helper
  • Подготовьте Docker-образ
  • Запустите тестовое приложение
  • Установите Application Load Balancer
  • Создайте балансировщик нагрузки
  • Удалите созданные ресурсы