暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于AWS EKS的K8S实践 - Jenkins自动化部署

466



Hi~朋友,关注置顶防止错过消息


基于AWS EKS的K8S实践系列文章是基于企业级的实战文章,一些设置信息需要根据公司自身要求进行设置,如果大家有问题讨论或咨询可以加我微信(公众号后台回复 程序员修炼笔记 可获取联系方式)。

Jenkins搭建

Jenkins的搭建工作按照官网的文档来进行就可以,这里建议主节点和工作节点分开,主节点不负责构建任务。

Jenkins的工作节点需要安装以下工具:

  • AWS Cli

  • Kubectl

  • docker

Jenkins需要安装以下插件:

  • Kubernetes plugin

  • Git Parameter Plugin

让Jenkins可以连接集群

由于我们之前没有k8s集群,因此这里Jenkins我们还是使用之前部署在云主机上的Jenkins(不在k8s集群中),首先需要修改aws-auth ConfigMap,如下:

  1. kubectl edit configmap -n kube-system aws-auth

需要在aws-auth ConfigMap中增加红框中的内容,其中rolearn是Jenkins Slave节点上的role。

最后Jenkins在执行连接集群的时候使用的是匿名用户,我这里比较简单粗暴,直接允许匿名用户访问集群所有资源,如下:

  1. kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

准备应用DeploymentFile模板文件

  1. apiVersion: apps/v1

  2. kind: Deployment

  3. metadata:

  4. namespace: application-dev

  5. name: xxxx

  6. labels:

  7. app: xxxx

  8. spec:

  9. replicas: 2

  10. selector:

  11. matchLabels:

  12. app: xxxx

  13. strategy:

  14. type: RollingUpdate

  15. rollingUpdate:

  16. maxUnavailable: 25%

  17. maxSurge: 25%

  18. template:

  19. metadata:

  20. labels:

  21. app: xxxx

  22. spec:

  23. restartPolicy: Always

  24. containers:

  25. - name: xxxx

  26. image: DEPLOY_IMAGE

  27. imagePullPolicy: Always

  28. ports:

  29. - containerPort: 8004

  30. protocol: TCP

  31. livenessProbe:

  32. httpGet:

  33. port: 8004

  34. path: "/health/check"

  35. initialDelaySeconds: 180

  36. periodSeconds: 5

  37. timeoutSeconds: 5

  38. failureThreshold: 3

  39. readinessProbe:

  40. httpGet:

  41. port: 8004

  42. path: "/health/check"

  43. initialDelaySeconds: 90

  44. periodSeconds: 5

  45. timeoutSeconds: 5

  46. successThreshold: 5

  47. failureThreshold: 3

以上模板文件大家根据公司的实际应用情况定制,目前我这里只需要在部署的时候替换镜像的版本(DEPLOY_IMAGE),其他的配置如果大家有人力开发自己的持续交付系统,像健康检测的地址Pod的数量也可以做成可配置的,在实际部署时进行替换。

Jenkins项目配置

这里我们选择自由风格类型的项目,后续我们会把Jenkins只用做构建,目前暂时没有持续集成交付系统,Jenkins是既要负责构建也要负责部署。

  1. 设置旧的构建的丢弃策略,如下图:

2. 设置Git构建参数,如下图:

红框中的地方替换成自己的Git项目地址。

3. 设置部署模块参数,类型为Extended Choice Parameter,如下图:

我们一个应用可能会有多个模块,比如app、admin之类的,这里是在我们构建部署的时候去选择,表明我们是去构建部署哪个模块(也可以全选)。

4. 设置部署环境参数,如下图:

通常我们一般会有多套应用环境,比如开发、测试、生产、UAT、预发等,这里的参数可以根据公司实际的应用环境进行填写。

5. 增加一个隐藏参数,用来设置项目名称,该参数不需要由用户选择,但是会在我们的构建脚本中进行使用,如下图:

6. 设置编译环境和Jenkins Slave节点,如下图:

比如我们这里的是Java应用,JDK版本需要根据每个应用的来定,比如选择是JDK8还是JDK11。

7. 设置代码仓库,如下图:

  • Repository URL用来设置Git仓库的地址

  • Credentials用来设置连接Git仓库的凭证

  • Branches to build用来指定拉取代码的分支,这里可以看到我们用到了变量,变量的值取自我们第2步选择的值(也就是构建时选择的分支)

8. 设置构建环境,如下图:

这里我们设置k8s集群的地址和凭证,方便我们在部署时能够连接到k8s集群上。

