应用服务配置

目标

本文档面向初次使用 Choerodon 猪齿鱼的用户,引导新手用户在 Choerodon 猪齿鱼应用服务代码仓库中配置应用服务相关的文件。在配置这些文件之前,请确保你已通过创建一个应用服务步骤成功创建了应用服务并点击仓库地址进入了对应的代码仓库。

前置条件

  1. 已部署安装Choerodon 猪齿鱼,并使用默认的 admin 用户名和密码登录了 Choerodon 系统。
  2. 默认的 admin 用户进入 Choerodon 系统后,默认拥有一个组织并为该组织的组织管理员角色。关于Choerodon角色的详情,请移步角色管理。

    账号角色职责
    admin组织管理员管理组织下的项目和成员(组织成员、项目所有者、项目成员)
  3. 已完成项目创建及团队成员建设。

  4. 已在Choerodon项目下创建应用服务,并配置了 Git,包括下载安装、设置等。

应用容器化配置

Choerodon猪齿鱼秉承云原生的理念,基于平台的应用需要进行容器化改造才能够使用Choerodon进行开发和部署。在本节中将给大家介绍Choerodon容器化的一些概念, 以及为原代码库增加相关的配置使其满足Choerodon容器化要求。

容器化的第一步是编写合适的Dockerfile, Dockerfile定义了如何将一个可执行程序打包成镜像. 例如: 一个SpringBoot项目, 在maven构建之后会生成一个可执行的jar包, 基于这个jar包可以打包成一个镜像, 最简单的Dockerfile如下:

  1. # 指定基础镜像(基础镜像中一般包含可执行程序的运行环境, 如JRE, 一些基本的linux指令)
  2. FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:0.9.0
  3. # 指定Dockerfile中剩余指令的工作目录为 /choerodon
  4. WORKDIR /choerodon
  5. # 将构建上下文中的jar包复制到镜像中, 这个jar包由SpringBoot项目maven打包生成
  6. COPY app.jar app.jar
  7. # 指定镜像的默认指令
  8. # 其中 $JAVA_OPTS $SKYWALKING_OPTS 这两个环境变量是为了在不重新生成镜像的前提下,
  9. # 能够根据需要指定JVM参数和skywalking参数以运行容器
  10. CMD java $JAVA_OPTS $SKYWALKING_OPTS -jar /choerodon/app.jar

应用Helm配置

在Choerodon猪齿鱼中,使用Helm管理Kubernetes包等,Helm之于Kubernetes好比yum之于RHEL,或者apt-get之于Ubuntu。Helm使用Charts管理应用,Charts就好像RPM一样,里面描述了应用及其依赖关系。

所以, 在Choerodon的标准应用代码结构中一定要包含charts文件夹,如下截图,这是一个后端项目的标准结构。

image

Chart包结构:

  1. ├── charts
  2. └── choerodon-todo-servie
  3. ├── Chart.yaml 包含关于chart的的信息的YAML文件
  4. ├── README.md 可选:chartREADME文件, 简单介绍Chart(例如: Chart的用法用途, 环境变量)
  5. ├── templates 这个目录下包含了多个模板文件以结合配置值生成有效的Kubernetes manifest文件
  6. ├── deployment.yaml 创建 Kubernetes 部署的基本清单。
  7. ├── _helpers.tpl 可选: 放置模板助手的地方,您可以在整个 chart 中重复使用
  8. ├── ingress.yaml 可选: 为部署配置Ingress, 以通过域名访问服务
  9. ├── pre-config-config.yaml 可选: 为部署配置前置job, 用于初始化配置中心
  10. ├── pre-config-db.yaml 可选: 为部署配置前置job, 用于初始化数据库
  11. └── service.yaml 可选: 为您的部署创建服务端点的基本清单。
  12. └── values.yaml 为模板的预定义变量。

第一步: 创建目录 在项目根目录下创建如下目录结构,首先创建一个名为charts的文件夹,再创建一个与应用名相同的文件夹,在此处示例为choerodon-todo-servie,在其下创建如上文Chart包结构所示的文件

