Создание неймспейса из pipeline GitLab
Создание Service Account в кластере
Для создания Service Account в кластере нужно выполнить следующие шаги:
- в неймспейсе default кластера создать Service Account с именем name-service-account:
kubectl apply -f ‒ <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: name-service-account
namespace: default
> EOF
- создать кластерную роль с необходимыми для выполнения действий правами, например:
kubectl apply -f ‒ <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: special-sa-role
rules:
- apiGroups:
‒ "
resources:
‒ "namespaces"
verbs:
‒ "get"
‒ "create"
‒ "list"
> EOF
- связать созданную ClusterRole с Service Account, создав ClusterRoleBinding в кластере:
kubectl apply -f ‒ <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: special-sa-rolebinding
subjects:
kind: ServiceAccount
name: name-service-account
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: special-sa-role
> EOF
- создать секрет secret-sa в кластере для Service Account, указав:
- название неймспейса default;
- имя Service Account, созданного на первом шаге ‒ name-service-account;
- тип секрета kubernetes.io/service-account-token/.
Команда:
kubectl apply -f ‒ <<EOF apiVersion: v1 kind: Secret metadata: name: secret-sa namespace: default annotations: kubernetes.io/service-account.name: name-service-account type: kubernetes.io/service-account-token > EOF
- добавить созданный секрет secret-sa в Service Account:
kubectl edit sa name-service-account
Пример Service Account:
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2024-12-11T05:14:47Z"
name: name-service-account
namespace: default
resourceVersion: "586818"
uid: cd32a856-76d9-472d-9345-1fe8a755be3f
secrets:
- name: secret-sa
- определить индекс секрета в Service Account, выполнив:
kubectl get serviceaccount name-service-account --context username@shturval-clustername --namespace default -o json
где вместо username@shturval-clustername указать необходимый контекст кластера. Команда получения списка контекстов доступных кластеров:
kubectl config get-contexts
Пример ответа:
...
"secrets": [
{
"name": "secret-sa"
}
]
В приведенном примере индекс секрета secret-sa имеет значение "0". Индекс потребуется указать при подготовке kubeconfig кластера.
Подготовка kubeconfig кластера
Для подготовки** **kubeconfig кластера нужно выполнить следующие шаги:
- сформировать файл kubecon****fig.sh со скриптом создания kubeconfig кластера для системной учетной записи name-service-account. Пример kubeconfig.sh:
Прописать переменные
SERVICE_ACCOUNT_NAME=name-service-account
NAMESPACE=default
NEW_CONTEXT=namesa
KUBECONFIG_FILE='kubeconfig-sa'
Получить текущий контекст
CONTEXT=$(kubectl config current-context)
Получить имя секрета в Service Account
SECRET_NAME=$(kubectl get serviceaccount ${SERVICE_ACCOUNT_NAME} --context ${CONTEXT} --namespace ${NAMESPACE} -o jsonpath='{.secrets[0].name}')
Получить токен доступа и закодировать его данные в формат base64
TOKEN_DATA=$(kubectl get secret ${SECRET_NAME} --context ${CONTEXT} --namespace ${NAMESPACE} -o jsonpath='{.data.token}')
TOKEN=$(echo ${TOKEN_DATA} | base64 -d)
Создать файл для kubeconfig с полной копией текущего kubeconfig кластера
kubectl config view --raw > ${KUBECONFIG_FILE}.full.tmp
Переключить рабочий контекст на текущий
kubectl --kubeconfig ${KUBECONFIG_FILE}.full.tmp config use-context ${CONTEXT}
kubectl --kubeconfig ${KUBECONFIG_FILE}.full.tmp config view --flatten --minify > ${KUBECONFIG_FILE}.tmp
Переименовать контекст на новый контекст
kubectl config --kubeconfig ${KUBECONFIG_FILE}.tmp rename-context ${CONTEXT} ${NEW_CONTEXT}
Создать токен пользователя
kubectl config --kubeconfig ${KUBECONFIG_FILE}.tmp set-credentials ${CONTEXT}-token-user --token ${TOKEN}
Установить контекст для использования токена Service Account
kubectl config --kubeconfig ${KUBECONFIG_FILE}.tmp set-context ${NEW_CONTEXT} --user ${CONTEXT}-token-user
Упростить и получить kubeconfig кластера для Service Account
kubectl config --kubeconfig ${KUBECONFIG_FILE}.tmp view --flatten --minify > ${KUBECONFIG_FILE}
rm ${KUBECONFIG_FILE}.full.tmp
rm ${KUBECONFIG_FILE}.tmp
где вместо "0" в .secrets0.name указать индекс секрета из массива secrets Service Account, полученного на шаге д) п. 9.1.1; 2. выполнить команды в файле create-kubeconfi****g.sh:
source create-kubeconfig.sh
В результате будет создан kubeconfig кластера c именем kubeconfig-sa для Service Account name-service-account в папке ~/.kube; 3. скопировать данные kubeconfig кластера kubeconfig-sa. Команда получения данных kubeconfig-sa:
cat kubeconfig-sa
Добавить job в pipeline
Для добавления job в pipeline нужно выполнить следующие шаги:
- в Gitlab добавить переменную CI/CD в репозитории проекта, где в качестве ключа указать KUBECONFIG_file, а в значении ‒ данные kubeconfig кластера;
- в репозитории проекта перейти к конфигурационному файлу CI/CD (стандартное имя конфигурационного файла в Gitlab ‒ .gitlab-ci.yml);
- добавить в stages этап pipeline, например, с именем create_ns, для создания Namespace в кластере и указать этап create_ns в конце pipeline после
stages:
‒ create_ns
- добавить job и задать параметры:
- stage, в котором указать имя этапа, добавленного на предыдущем шаге;
- before_script, где прописать команду для записи значения переменной KUBECONFIG_file в файл kubeconfig-sa.conf и команду для экспортирования kubeconfig кластера в переменную KUBECONFIG;
- script, где прописать команду на создание Namespace.
Пример:
где вместо my-namespace прописать имя создаваемого неймспейса;
create_job: stage: create_ns before_script: echo $KUBECONFIG_file> kubeconfig-sa.conf export KUBECONFIG=kubeconfig-sa.conf script: ‒ kubectl create namespace my-namespace
- запустить pipeline.