Thank you for reading this post, don't forget to subscribe!
1.Описание проблемы
2.1.Решение проблемы (кастыль)
2.2.Решение проблемы (более адеватное)
3.Использование условий
У меня имелся следующий проект, в котором собираются 4 контейнера а дальше деплоятся в кластер kubernetes
вот пример helm чарта:
[root@prod-vsrv-kubemaster1 cache-builder]# cat helm/templates/deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
--- 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
--- 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
--- 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
1 2 3 4 5 6 7 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#неймспейс в котором запускаемся 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#неймспейс в котором запускаемся 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#неймспейс в котором запускаемся 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#неймспейс в котором запускаемся 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 при котором у меня возникли ошибки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
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
1 2 3 4 5 6 7 8 9 10 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
--- 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
--- {{- 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
--- 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#неймспейс в котором запускаемся 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#неймспейс в котором запускаемся 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#неймспейс в котором запускаемся 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#неймспейс в котором запускаемся 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
остаётся без изменений:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
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 |