第二步: 编写_helpers.tpl文件 在 templates文件夹下将一些公共的lable或值定义到 _helpers.tpl文件中:

  1. {{/* vim: set filetype=mustache: */}}
  2. {{- /*
  3. service.labels.standard prints the standard service Helm labels.
  4. The standard labels are frequently used in metadata.
  5. */ -}}
  6. {{- define "service.microservice.labels" -}}
  7. choerodon.io/version: {{ .Chart.Version | quote }}
  8. choerodon.io/service: {{ .Chart.Name | quote }}
  9. choerodon.io/metrics-port: {{ .Values.deployment.managementPort | quote }}
  10. {{- end -}}
  11. {{- define "service.labels.standard" -}}
  12. choerodon.io/release: {{ .Release.Name | quote }}
  13. {{- end -}}
  14. {{- define "service.match.labels" -}}
  15. choerodon.io/release: {{ .Release.Name | quote }}
  16. {{- end -}}
  17. {{- define "service.logging.deployment.label" -}}
  18. choerodon.io/logs-parser: {{ .Values.logs.parser | quote }}
  19. {{- end -}}
  20. {{- define "service.monitoring.pod.annotations" -}}
  21. choerodon.io/metrics-group: {{ .Values.metrics.group | quote }}
  22. choerodon.io/metrics-path: {{ .Values.metrics.path | quote }}
  23. {{- end -}}
  24. {{/*
  25. Return the appropriate apiVersion for deployment.
  26. */}}
  27. {{- define "app.deployment.apiVersion" -}}
  28. {{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}}
  29. {{- print "apps/v1beta2" -}}
  30. {{- else -}}
  31. {{- print "apps/v1" -}}
  32. {{- end -}}
  33. {{- end -}}
  34. {{/*
  35. Return the appropriate apiVersion for ingress.
  36. */}}
  37. {{- define "app.ingress.apiVersion" -}}
  38. {{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
  39. {{- print "extensions/v1beta1" -}}
  40. {{- else -}}
  41. {{- print "networking.k8s.io/v1beta1" -}}
  42. {{- end -}}
  43. {{- end -}}

第三步: 编写deployment.yml文件 在 templates文件夹下创建一个名为 deployment.yml的文件,内容如下:

  1. apiVersion: {{ include "app.deployment.apiVersion" . }}
  2. kind: Deployment
  3. metadata:
  4. name: {{ .Release.Name }}
  5. labels:
  6. {{ include "service.labels.standard" . | indent 4 }}
  7. {{ include "service.logging.deployment.label" . | indent 4 }}
  8. spec:
  9. replicas: {{ .Values.replicaCount }}
  10. selector:
  11. matchLabels:
  12. {{ include "service.labels.standard" . | indent 6 }}
  13. template:
  14. metadata:
  15. labels:
  16. {{ include "service.labels.standard" . | indent 8 }}
  17. {{ include "service.microservice.labels" . | indent 8 }}
  18. annotations:
  19. {{ include "service.monitoring.pod.annotations" . | indent 8 }}
  20. spec:
  21. containers:
  22. - name: {{ .Release.Name }}
  23. image: "{{ .Values.image.repository }}:{{ .Chart.Version }}"
  24. imagePullPolicy: {{ .Values.image.pullPolicy }}
  25. env:
  26. {{- range $name, $value := .Values.env.open }}
  27. {{- if not (empty $value) }}
  28. - name: {{ $name | quote }}
  29. value: {{ $value | quote }}
  30. {{- end }}
  31. {{- end }}
  32. ports:
  33. - name: http
  34. containerPort: {{ .Values.service.port }}
  35. protocol: TCP
  36. readinessProbe:
  37. exec:
  38. command: ["/bin/sh","-c","curl -s localhost:{{ .Values.deployment.managementPort }}/actuator/health --fail && nc -z localhost {{ .Values.service.port }}"]
  39. failureThreshold: 3
  40. initialDelaySeconds: 60
  41. periodSeconds: 10
  42. successThreshold: 1
  43. timeoutSeconds: 10
  44. resources:
  45. {{ toYaml .Values.resources | indent 12 }}

第四步:编写Chart.yaml文件 在halm-dev文件夹中编写 Chart.yaml文件,这个文件中写明应用的的相关信息。

  1. apiVersion: v1
  2. appVersion: "1.0"
  3. description: A Helm chart for Kubernetes
  4. name: choerodon-todo-servie
  5. version: 0.1.0

第五步:编写文件 在charts/choerodon-todo-service文件夹中编写 values.yaml文件,这个文件中编写 templates文件夹中 deployment.yml文件(以及其它清单文件)会用到的变量及默认值。

  1. # Default values for manager-service.
  2. # This is a YAML-formatted file.
  3. # Declare variables to be passed into your templates.
  4. # pod运行数量
  5. replicaCount: 1
  6. image:
  7. # 镜像库地址
  8. repository: registry.cn-hangzhou.aliyuncs.com/feifei-feifei-05/choerodon-todo-servie
  9. # 镜像拉取策略
  10. pullPolicy: IfNotPresent
  11. preJob:
  12. # job超时时间
  13. timeout: 300
  14. # job镜像库地址
  15. image: registry.cn-hangzhou.aliyuncs.com/choerodon-tools/dbtool:0.6.7
  16. preConfig:
  17. # 是否初始化manager_service数据库
  18. enabled: true
  19. # 初始化到配置中心文件名
  20. configFile: application.yml
  21. # 初始化到配置中心存储方式
  22. configType: k8s
  23. # 注册中心地址
  24. registerHost: http://register-server:8000
  25. datasource:
  26. # manager_service数据库连接地址
  27. url: jdbc:mysql://localhost:3306/manager_service?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true
  28. # manager_service数据库用户名
  29. username: choerodon
  30. # manager_service数据库密码
  31. password: 123456
  32. preInitDB:
  33. # 是否初始化demo_service数据库
  34. enabled: true
  35. datasource:
  36. # demo_service数据库连接地址
  37. url: jdbc:mysql://localhost:3306/demo_service?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true
  38. # demo_service数据库用户名
  39. username: choerodon
  40. # demo_service数据库密码
  41. password: 123456
  42. deployment:
  43. # 服务管理端口
  44. managementPort: 18081
  45. env:
  46. open:
  47. # 注册服务地址
  48. EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://register-server.io-choerodon:8000/eureka/
  49. # 是否启用配置中心
  50. SPRING_CLOUD_CONFIG_ENABLED: true
  51. # 配置中心地址
  52. SPRING_CLOUD_CONFIG_URI: http://config-server.framework:8010/
  53. # 数据库连接地址
  54. SPRING_DATASOURCE_URL: jdbc:mysql://localhost::3306/demo_service?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true
  55. # 数据库用户名
  56. SPRING_DATASOURCE_USERNAME: choerodon
  57. # 数据库密码
  58. SPRING_DATASOURCE_PASSWORD: 123456
  59. metrics:
  60. # 收集应用的指标数据路径
  61. path: /prometheus
  62. # 性能指标应用分组
  63. group: spring-boot
  64. logs:
  65. # 日志收集格式
  66. parser: spring-boot
  67. persistence:
  68. # 是否启用持久化存储
  69. enabled: false
  70. # 绑定的pvc名称
  71. # existingClaim:
  72. # 持久化路径
  73. # subPath:
  74. service:
  75. # 是否创建k8s service
  76. enabled: false
  77. # service类型
  78. type: ClusterIP
  79. # service端口
  80. port: 18080
  81. # service名称
  82. name: choerodon-todo-servie
  83. ingress:
  84. # 是否创建k8s ingress
  85. enabled: false
  86. resources:
  87. # k8s中容器能使用资源的资源最大值
  88. limits:
  89. # cpu: 100m
  90. memory: 2Gi
  91. # k8s中容器使用的最小资源需求
  92. requests:
  93. # cpu: 100m
  94. memory: 1.5Gi

CI文件配置

Choerodon使用Gitlab-CI作为CI工具,需要在应用源代码中加上.gitlab-ci.yml文件。

.gitlab-ci.yml是用于指导gitlab进行自动化的持续集成步骤的

在CI中主要的工作就是进行镜像构建, 并且生成Chart包,最后将Chart包上传至Choerodon,与Choerodon进行集成。

在项目根目录下新建.gitlab-ci.yml文件,粘贴以下内容:

  1. # 设置CI运行时的环境镜像
  2. image: registry.cn-shanghai.aliyuncs.com/c7n/cibase:0.9.1
  3. # 设置阶段,第一个阶段构建镜像, 第二个阶段构建chart包并上传至Choerodon
  4. stages:
  5. - docker-build
  6. - chart-build
  7. docker-build:
  8. stage: docker-build
  9. # 阶段中需要执行的命令
  10. script:
  11. # 进行sonar分析
  12. - >-
  13. mvn --batch-mode verify sonar:sonar
  14. -Dsonar.host.url=$SONAR_URL
  15. -Dsonar.login=$SONAR_LOGIN
  16. -Dsonar.gitlab.project_id=$CI_PROJECT_PATH
  17. -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA
  18. -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
  19. -Dsonar.analysis.serviceGroup=$GROUP_NAME
  20. -Dsonar.analysis.commitId=$CI_COMMIT_SHA
  21. -Dsonar.projectKey=${GROUP_NAME}:${PROJECT_NAME}
  22. # 打包生成springboot的jar
  23. - mvn clean package spring-boot:repackage
  24. # 将生成的jar包移动到docker目录下
  25. - mv target/app.jar docker
  26. # 这个命令是使用kaniko进行更安全的镜像打包
  27. # 其中, -c 参数后是Docker构建上下文, 一般包含需要打包到镜像中的文件(jar包,二进制文件等)
  28. # -f 参数指定Dockerfile的位置 (根据实际位置)
  29. # 可选参数: --skip-tls-verify用于跳过harbor的证书校验
  30. # 剩余的 ${DOCKER_REGISTRY} ${GROUP_NAME} ${PROJECT_NAME} ${CI_COMMIT_TAG} 变量都是Choerodon的CI内置变量
  31. - kaniko -c $PWD/docker -f $PWD/docker/Dockerfile -d ${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}:${CI_COMMIT_TAG}
  32. chart-build:
  33. stage: chart-build
  34. script:
  35. # 这是猪齿鱼内置的CI函数, 生成chart包并上传到猪齿鱼
  36. - chart_build
  37. # 这里是最为关键的,定义了一个全局脚本,在每一个阶段运行前都将执行下面代码从Choerodon平台中获取相应变量及封装的shell函数。
  38. .auto_devops: &auto_devops |
  39. http_status_code=`curl -o .auto_devops.sh -s -m 10 --connect-timeout 10 -w %{http_code} "${CHOERODON_URL}/devops/ci?token=${Token}"`
  40. if [ "$http_status_code" != "200" ]; then
  41. cat .auto_devops.sh
  42. exit 1
  43. fi
  44. source .auto_devops.sh
  45. before_script:
  46. - *auto_devops

下一步

开发应用服务