Yandex Managed Service for Kubernetes

Создание и подготовка кластера в Yandex облаке.

Документация по быстрому старту Начало работы c Managed Service for Kubernetes.

Необходимые зависимости:

  1. Получаем доступ к панели управления yandex cloud (пример: folder_devops) у руководителя.

  2. Cоздайте сервисные аккаунты:

  1. Перейдите в ваш каталог, затем перейдите в раздел Сервисные аккаунты
  2. Создайте аккаунт с именем по маске <имя проекта>-genesis-editor (пример: my-project-genesis-editor) с ролью editor на каталог, в котором создается кластер. От имени этого сервисного аккаунта будут создаваться ресурсы, необходимые кластеру Managed Service for Kubernetes.
  3. Создайте аккаунт с именем по маске <имя проекта>-genesis-puller с ролью container-registry.images.puller на каталог с реестром Docker-образов. От его имени узлы будут скачивать из реестра необходимые Docker-образы.

Требования к формату имени:

  • Длина — от 3 до 63 символов.
  • Может содержать строчные буквы латинского алфавита, цифры и дефисы.
  • Первый символ — буква. Последний символ — не дефис.
  • Имя сервисного аккаунта должно быть уникальным в рамках облака.

3 Создайте кластер Managed Service for Kubernetes

  1. Сервисный аккаунт для ресурсов — созданный ранее сервисный аккаунт с ролью editor.
  2. Сервисный аккаунт для узлов — созданный ранее сервисный аккаунт с ролями container-registry.images.puller.
  3. Версия Kubernetes1.22.
  4. Публичный адресАвтоматически
  5. Дождитесь статуса Running (около 8 минут)

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

  1. Версия Kubernetes1.22
  2. Тип диска - ssd
  3. Логин и SSH-ключ по инструкции
  4. Дождитесь статуса Running (около 3 минут)

5 Добавьте учетные данные в конфигурационный файл kubectl.

Получаем ID кластера. В панели управления Идентификатор_кластера находится по пути Managed Service for Kubernetes/Кластеры/ваш_кластер -> обзор -> основное -> Идентификатор

Или командой yc managed-kubernetes cluster list в поле ID

yc managed-kubernetes cluster get-credentials --id Идентификатор_кластера --external

Проверка доступности кластера

kubectl cluster-info

6 Делаем бэкап текущего ./kube/config

cp ~/.kube/config ~/.kube/config.bak

7 Создаем манифест gitlab-admin-service-account.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: gitlab-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gitlab-admin-role
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: gitlab-admin
  namespace: kube-system

​ И применяем его

kubectl apply -f gitlab-admin-service-account.yaml

8 Получаем endpoint. Публичный ip адрес находится по пути Managed Service for Kubernetes/Кластеры/ваш_кластер -> обзор -> основное -> Публичный IPv4

9 Получаем KUBE_TOKEN

kubectl -n kube-system get secrets -o json | jq -r '.items[] | select(.metadata.name | startswith("gitlab-admin")) | .data.token' | base64 --decode

10 Генерируем конфиг

export KUBE_URL=https://IP_ИЗ_ПУНКТА_8   # Важно перед IP указать https://
export KUBE_TOKEN=ТОКЕН_ИЗ_ПУНКТА_9
export KUBE_USERNAME=gitlab-admin
export KUBE_CLUSTER_NAME=Идентификатор_КЛАСТЕРА как в пункте_5

kubectl config set-cluster "$KUBE_CLUSTER_NAME" --server="$KUBE_URL" --insecure-skip-tls-verify=true
kubectl config set-credentials "$KUBE_USERNAME" --token="$KUBE_TOKEN"
kubectl config set-context default --cluster="$KUBE_CLUSTER_NAME" --user="$KUBE_USERNAME"
kubectl config use-context default

11 Установка Ingress-контроллера NGINX с менеджером для сертификатов Let's Encrypt.

​ Чтобы с помощью Kubernetes создать Ingress-контроллер NGINX и защитить его сертификатом Let's Encrypt®, выполните следующие действия.

​ - Установите NGINX Ingress Controller

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml

