ass cicd p2

This commit is contained in:
Sergey Bondarev
2021-12-14 14:56:14 +03:00
parent 4dc41b7a78
commit 18abde91e0
13 changed files with 692 additions and 0 deletions
@@ -0,0 +1,66 @@
# Подготовка кластера
## 1. Создаем SA для helm
Для этого запускаем скрипт `setup.sh`.
```bash
bash setup.sh xpaste production
```
В конце своего выполнения скрипт выдаст нам токен, который необходимо сохранить.
## 2. Создание variables в gitlab
Для доступа из Gitlab в Kubernetes нам необходимо добавить в Gitlab переменную, в которой будет содержаться токен с предыдущего шага.
* Переходим в Gitlab
Для этого открываем в браузере свой форк xpaste.
* Добавляем переменную
Для этого в левом меню находим `Settings -> CI/CD -> Variables` и нажимаем Expand. Жмем кнопку `Add Variable` и в поле `Key` вводим имя переменной:
```bash
K8S_PROD_CI_TOKEN
```
В поле `Value` вводим скопированный токен из вывода команды setup.sh (пункт 1) и нажимаем `Add Variable`.
## 3. Создаем token для доступа в registry
Для этого переходим в раздел `Settings -> Repository -> Deploy tokens` и нажимаем Expand.
В поле `Name` вводим
```bash
k8s-pull-token-prod
```
Cтавим галочку рядом с `read_registry`. Все остальные поля оставляем пустыми. Нажимаем `Create deploy token`.
```!!НЕ ЗАКРЫВАЕМ ОКНО БРАУЗЕРА!!```
## 4. Создаем secret в kubernetes
Создаем secret, который будет использоваться для image pull. Для этого возвращаемся на первый master и выполняем команду:
Вносим нужные данные в скрипт `docker_pull_secret.sh` и запускаем его:
Соответственно подставляя на место `<>` нужные параметры, которые получили на `шаге 3`.
```bash
vim docker_pull_secret.sh
./docker_pull_secret.sh
```
## 5. Создание секрета для приложения
Создаем секрет, из которого при деплое будут взяты значения для переменных окружения, таких как доступы к БД и секретный ключ.
Вносим нужные данные в скрипт xpaste_secret.sh (в данном случае ничего не меняем) и запускаем его:
```bash
vim xpaste_secret.sh
./xpaste_secret.sh
```
`secret-key-base xxxxxxxxxxxxx` это не плэйсхолдер. Можно так и оставить.
@@ -0,0 +1,12 @@
#!/bin/bash
NS=xpaste-production
kubectl delete secret xpaste-gitlab-registry --namespace "$NS"
kubectl create secret docker-registry xpaste-gitlab-registry \
--docker-server registry.gitlab.com \
--docker-email 'student@slurm.io' \
--docker-username '<первая строчка из окна создания токена в gitlab>' \
--docker-password '<вторая строчка из окна создания токена в gitlab>' \
--namespace "$NS"
+95
View File
@@ -0,0 +1,95 @@
#!/bin/bash
CI_PROJECT_PATH_SLUG=$1
CI_ENVIRONMENT_NAME=$2
GREEN='\033[0;32m'
NC='\033[0m'
usage() {
echo "Usage: $0 CI_PROJECT_PATH_SLUG CI_ENVIRONMENT_NAME"
}
base64_decode_key() {
if [[ "$OSTYPE" == "linux"* ]]; then
echo "-d"
elif [[ "$OSTYPE" == "darwin"* ]]; then
echo "-D"
else
echo "--help"
fi
}
if [ -z "$CI_PROJECT_PATH_SLUG" ] || [ -z "$CI_ENVIRONMENT_NAME" ]; then
usage
exit 1
fi
NS="$CI_PROJECT_PATH_SLUG-$CI_ENVIRONMENT_NAME"
SA="$CI_PROJECT_PATH_SLUG-$CI_ENVIRONMENT_NAME"
ROLE="$CI_PROJECT_PATH_SLUG-$CI_ENVIRONMENT_NAME"
ROLEBIND="$CI_PROJECT_PATH_SLUG-$CI_ENVIRONMENT_NAME"
if kubectl get ns "$NS"; then
echo -e "${GREEN}namespace for project already exists${NC}"
else
echo -e "${GREEN}creating namespace for project${NC}"
kubectl create namespace "$NS"
echo
fi
if kubectl -n "$NS" get sa "$SA"; then
echo -e "${GREEN}serviceaccount for project already exists${NC}"
else
echo
echo -e "${GREEN}creating CI serviceaccount for project${NC}"
kubectl create serviceaccount \
--namespace "$NS" \
"$SA"
echo
fi
if kubectl -n "$NS" get role "$ROLE"; then
echo -e "${GREEN}role for project already exists${NC}"
else
echo -e "${GREEN}creating CI role for project${NC}"
cat << EOF | kubectl apply --namespace $NS -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: "$ROLE"
rules:
- apiGroups: ["", "extensions", "apps", "batch", "events", "networking.k8s.io", "certmanager.k8s.io", "cert-manager.io", "monitoring.coreos.com"]
resources: ["*"]
verbs: ["*"]
EOF
echo
fi
if kubectl -n "$NS" get rolebinding "$ROLEBIND"; then
echo -e "${GREEN}rolebinding for project already exists${NC}"
else
echo -e "${GREEN}creating CI rolebinding for project${NC}"
kubectl create rolebinding \
--namespace "$NS" \
--serviceaccount "$NS":"$SA" \
--role "$ROLE" \
"$ROLEBIND"
echo
fi
echo -e "${GREEN}access token for new CI user:${NC}"
kubectl get secret \
--namespace "$NS" \
$( \
kubectl get serviceaccount \
--namespace "$NS" \
"$SA" \
-o jsonpath='{.secrets[].name}'\
) \
-o jsonpath='{.data.token}' | base64 $(base64_decode_key)
echo
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
NS=xpaste-production
kubectl delete secret slurm-xpaste --namespace "$NS"
kubectl create secret generic slurm-xpaste \
--from-literal secret-key-base=xxxxxxxxxxxxxxxxxxxxxxxxx \
--from-literal db-user='xpaste' \
--from-literal db-password='xpaste1234567890' \
--namespace "$NS"