9. 设置Build Steps,我们这里选择Shell,具体的脚本如下:

  1. #!/bin/bash -e


  2. ### 解析需要部署的Module

  3. deploy_modules=(${DEPLOY_MODULE//,/ })


  4. echo ">>>>>>>>>>>>>>>>开始编译代码<<<<<<<<<<<<<<<<<<<<<<"

  5. # 编译Java代码,这里需要根据每个应用来决定,我们这里是gradle

  6. ./gradlew build -x test

  7. echo ">>>>>>>>>>>>>>>>结束编译代码<<<<<<<<<<<<<<<<<<<<<<"

  8. ### 我们这里使用的AWS ECR作为镜像仓库,这里请替换成公司的真实地址

  9. ECR=xxxxxx.dkr.ecr.ap-southeast-3.amazonaws.com

  10. ### 定义镜像仓库,需要提前在ECR上建好

  11. REPOSITORY_URI=${ECR}/${PROJECT_NAME}

  12. ### 登录AWS ECR,这样后续可以进行镜像的推送

  13. aws ecr get-login-password --region ap-southeast-3 | docker login --username AWS --password-stdin ${ECR}


  14. IMAGE_TAG_SUFFIX=$(echo ${GIT_COMMIT} | cut -c 1-7)


  15. ### 定义部署脚本的临时目录

  16. K8S_DEPLOY_LOCATION_PREFIX=/tmp/deploy-scripts/${PROJECT_NAME}/${BUILD_NUMBER}

  17. mkdir -p ${K8S_DEPLOY_LOCATION_PREFIX}


  18. ### 按照部署模块生成构建镜像和部署脚本

  19. for i in "${!deploy_modules[@]}"; do


  20. APPLICATION_MODULE=${deploy_modules[i]}

  21. DOCKER_FILE_NAME=${APPLICATION_MODULE}-dockerfile

  22. IMAGE_NAME=$REPOSITORY_URI:${APPLICATION_MODULE}-${IMAGE_TAG_SUFFIX}


  23. SOURCE_FILE=${APPLICATION_MODULE}/deploy-${DEPLOY_ENV}.yaml

  24. TARGET_FILE=${K8S_DEPLOY_LOCATION_PREFIX}/${SOURCE_FILE}


  25. DEPLOY_IMAGE=$(echo "${IMAGE_NAME}" | sed -e 's/\//\\\//g')


  26. echo ">>>>>>>>>>>>>>>>开始构建应用模块:${APPLICATION_MODULE}<<<<<<<<<<<<<<<<<<<<<<"


  27. ### 从s3上拷贝模块的Dockerfile到本地,Dockefile请提前在s3上存储好

  28. aws s3 cp s3://xxx-bucket/dockerfiles/${PROJECT_NAME}/${DOCKER_FILE_NAME} .


  29. ### 构建并推送镜像到ECR

  30. docker build -t ${IMAGE_NAME} -f ./${DOCKER_FILE_NAME} .

  31. docker push ${IMAGE_NAME} && docker rmi ${IMAGE_NAME}


  32. ### 将应用的Deployment文件拷贝到本地,模板文件请提前在s3上存储好

  33. aws s3 cp s3://xxx-bucket/k8s-deployment-templates/${PROJECT_NAME}/${SOURCE_FILE} ${TARGET_FILE}


  34. ### 替换Deployment中的镜像版本

  35. sed -i "s/DEPLOY_IMAGE/${DEPLOY_IMAGE}/g" ${TARGET_FILE}

  36. ### 清理无用的Dockerfile

  37. rm -rf ${DOCKER_FILE_NAME}

  38. echo ">>>>>>>>>>>>>>>>结束构建应用模块:${APPLICATION_MODULE}<<<<<<<<<<<<<<<<<<<<<<"

  39. done


  40. ### 保存此次部署执行的脚本及相关文件到S3

  41. aws s3 cp ${K8S_DEPLOY_LOCATION_PREFIX} s3://xxx-bucket/build-artifacts/${PROJECT_NAME}/${BUILD_NUMBER}/ --recursive --quiet


  42. ### 按模块执行部署

  43. for i in "${!deploy_modules[@]}"; do

  44. APPLICATION_MODULE=${deploy_modules[i]}

  45. echo ">>>>>>>>>>>>>>>>开始部署:${APPLICATION_MODULE}-${DEPLOY_ENV}<<<<<<<<<<<<<<<<<<<<<<"

  46. kubectl apply -f ${K8S_DEPLOY_LOCATION_PREFIX}/${APPLICATION_MODULE}/deploy-${DEPLOY_ENV}.yaml -v=2

  47. echo ">>>>>>>>>>>>>>>>结束部署:${APPLICATION_MODULE}-${DEPLOY_ENV}<<<<<<<<<<<<<<<<<<<<<<"

  48. done


  49. ### 删除本地的部署脚本,避免占用构建服务过多空间

  50. rm -rf ${K8S_DEPLOY_LOCATION_PREFIX}

构建触发

我们选择分支,部署模块,部署环境即可开始构建,如下图:


【知识星球招募】


  知识星球正在初期搭建中,在星球中可以互相提问,分享经验,我也会在星球中分享基础技术架构的全流程搭建,包括但不仅限于DevOps,监控、Flink开发,Java开发(JVM、多线程、MySQL数据库)等相关技术类文章,期待大家的加入




文章转载自程序员修炼笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论