​ Созданный контроллер будет установлен за Yandex Network Load Balancer. Чтобы настроить конфигурацию контроллера самостоятельно, обратитесь к документации Helm и отредактируйте файл values.yaml.

​ - Установите менеджер сертификатов

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.yaml

​ - Убедитесь, что в пространстве имен cert-manager создано три пода с готовностью 1/1 и статусом Running, а в пространстве имен ingress-nginx создано три пода, под controller со статусом Running , поды admission со статусом Completed:

kubectl get pods --all-namespaces --watch

Результат:

NAMESPACE       NAME                                        READY   STATUS      RESTARTS   AGE
cert-manager    cert-manager-55658cdf68-7d6r4               1/1     Running     0          3m50s
cert-manager    cert-manager-cainjector-967788869-8s2pb     1/1     Running     0          3m50s
cert-manager    cert-manager-webhook-6668fbb57d-v5jf2       1/1     Running     0          3m50s
ingress-nginx   ingress-nginx-admission-create--1-526kl     0/1     Completed   0          10m
ingress-nginx   ingress-nginx-admission-patch--1-ld6j5      0/1     Completed   0          10m
ingress-nginx   ingress-nginx-controller-69fbfb4bfd-dfrhp   1/1     Running     0          10m

12 Узнайте IP-адрес Ingress-контроллера (значение в колонке EXTERNAL-IP):

kubectl get svc -n ingress-nginx

Формируем конфигурацию .gitlab-ci.yml и переменную genesis_KUBECONFIG

1. Переменная genesis_KUBECONFIG

Создаем переменную genesis_KUBECONFIG в Variables CI/CD проекта, со значениeм вывода команды kubectl config view --raw --minify.

Пример genesis_KUBECONFIG:

apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://SOME_IP
  name: catu25bs3vb1ev1npf0a
contexts:
- context:
    cluster: catu25bs3vb1ev1npf0a
    user: gitlab-admin
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: gitlab-admin
  user:
    token: SOME_TOKEN 
2. Конфигурация .gitlab-ci.yml

Главным образом необходимо указать HOSTING_PROVIDER: none, CONTAINER_MANAGER: k8s. Подробнее по ссылке

Для настройки домена указываем переменные DOMAIN, DNS_PROVIDER, DNS_TOKEN,SSL, IP_ADDRESS- IP-адрес Ingress-контроллера берем из 12 пункта предыдущего раздела.

Пример:

include:
  - project: 'framework/genesis'
    file: '/genesis.gitlab-ci.yml'

variables:
  VERSION: *.*.*   # Genesis version, вместо *.*.* необходимо подставить последнюю доступную версию/tag,
                     # список тэгов - https://gl.sbdagroup.com/framework/genesis/-/tags
                     # ex: VERSION: 0.0.1

  # These variables must be set in Gitlab -> Settings -> CI/CD -> Variables
  GITLAB_TOKEN: $GITLAB_TOKEN # Gitlab Personal Access Token (with "api" scope),
                              # see: https://gitlab.com/-/profile/personal_access_tokens
                              # required
  HOSTING_PROVIDER: none # Name of the hosting provider
                         # options: SSH (only for one node k8s cluster), DO, none (only for existing k8s cluster))
  CONTAINER_MANAGER: k8s        # Name of the container provider
                            # Options: docker, k8s
                            # required

  # route settings
  # used for route settings
  DOMAIN: genesis-framework.com # Project domain for create dns.
                                # ex: genesis-framework.com.
                                # Template is "SERVICE.BRANCH.DOMAIN"

  #  used for auto settings dns (work only with route settings)
  DNS_PROVIDER: CF  # Name of the dns provider
  DNS_TOKEN: $CLOUDFLARE_TOKEN # DNS access token (for cloudflare (with permissions: ZONE -> DNS -> EDIT && ZONE -> ZONE -> READ))
                               # see: https://dash.cloudflare.com/profile/api-tokens"
                               # required DOMAIN
  IP_ADDRESS: IP-адрес Ingress-контроллера
  SSL: 1  # Using ssl.
          # Options: 0, 1