У меня имелся следующий проект, в котором собираются 4 контейнера а дальше деплоятся в кластер kubernetes
вот пример helm чарта:
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/templates/deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.deployment_name }}
namespace: {{ .Values.namespace }}
labels:
app: {{ .Values.app_name }}
spec:
replicas: {{ .Values.replica_number }}
selector:
matchLabels:
app: {{ .Values.app_name }} # по вот этому лейблу репликасет цепляет под
# тут описывается каким мокаром следует обновлять поды
strategy:
rollingUpdate:
maxSurge: 1 # указывает на какое количество реплик можно увеличить
maxUnavailable: 1 # указывает на какое количество реплик можно уменьшить
#т.е. в одно время при обновлении, будет увеличено на один (новый под) и уменьшено на один (старый под)
type: RollingUpdate
## тут начинается описание контейнера
template:
metadata:
labels:
app: {{ .Values.app_name }} # по вот этому лейблу репликасет цепляет под
# name_elk: elk-log-{{ .Values.namespace }} #это имя будет записываться в EFK
spec:
containers:
- image: "{{ .Values.image_app.repository }}:{{ .Values.image_app.tag }}"
imagePullPolicy: Always
name: {{ .Values.app_name }}
ports:
- containerPort: {{ .Values.deployment_port }}
# тут начинаются проверки по доступности
# readinessProbe: # проверка готово ли приложение
# failureThreshold: 3 #указывает количество провалов при проверке
# httpGet: # по сути дёргает курлом на 8080 порт
# path: /monitoring
# port: 8080
# periodSeconds: 20 #как часто должна проходить проверка (в секундах)
# successThreshold: 1 #сбрасывает счётчик неудач, т.е. при 3х проверках если 1 раз успешно прошло, то счётчик сбрасывается и всё ок
# timeoutSeconds: 1 #таймаут на выполнение пробы 1 секунда
# initialDelaySeconds: 120
# livenessProbe: #проверка на жизнь приложения, живо ли оно
# failureThreshold: 3
# tcpSocket:
# port: 8888
# httpGet:
# path: /monitoring
# port: 8080
# periodSeconds: 20
# successThreshold: 1
# timeoutSeconds: 1
# initialDelaySeconds: 10 #означает что первую проверку надо сделать только после 10 секунд
# тут начинается описание лимитов для пода
resources:
requests: #количество ресурсов которые резервируются для pod на ноде
cpu: {{ .Values.requests_cpu_app }}
memory: {{ .Values.requests_memory_app }}
limits: #количество ресурсов которые pod может использовать(верхняя граница)
cpu: {{ .Values.limits_cpu_app }}
memory: {{ .Values.limits_memory_app }}
imagePullSecrets:
- name: {{ .Values.secret_name_gitlab_login }}
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/templates/service.yaml
---
kind: Service
apiVersion: v1
metadata:
name: {{ .Values.service_name }}
namespace: {{ .Values.namespace }}
spec:
selector:
app: {{ .Values.app_name }}
ports:
- protocol: TCP
port: {{ .Values.service_port }}
targetPort: {{ .Values.deployment_port }}
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/templates/ingress.yaml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ .Values.ingress_name }}
namespace: {{ .Values.namespace }}
spec:
rules:
- host: {{ .Values.domain }} #тут указывается наш домен
http:
paths:
# - path: "/ui/test"
# backend:
# serviceName: {{ .Values.service_name }}
# servicePort: 8083
- path: "/"
backend:
serviceName: {{ .Values.service_name }}
servicePort: {{ .Values.service_port }}
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/Chart.yaml
apiVersion: v2
name: cache-builder
description: A Helm chart for Kubernetes
type: application
version: 1.0.0
appVersion: 1.0.0
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/values-mrunner.yaml
#неймспейс в котором запускаемся
namespace: test-cache-builder
#имя деплоймента
deployment_name: deployment-cache-builder-mrunner
deployment_port: 8888
service_port: 8888
#имя сервиса
service_name: service-cache-builder-mrunner
#имя ingress
ingress_name: ingress-cache-builder-mrunner
#указываем наш домен по которому будет слушать ingress
domain: cb-mrunner.prod.test.local
#количество реплик деплоймента минимальное количество
replica_number: 1
#имя лейбла сервиса
app_name: cache-builder-mrunner
#имя образа для сервиса
image_app:
repository: gitnexus.test.local:4567/cache-builder/cache-builder/mrunner
tag: "v5"
#количество ресурсов которые резервируются для pod на ноде проц и оперативка
requests_cpu_app: 100m
requests_memory_app: 500Mi
#количество ресурсов которые pod может использовать(верхняя граница)
limits_cpu_app: 400m
limits_memory_app: 1000Mi
#имя секрета под которым воркер ноды будут выкачивать образа из gitlab
secret_name_gitlab_login: docker-login-cache-builder
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/values-node.yaml
#неймспейс в котором запускаемся
namespace: test-cache-builder
#имя деплоймента
deployment_name: deployment-cache-builder-node
deployment_port: 7777
service_port: 7777
#имя сервиса
service_name: service-cache-builder-node
#имя ingress
ingress_name: ingress-cache-builder-node
#указываем наш домен по которому будет слушать ingress
domain: cbapi.prod.test.local
#количество реплик деплоймента минимальное количество
replica_number: 1
#имя лейбла сервиса
app_name: cache-builder-node
#имя образа для сервиса
image_app:
repository: gitnexus.test.local:4567/cache-builder/cache-builder/node
tag: "v5"
#количество ресурсов которые резервируются для pod на ноде проц и оперативка
requests_cpu_app: 100m
requests_memory_app: 500Mi
#количество ресурсов которые pod может использовать(верхняя граница)
limits_cpu_app: 400m
limits_memory_app: 1000Mi
#имя секрета под которым воркер ноды будут выкачивать образа из gitlab
secret_name_gitlab_login: docker-login-cache-builder
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/values-scheduler.yaml
#неймспейс в котором запускаемся
namespace: test-cache-builder
#имя деплоймента
deployment_name: deployment-cache-builder-scheduler
deployment_port: 7777
service_port: 7777
#имя сервиса
service_name: service-cache-builder-scheduler
#имя ingress
ingress_name: ingress-cache-builder-scheduler
#количество реплик деплоймента минимальное количество
replica_number: 1
#имя лейбла сервиса
app_name: cache-builder-scheduler
#имя образа для сервиса
image_app:
repository: gitnexus.test.local:4567/cache-builder/cache-builder/scheduler
tag: "v5"
#количество ресурсов которые резервируются для pod на ноде проц и оперативка
requests_cpu_app: 100m
requests_memory_app: 500Mi
#количество ресурсов которые pod может использовать(верхняя граница)
limits_cpu_app: 400m
limits_memory_app: 1000Mi
#имя секрета под которым воркер ноды будут выкачивать образа из gitlab
secret_name_gitlab_login: docker-login-cache-builder
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/values-web.yaml
#неймспейс в котором запускаемся
namespace: test-cache-builder
#имя деплоймента
deployment_name: deployment-cache-builder-web
deployment_port: 8080
service_port: 8080
#имя сервиса
service_name: service-cache-builder-web
#имя ingress
ingress_name: ingress-cache-builder-web
#указываем наш домен по которому будет слушать ingress
domain: cb.prod.test.local
#количество реплик деплоймента минимальное количество
replica_number: 1
#имя лейбла сервиса
app_name: cache-builder-web
#имя образа для сервиса
image_app:
repository: gitnexus.test.local:4567/cache-builder/cache-builder/web
tag: "v5"
#количество ресурсов которые резервируются для pod на ноде проц и оперативка
requests_cpu_app: 100m
requests_memory_app: 500Mi
#количество ресурсов которые pod может использовать(верхняя граница)
limits_cpu_app: 400m
limits_memory_app: 1000Mi
#имя секрета под которым воркер ноды будут выкачивать образа из gitlab
secret_name_gitlab_login: docker-login-cache-builder
далее показываю .gitlab-ci.yml при котором у меня возникли ошибки:
variables:
NAMESPACE: test-cache-builder
kubeconfig_url: /home/gitlab-runner/.kube/config
PWD: $(pwd)
stages:
- deploy_to_kuber
.autorizate_to_gitlab: &autorizate_to_gitlab |
docker logout $CI_REGISTRY
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
.git_tag_variable: &git_tag_variable |
git fetch --tags
export TAG=$(git describe --tags --abbrev=0)
echo $TAG
deploy_to_kuber:
stage: deploy_to_kuber
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- *autorizate_to_gitlab
- *git_tag_variable
- mkdir -p `echo $kubeconfig_url | awk -F '/' 'sub(FS $NF,x)'`
- echo $kubeconfig | base64 -d > $kubeconfig_url
- kubectl create namespace $NAMESPACE --kubeconfig=$kubeconfig_url || echo "all OK - namespace = $NAMESPACE alredy exist"
- kubectl --kubeconfig=$kubeconfig_url delete secret docker-login-$CI_PROJECT_NAME -n $NAMESPACE || echo "error secret not exist"
- kubectl --kubeconfig=$kubeconfig_url create secret docker-registry docker-login-$CI_PROJECT_NAME --docker-server=$CI_REGISTRY --docker-username=$CI_REGISTRY_USER --docker-password=$CI_REGISTRY_PASSWORD --docker-email=$GITLAB_USER_EMAIL -n $NAMESPACE
script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE test-$CI_PROJECT_NAME-web helm/
--values helm/values-web.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE test-$CI_PROJECT_NAME-mrunner helm/
--values helm/values-mrunner.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE test-$CI_PROJECT_NAME-node helm/
--values helm/values-node.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE test-$CI_PROJECT_NAME-scheduler helm/
--values helm/values-scheduler.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
after_script:
- *git_tag_variable
- kubectl --kubeconfig=$kubeconfig_url get pod -n $NAMESPACE
- kubectl --kubeconfig=$kubeconfig_url get service -n $NAMESPACE
- kubectl --kubeconfig=$kubeconfig_url get ingress -n $NAMESPACE
- rm -rf $kubeconfig_url
переменная kubeconfig является токеном кубернетеса добавленным в переменные проекта:
при создании секрета
kubectl —kubeconfig=$kubeconfig_url create secret docker-registry docker-login-$CI_PROJECT_NAME —docker-server=$CI_REGISTRY —docker-username=$CI_REGISTRY_USER —docker-password=$CI_REGISTRY_PASSWORD —docker-email=$GITLAB_USER_EMAIL -n $NAMESPACE
под которым дальше будет выкачиваться образ из registry я использовал встроенные переменные:
CI_REGISTRY_USER
CI_REGISTRY_PASSWORD
при их использовании не выкачивается один из образов, вот вывод describe этого pod
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned test-cache-builder/deployment-cache-builder-node-6f5c998487-gvhbc to prod-srv-kubeworker1
Normal BackOff 13s kubelet, prod-srv-kubeworker1 Back-off pulling image "gitnexus.test.local:4567/cache-builder/cache-builder/node:v14"
Warning Failed 13s kubelet, prod-srv-kubeworker1 Error: ImagePullBackOff
Normal Pulling 1s (x2 over 14s) kubelet, prod-srv-kubeworker1 Pulling image "gitnexus.test.local:4567/cache-builder/cache-builder/node:v14"
Warning Failed 1s (x2 over 14s) kubelet, prod-srv-kubeworker1 Failed to pull image "gitnexus.test.local:4567/cache-builder/cache-builder/node:v14": rpc error: code = Unknown desc = Error response from daemon: Get http://gitnexus.test.local:4567/v2/cache-builder/cache-builder/node/manifests/v14: unauthorized: HTTP Basic: Access denied
Warning Failed 1s (x2 over 14s) kubelet, prod-srv-kubeworker1 Error: ErrImagePull
вылетает ошибка:
unauthorized: HTTP Basic: Access denied
хотя под этими учётными данными login проходит нормально.
нашёл следующие решения:
1.Костыльное — это добавить sleep между helm
variables:
NAMESPACE: megacom-cache-builder
kubeconfig_url: /home/gitlab-runner/.kube/config
PWD: $(pwd)
stages:
- deploy_to_kuber
.autorizate_to_gitlab: &autorizate_to_gitlab |
docker logout $CI_REGISTRY
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
.git_tag_variable: &git_tag_variable |
git fetch --tags
export TAG=$(git describe --tags --abbrev=0)
echo $TAG
deploy_to_kuber:
stage: deploy_to_kuber
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- *autorizate_to_gitlab
- *git_tag_variable
- mkdir -p `echo $kubeconfig_url | awk -F '/' 'sub(FS $NF,x)'`
- echo $kubeconfig | base64 -d > $kubeconfig_url
- kubectl create namespace $NAMESPACE --kubeconfig=$kubeconfig_url || echo "all OK - namespace = $NAMESPACE alredy exist"
- kubectl --kubeconfig=$kubeconfig_url delete secret docker-login-$CI_PROJECT_NAME -n $NAMESPACE || echo "error secret not exist"
- echo "CI_PROJECT_NAME = $CI_PROJECT_NAME"
- echo "CI_REGISTRY = $CI_REGISTRY"
- echo "CI_REGISTRY_USER = $CI_REGISTRY_USER"
- echo "CI_REGISTRY_PASSWORD = $CI_REGISTRY_PASSWORD"
- echo "GITLAB_USER_EMAIL = $GITLAB_USER_EMAIL"
- echo "gitlab-ci-token = $gitlab-ci-token"
- kubectl --kubeconfig=$kubeconfig_url create secret docker-registry docker-login-$CI_PROJECT_NAME --docker-server=$CI_REGISTRY --docker-username=$CI_REGISTRY_USER --docker-password=$CI_REGISTRY_PASSWORD --docker-email=$GITLAB_USER_EMAIL -n $NAMESPACE
- sleep 5
script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE megacom-$CI_PROJECT_NAME-web helm/
--values helm/values-web.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
- sleep 15
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE megacom-$CI_PROJECT_NAME-mrunner helm/
--values helm/values-mrunner.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
- sleep 20
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE megacom-$CI_PROJECT_NAME-node helm/
--values helm/values-node.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
- sleep 25
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE megacom-$CI_PROJECT_NAME-scheduler helm/
--values helm/values-scheduler.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
- sleep 30
after_script:
- *git_tag_variable
- kubectl --kubeconfig=$kubeconfig_url get pod -n $NAMESPACE
- kubectl --kubeconfig=$kubeconfig_url get service -n $NAMESPACE
- kubectl --kubeconfig=$kubeconfig_url get ingress -n $NAMESPACE
- rm -rf $kubeconfig_url
2.Создать деплой токен — думаю оно правильнее:
Создаю Deploy Tokens
меняем немного .gitlab-ci.yml
variables:
NAMESPACE: test-cache-builder
kubeconfig_url: /home/gitlab-runner/.kube/config
PWD: $(pwd)
stages:
- deploy_to_kuber
- helm_install
- delete_kubeconfig
.autorizate_to_gitlab: &autorizate_to_gitlab |
docker logout $CI_REGISTRY
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
.git_tag_variable: &git_tag_variable |
git fetch --tags
export TAG=$(git describe --tags --abbrev=0)
echo $TAG
.info: &info |
kubectl --kubeconfig=$kubeconfig_url get pod -n $NAMESPACE
kubectl --kubeconfig=$kubeconfig_url get service -n $NAMESPACE
kubectl --kubeconfig=$kubeconfig_url get ingress -n $NAMESPACE
deploy_to_kuber:
stage: deploy_to_kuber
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- *autorizate_to_gitlab
- *git_tag_variable
- mkdir -p `echo $kubeconfig_url | awk -F '/' 'sub(FS $NF,x)'`
- echo $kubeconfig | base64 -d > $kubeconfig_url
- kubectl create namespace $NAMESPACE --kubeconfig=$kubeconfig_url || echo "all OK - namespace = $NAMESPACE alredy exist"
- kubectl --kubeconfig=$kubeconfig_url delete secret docker-login-$CI_PROJECT_NAME -n $NAMESPACE || echo "error secret not exist"
- kubectl --kubeconfig=$kubeconfig_url create secret docker-registry docker-login-$CI_PROJECT_NAME --docker-server="$CI_REGISTRY" --docker-username="$CI_DEPLOY_USER" --docker-password="$CI_DEPLOY_PASSWORD" --docker-email="$GITLAB_USER_EMAIL" -n $NAMESPACE
script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
helm_install-node:
stage: helm_install
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
script:
- *autorizate_to_gitlab
- *git_tag_variable
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE test-$CI_PROJECT_NAME-node helm/
--values helm/values-node.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
after_script:
- *git_tag_variable
- *info
helm_install-scheduler:
stage: helm_install
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
script:
- *autorizate_to_gitlab
- *git_tag_variable
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE test-$CI_PROJECT_NAME-scheduler helm/
--values helm/values-scheduler.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
after_script:
- *git_tag_variable
- *info
helm_install-mrunner:
stage: helm_install
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
script:
- *autorizate_to_gitlab
- *git_tag_variable
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE test-$CI_PROJECT_NAME-mrunner helm/
--values helm/values-mrunner.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
after_script:
- *git_tag_variable
- *info
helm_install-web:
stage: helm_install
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
script:
- *autorizate_to_gitlab
- *git_tag_variable
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE test-$CI_PROJECT_NAME-web helm/
--values helm/values-web.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
after_script:
- *git_tag_variable
- *info
delete_kubeconfig:
stage: delete_kubeconfig
tags:
- runer-gitnexus-shell
only:
- master
script:
- rm -rf $kubeconfig_url
этим самым мы получаем pipeline в следующем виде:
рассмотрим что поменяли, старый вариант:
kubectl —kubeconfig=$kubeconfig_url create secret docker-registry docker-login-$CI_PROJECT_NAME —docker-server=$CI_REGISTRY —docker-username=$CI_REGISTRY_USER —docker-password=$CI_REGISTRY_PASSWORD —docker-email=$GITLAB_USER_EMAIL -n $NAMESPACE
новый вариант:
kubectl —kubeconfig=$kubeconfig_url create secret docker-registry docker-login-$CI_PROJECT_NAME —docker-server=»$CI_REGISTRY» —docker-username=»$CI_DEPLOY_USER» —docker-password=»$CI_DEPLOY_PASSWORD» —docker-email=»$GITLAB_USER_EMAIL» -n $NAMESPACE
как видим мы изменили CI_REGISTRY_USER на CI_DEPLOY_USER и CI_REGISTRY_PASSWORD на CI_DEPLOY_PASSWORD
в таком варианте стало нормально выкачиваться.
3.Использование условий
Теперь поправим шаблоны, чтобы для некоторых проектов например не ставился ingress, а для других использовались различные livenessProbe и readinessProbe
правим шаблоны, приводя их к следующему виду:
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/templates/deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.deployment_name }}
namespace: {{ .Values.namespace }}
labels:
app: {{ .Values.app_name }}
spec:
replicas: {{ .Values.replica_number }}
selector:
matchLabels:
app: {{ .Values.app_name }} # по вот этому лейблу репликасет цепляет под
# тут описывается каким мокаром следует обновлять поды
strategy:
rollingUpdate:
maxSurge: 1 # указывает на какое количество реплик можно увеличить
maxUnavailable: 1 # указывает на какое количество реплик можно уменьшить
#т.е. в одно время при обновлении, будет увеличено на один (новый под) и уменьшено на один (старый под)
type: RollingUpdate
## тут начинается описание контейнера
template:
metadata:
labels:
app: {{ .Values.app_name }} # по вот этому лейблу репликасет цепляет под
# name_elk: elk-log-{{ .Values.namespace }} #это имя будет записываться в ELK
spec:
containers:
- image: "{{ .Values.image_app.repository }}:{{ .Values.image_app.tag }}"
imagePullPolicy: Always
name: {{ .Values.app_name }}
ports:
- containerPort: {{ .Values.deployment_port }}
# тут начинаются проверки по доступности
{{- if .Values.readinessProbe.enabled }}
readinessProbe: # проверка готово ли приложение
failureThreshold: {{ .Values.readinessProbe.failureThreshold }} #указывает количество провалов при проверке
httpGet: # по сути дёргает курлом на 8080 порт
path: {{ .Values.readinessProbe.path }}
port: {{ .Values.readinessProbe.port }}
periodSeconds: {{ .Values.readinessProbe.periodSeconds }} #как часто должна проходить проверка (в секундах)
successThreshold: {{ .Values.readinessProbe.successThreshold }} #сбрасывает счётчик неудач, т.е. при 3х проверках если 1 раз успешно прошло, то счётчик сбрасывается и всё ок
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} #таймаут на выполнение пробы 1 секунда
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
{{- end}}
{{- if .Values.livenessProbe.enabled }}
livenessProbe: #проверка на жизнь приложения, живо ли оно
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
httpGet:
path: {{ .Values.livenessProbe.path }}
port: {{ .Values.livenessProbe.port }}
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
successThreshold: {{ .Values.livenessProbe.successThreshold }}
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} #означает что первую проверку надо сделать только после 10 секунд
{{- end}}
# тут начинается описание лимитов для пода
resources:
requests: #количество ресурсов которые резервируются для pod на ноде
cpu: {{ .Values.requests_cpu_app }}
memory: {{ .Values.requests_memory_app }}
limits: #количество ресурсов которые pod может использовать(верхняя граница)
cpu: {{ .Values.limits_cpu_app }}
memory: {{ .Values.limits_memory_app }}
imagePullSecrets:
- name: {{ .Values.secret_name_gitlab_login }}
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/templates/ingress.yaml
---
{{- if .Values.ingress.enabled }}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ .Values.ingress.ingress_name }}
namespace: {{ .Values.ingress.namespace }}
spec:
rules:
- host: {{ .Values.ingress.domain }} #тут указывается наш домен
http:
paths:
# - path: "/ui/test"
# backend:
# serviceName: {{ .Values.service_name }}
# servicePort: 8083
- path: "/"
backend:
serviceName: {{ .Values.service_name }}
servicePort: {{ .Values.service_port }}
{{- end}}
сервис я оставил без изменений:
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/templates/service.yaml
---
kind: Service
apiVersion: v1
metadata:
name: {{ .Values.service_name }}
namespace: {{ .Values.namespace }}
spec:
selector:
app: {{ .Values.app_name }}
ports:
- protocol: TCP
port: {{ .Values.service_port }}
targetPort: {{ .Values.deployment_port }}
ну и правим наши values
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/values-mrunner.yaml
#неймспейс в котором запускаемся
namespace: megacom-cache-builder
#имя деплоймента
deployment_name: deployment-cache-builder-mrunner
deployment_port: 8888
service_port: 8888
#имя сервиса
service_name: service-cache-builder-mrunner
ingress:
enabled: true
#имя ingress
ingress_name: ingress-cache-builder-mrunner
#указываем наш домен по которому будет слушать ingress
domain: cb-mrunner.prod.megacom.local
#количество реплик деплоймента минимальное количество
replica_number: 1
#имя лейбла сервиса
app_name: cache-builder-mrunner
#имя образа для сервиса
image_app:
repository: gitnexus.megacom.local:4567/cache-builder/cache-builder/mrunner
tag: "v5"
#количество ресурсов которые резервируются для pod на ноде проц и оперативка
requests_cpu_app: 50m
requests_memory_app: 60Mi
#количество ресурсов которые pod может использовать(верхняя граница)
limits_cpu_app: 400m
limits_memory_app: 500Mi
#имя секрета под которым воркер ноды будут выкачивать образа из gitlab
secret_name_gitlab_login: docker-login-cache-builder
#включаем или выключаем livenessProbe readinessProbe
readinessProbe:
enabled: false
failureThreshold: 3
path: /monitoring
port: 8080
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds: 20
livenessProbe:
enabled: false
failureThreshold: 3
path: /monitoring
port: 8080
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds: 10
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/values-node.yaml
#неймспейс в котором запускаемся
namespace: megacom-cache-builder
#имя деплоймента
deployment_name: deployment-cache-builder-node
deployment_port: 7777
service_port: 7777
#имя сервиса
service_name: service-cache-builder-node
ingress:
enabled: true
#имя ingress
ingress_name: ingress-cache-builder-node
#указываем наш домен по которому будет слушать ingress
domain: cbapi.prod.megacom.local
#количество реплик деплоймента минимальное количество
replica_number: 1
#имя лейбла сервиса
app_name: cache-builder-node
#имя образа для сервиса
image_app:
repository: gitnexus.megacom.local:4567/cache-builder/cache-builder/node
tag: "v5"
#количество ресурсов которые резервируются для pod на ноде проц и оперативка
requests_cpu_app: 50m
requests_memory_app: 60Mi
#количество ресурсов которые pod может использовать(верхняя граница)
limits_cpu_app: 400m
limits_memory_app: 500Mi
#имя секрета под которым воркер ноды будут выкачивать образа из gitlab
secret_name_gitlab_login: docker-login-cache-builder
#включаем или выключаем livenessProbe readinessProbe
readinessProbe:
enabled: false
failureThreshold: 3
path: /monitoring
port: 8080
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds: 20
livenessProbe:
enabled: false
failureThreshold: 3
path: /monitoring
port: 8080
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds: 10
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/values-scheduler.yaml
#неймспейс в котором запускаемся
namespace: megacom-cache-builder
#имя деплоймента
deployment_name: deployment-cache-builder-scheduler
deployment_port: 7777
service_port: 7777
#имя сервиса
service_name: service-cache-builder-scheduler
ingress:
enabled: false
#имя ingress
ingress_name:
#указываем наш домен по которому будет слушать ingress
domain:
#количество реплик деплоймента минимальное количество
replica_number: 1
#имя лейбла сервиса
app_name: cache-builder-scheduler
#имя образа для сервиса
image_app:
repository: gitnexus.megacom.local:4567/cache-builder/cache-builder/scheduler
tag: "v5"
#количество ресурсов которые резервируются для pod на ноде проц и оперативка
requests_cpu_app: 50m
requests_memory_app: 60Mi
#количество ресурсов которые pod может использовать(верхняя граница)
limits_cpu_app: 400m
limits_memory_app: 500Mi
#имя секрета под которым воркер ноды будут выкачивать образа из gitlab
secret_name_gitlab_login: docker-login-cache-builder
#включаем или выключаем livenessProbe readinessProbe
readinessProbe:
enabled: false
failureThreshold: 3
path: /monitoring
port: 8080
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds: 20
livenessProbe:
enabled: false
failureThreshold: 3
path: /monitoring
port: 8080
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds: 10
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/values-web.yaml
#неймспейс в котором запускаемся
namespace: megacom-cache-builder
#имя деплоймента
deployment_name: deployment-cache-builder-web
deployment_port: 8080
service_port: 8080
#имя сервиса
service_name: service-cache-builder-web
ingress:
enabled: true
#имя ingress
ingress_name: ingress-cache-builder-web
#указываем наш домен по которому будет слушать ingress
domain: cb.prod.megacom.local
#количество реплик деплоймента минимальное количество
replica_number: 1
#имя лейбла сервиса
app_name: cache-builder-web
#имя образа для сервиса
image_app:
repository: gitnexus.megacom.local:4567/cache-builder/cache-builder/web
tag: "v5"
#количество ресурсов которые резервируются для pod на ноде проц и оперативка
requests_cpu_app: 50m
requests_memory_app: 60Mi
#количество ресурсов которые pod может использовать(верхняя граница)
limits_cpu_app: 400m
limits_memory_app: 500Mi
#имя секрета под которым воркер ноды будут выкачивать образа из gitlab
secret_name_gitlab_login: docker-login-cache-builder
#включаем или выключаем livenessProbe readinessProbe
readinessProbe:
enabled: false
failureThreshold: 3
path: /monitoring
port: 8080
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds: 20
livenessProbe:
enabled: false
failureThreshold: 3
path: /monitoring
port: 8080
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds: 10
[root@prod-vsrv-kubemaster1 cache-builder]# cat .gitlab-ci.yml
остаётся без изменений:
variables:
NAMESPACE: megacom-cache-builder
kubeconfig_url: /home/gitlab-runner/.kube/config
PWD: $(pwd)
stages:
- deploy_to_kuber
- helm_install
- delete_kubeconfig
.autorizate_to_gitlab: &autorizate_to_gitlab |
docker logout $CI_REGISTRY
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
.git_tag_variable: &git_tag_variable |
git fetch --tags
export TAG=$(git describe --tags --abbrev=0)
echo $TAG
.info: &info |
kubectl --kubeconfig=$kubeconfig_url get pod -n $NAMESPACE
kubectl --kubeconfig=$kubeconfig_url get service -n $NAMESPACE
kubectl --kubeconfig=$kubeconfig_url get ingress -n $NAMESPACE
deploy_to_kuber:
stage: deploy_to_kuber
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- mkdir -p `echo $kubeconfig_url | awk -F '/' 'sub(FS $NF,x)'`
- echo $kubeconfig | base64 -d > $kubeconfig_url
- kubectl create namespace $NAMESPACE --kubeconfig=$kubeconfig_url || echo "all OK - namespace = $NAMESPACE alredy exist"
- kubectl --kubeconfig=$kubeconfig_url delete secret docker-login-$CI_PROJECT_NAME -n $NAMESPACE || echo "error secret not exist"
- kubectl --kubeconfig=$kubeconfig_url create secret docker-registry docker-login-$CI_PROJECT_NAME --docker-server="$CI_REGISTRY" --docker-username="$CI_DEPLOY_USER" --docker-password="$CI_DEPLOY_PASSWORD" --docker-email="$GITLAB_USER_EMAIL" -n $NAMESPACE
script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
helm_install-node:
stage: helm_install
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
script:
- *git_tag_variable
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE megacom-$CI_PROJECT_NAME-node helm/
--values helm/values-node.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
after_script:
- *info
helm_install-scheduler:
stage: helm_install
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
script:
- *git_tag_variable
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE megacom-$CI_PROJECT_NAME-scheduler helm/
--values helm/values-scheduler.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
after_script:
- *info
helm_install-mrunner:
stage: helm_install
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
script:
- *git_tag_variable
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE megacom-$CI_PROJECT_NAME-mrunner helm/
--values helm/values-mrunner.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
after_script:
- *info
helm_install-web:
stage: helm_install
tags:
- runer-gitnexus-shell
only:
- master
before_script:
- kubectl --kubeconfig=$kubeconfig_url get secret -n $NAMESPACE
script:
- *git_tag_variable
- helm upgrade --install --atomic --timeout 3m
--kubeconfig=$kubeconfig_url -n $NAMESPACE megacom-$CI_PROJECT_NAME-web helm/
--values helm/values-web.yaml
--set-string image_app.tag=$TAG
--set-string namespace=$NAMESPACE
--set-string secret_name_gitlab_login=docker-login-$CI_PROJECT_NAME
after_script:
- *info
delete_kubeconfig:
stage: delete_kubeconfig
tags:
- runer-gitnexus-shell
only:
- master
script:
- rm -rf $kubeconfig_url
- *info
Источник: https://sidmid.ru/kubernetes-gitlab-ci-cd-http-basic-access-denied/