Thank you for reading this post, don't forget to subscribe!
есть проект в гитлабе группа balance-online и проект
online-balance-api
cat Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
FROM maven:3.6-jdk-8 AS builder WORKDIR /usr/src/mymaven COPY ./pom.xml . RUN mvn -B -e -C -T 1C org.apache.maven.plugins:maven-dependency-plugin:3.0.2:go-offline COPY src ./src RUN ls -l RUN mvn -Dmaven.test.skip=true clean install ENV HTTP_PROXY="" ENV HTTPS_PROXY="" FROM openjdk:8-jre-alpine RUN apk --update --no-cache add busybox-extras curl ENV JAVA_OPTS="-Duser.timezone=Asia/Bishkek" ENV JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m" COPY --from=builder /usr/src/mymaven/target/online-balance-api-0.0.1-SNAPSHOT.jar online-balance-api-0.0.1-SNAPSHOT.jar EXPOSE 8080 CMD ["java", "-Xmx512m", "-jar", "online-balance-api-0.0.1-SNAPSHOT.jar"] |
в этом докерфайле используется multistage сборка
[root@prod-vsrv-kubemaster1 online-balance-api]# cat helm/test-online-balance-api/values.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-balance-online #имя деплоймента deployment_name: deployment-balance-api deployment_port: 8080 service_port: 8080 #имя сервиса service_name: service-balance-api #имя ingress ingress_name: ingress-balance-api #указываем наш домен по которому будет слушать ingress domain: balance-api.prod.test.local #количество реплик деплоймента минимальное количество replica_number: 2 #имя лейбла сервиса app_name: balance-api #имя образа для сервиса image_app: repository: registry.test.local:4567/online-balance/online-balance-api #tag: "latest" tag: "v1" #количество ресурсов которые резервируются для 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-online-balance-ap |
tag будет перезаписываться при push эта настройка в gitlab-ci.yml
[root@prod-vsrv-kubemaster1 online-balance-api]# cat helm/test-online-balance-api/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 online-balance-api]# cat helm/test-online-balance-api/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 online-balance-api]# cat helm/test-online-balance-api/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: {{ template "balance-api.fullname" . }} namespace: {{ .Values.namespace }} labels: app: {{ template "balance-api.name" . }} chart: {{ template "balance-api.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} 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 httpGet: path: /monitoring port: 8080 periodSeconds: 20 successThreshold: 1 timeoutSeconds: 1 initialDelaySeconds: 120 #означает что первую проверку надо сделать только после 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: # по вот этому секрету воркеры будут выкачивать наш image - name: {{ .Values.secret_name_gitlab_login }} # имя секрета |
imagePullSecrets c помощью этого параметра происходит выкачивание образа с gitlab-registry под логином и паролем указанным в секрете docker-login-{{ .Values.namespace }}
[root@prod-vsrv-kubemaster1 online-balance-api]# cat helm/test-online-balance-api/templates/_helpers.tpl
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 |
{{/* vim: set filetype=mustache: */}} {{/* Expand the name of the chart. */}} {{- define "balance-api.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} {{- end -}} {{/* Create a default fully qualified app name. We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). If release name contains chart name it will be used as a full name. */}} {{- define "balance-api.fullname" -}} {{- if .Values.fullnameOverride -}} {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} {{- else -}} {{- $name := default .Chart.Name .Values.nameOverride -}} {{- if contains $name .Release.Name -}} {{- .Release.Name | trunc 63 | trimSuffix "-" -}} {{- else -}} {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} {{- end -}} {{- end -}} {{- end -}} {{/* Create chart name and version as used by the chart label. */}} {{- define "balance-api.chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} {{- end -}} |
[root@prod-vsrv-kubemaster1 online-balance-api]# cat helm/test-online-balance-api/Chart.yaml
1 2 3 4 5 6 7 |
apiVersion: v2 name: balance-api description: A Helm chart for Kubernetes type: application version: 1.0.0 appVersion: 1.0.0 |
[root@prod-vsrv-kubemaster1 online-balance-api]# 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 |
variables: NAMESPACE: test-balance-online kubeconfig_url: /var/opt/home/gitlab-runner/.kube # в конце слэш "/" не нужен PWD: $(pwd) jar: online-balance-api-0.0.1-SNAPSHOT.jar stages: - create_jar_and_cache - create_image - 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 create_jar_and_cache: stage: create_jar_and_cache tags: - shell98 only: - for-kuber before_script: - pwd script: - docker run -i --rm --name balance-api -v /var/opt/.m2:/root/.m2 -v "$(pwd)":/usr/src/mymaven -w /usr/src/mymaven maven:3.6-jdk-8 mvn -Dmaven.test.skip=true clean install - mkdir -p /tmp/balance/ || echo error - \cp -f ./target/$jar /tmp/balance/ after_script: - sudo chown -R gitlab-runner:gitlab-runner ./* || echo error when: manual create_image: stage: create_image tags: - shell98 only: - for-kuber before_script: - pwd - mkdir -p target/ || echo error - \cp -f /tmp/balance/$jar target/ - sudo chown -R gitlab-runner:gitlab-runner ./* || echo error - *autorizate_to_gitlab - *git_tag_variable script: - docker build -f Dockerfile -t $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$TAG . - docker push $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$TAG after_script: - rm -f /tmp/balance/$jar || echo error - docker logout $CI_REGISTRY when: manual deploy_to_kuber: stage: deploy_to_kuber tags: - shell98 only: - for-kuber before_script: - *autorizate_to_gitlab - *git_tag_variable - mkdir -p $kubeconfig_url - echo $kubeconfig | base64 -d > config; ls -l; pwd - mv config $kubeconfig_url/ - kubectl create namespace $NAMESPACE --kubeconfig=$kubeconfig_url/config || echo "all OK - namespace = $NAMESPACE alredy exist" - kubectl --kubeconfig=$kubeconfig_url/config delete secret docker-login-$CI_PROJECT_NAME -n $NAMESPACE || echo "error secret not exist" - kubectl --kubeconfig=$kubeconfig_url/config 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/config get secret -n $NAMESPACE - helm upgrade --install --atomic --timeout 3m --kubeconfig=$kubeconfig_url/config -n $NAMESPACE test-$CI_PROJECT_NAME helm/ --values helm/values.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 - docker rmi $CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$TAG || echo "error image does not exist" - kubectl --kubeconfig=$kubeconfig_url/config get pod -n $NAMESPACE - kubectl --kubeconfig=$kubeconfig_url/config get service -n $NAMESPACE - kubectl --kubeconfig=$kubeconfig_url/config get ingress -n $NAMESPACE - rm -rf $kubeconfig_url/config when: manual |
не забываем создать переменную kubeconfig созданную из токена куб конфига:
[root@prod-vsrv-kubemaster1 online-balance-api]# cat ~/.kube/config | openssl base64 | tr -d '\n'
полученный текст в base64 закидываем в переменную kubeconfig проекта гитлаба.
ну и пушим в проект дальше в следующем виде:
git add .
git commit -m "test 1"
git tag -a v1 -m "test"
git push origin --tags
git push