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/