Kubernetes. Gitlab (ci/cd) (HTTP Basic: Access denied)

У меня имелся следующий проект, в котором собираются 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/

Was this helpful?

0 / 0