Yandex Managed Service for Kubernetes
Создание и подготовка кластера в Yandex облаке.
Документация по быстрому старту Начало работы c Managed Service for Kubernetes.
Необходимые зависимости:
-
Получаем доступ к панели управления yandex cloud (пример: folder_devops) у руководителя.
-
Cоздайте сервисные аккаунты:
- Перейдите в ваш каталог, затем перейдите в раздел Сервисные аккаунты
- Создайте аккаунт с именем по маске <имя проекта>-genesis-editor (пример: my-project-genesis-editor) с ролью editor на каталог, в котором создается кластер. От имени этого сервисного аккаунта будут создаваться ресурсы, необходимые кластеру Managed Service for Kubernetes.
- Создайте аккаунт с именем по маске <имя проекта>-genesis-puller с ролью container-registry.images.puller на каталог с реестром Docker-образов. От его имени узлы будут скачивать из реестра необходимые Docker-образы.
Требования к формату имени:
- Длина — от 3 до 63 символов.
- Может содержать строчные буквы латинского алфавита, цифры и дефисы.
- Первый символ — буква. Последний символ — не дефис.
- Имя сервисного аккаунта должно быть уникальным в рамках облака.
3 Создайте кластер Managed Service for Kubernetes
- Сервисный аккаунт для ресурсов — созданный ранее сервисный аккаунт с ролью
editor
.- Сервисный аккаунт для узлов — созданный ранее сервисный аккаунт с ролями
container-registry.images.puller
.- Версия Kubernetes — 1.22.
- Публичный адрес —
Автоматически
- Дождитесь статуса
Running
(около 8 минут)
4 Создайте группу узлов
- Версия Kubernetes — 1.22
- Тип диска -
ssd
- Логин и SSH-ключ по инструкции
- Дождитесь статуса
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