当前位置:   article > 正文

k8s管理容器 gitlab配合Jenkins 实现持续CI/CD

k8s管理容器 gitlab配合Jenkins 实现持续CI/CD

一、部署Jenkins(建议使用安装版jenkins,docker版的容器里套容器会有问题,且不合理)

1.更新yum源:

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

2.下载安装包
wget https://pkg.jenkins.io/redhat/jenkins-2.156-1.1.noarch.rpm

3.安装
 rpm -ivh jenkins-2.156-1.1.noarch.rpm

4,修改配置:

vim /etc/sysconfig/jenkins

5,浏览器访问自己配置的端口

此时需要输入密码,具体看浏览器显示的那个路径,去看一下:cat xxx

6.安装插件 所有关于pipleline的插件都需要安装,如果安装有问题的,可以直接跳过,

此时会提醒更新最新版本Jenkins,点更新就好,

此时在这里更新刚刚没有下好的插件

(此时可以试一下该机器是否可以clone代码)

git init git remote add origin ssh://git@gitlab.idig8.com:2222/liming/microservice.git git add . git commit -m "Initial commit" git push -u origin master
二、建个流水线的项目:

1.Jenkins中:

配置scm

这里的Jenkinsfile是放在项目中的,Jenkins构建时就会去找该脚本
脚本示范:

  1. // 需要在jenkins的Credentials设置中配置jenkins-harbor-creds、jenkins-k8s-config参数
  2. pipeline {
  3. agent any
  4. environment {
  5. HARBOR_CREDS = credentials('jenkins-harbor-creds')
  6. K8S_CONFIG = credentials('jenkins-k8s-config')
  7. GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
  8. }
  9. parameters {
  10. string(name: 'HARBOR_HOST', defaultValue: '仓库ip', description: 'harbor仓库地址')
  11. string(name: 'DOCKER_IMAGE', defaultValue: 'tssp/pipeline-demo', description: 'docker镜像名')
  12. string(name: 'APP_NAME', defaultValue: 'pipeline-demo', description: 'k8s中标签名')
  13. string(name: 'K8S_NAMESPACE', defaultValue: 'demo', description: 'k8s的namespace名称')
  14. }
  15. stages {
  16. stage('Maven Build') {
  17. when { expression { env.GIT_TAG != null } }
  18. agent {
  19. docker {
  20. image 'maven:3-jdk-8-alpine'
  21. args '-v $HOME/.m2:/root/.m2'
  22. }
  23. }
  24. steps {
  25. sh 'mvn clean package -Dfile.encoding=UTF-8 -DskipTests=true'
  26. stash includes: 'target/*.jar', name: 'app'
  27. }
  28. }
  29. stage('Docker Build') {
  30. when {
  31. allOf {
  32. expression { env.GIT_TAG != null }
  33. }
  34. }
  35. agent any
  36. steps {
  37. unstash 'app'
  38. sh "docker login -u ${HARBOR_CREDS_USR} -p ${HARBOR_CREDS_PSW} ${params.HARBOR_HOST}"
  39. sh "docker build --build-arg JAR_FILE=`ls target/*.jar |cut -d '/' -f2` -t ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG} ."
  40. sh "docker push ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
  41. sh "docker rmi ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
  42. }
  43. }
  44. stage('Deploy') {
  45. when {
  46. allOf {
  47. expression { env.GIT_TAG != null }
  48. }
  49. }
  50. agent {
  51. docker {
  52. image 'lwolf/helm-kubectl-docker'
  53. }
  54. }
  55. steps {
  56. sh "mkdir -p ~/.kube"
  57. sh "echo ${K8S_CONFIG} | base64 -d > ~/.kube/config"
  58. sh "sed -e 's#{IMAGE_URL}#${params.HARBOR_HOST}/${params.DOCKER_IMAGE}#g;s#{IMAGE_TAG}#${GIT_TAG}#g;s#{APP_NAME}#${params.APP_NAME}#g;s#{SPRING_PROFILE}#k8s-test#g' k8s-deployment.tpl > k8s-deployment.yml"
  59. sh "kubectl apply -f k8s-deployment.yml --namespace=${params.K8S_NAMESPACE}"
  60. }
  61. }
  62. }
  63. }

三、配置git调用Jenkins打包:

1.在Jenkins中配置令牌:

如果没有此功能,这是由于权限问题导致的

注释:跨站请求伪造保护最新Jenkins页面无法开启,在安装目录设置:
vim /etc/sysconfig/jenkins

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
配置后需要重启jenkins:
service jenkins restart
生效后就如前图所示


2.复制链接到刚刚gitab打开的触发器页面:

此时如果gitlab设置Webhooks报错Urlis blocked: Requests to localhost are not allowed。admin 登录设置

然后再添加完毕:

然后可以测试一下:

返回201,说明成功(注意 JENKINS_URL/job/jobname/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME)

此时Jenkins的构建任务也在运行了

四、对刚刚列出的脚本说明:

最好是用安装办maven,案例中使用的maven是docker镜像,想修改setting文件的话有点麻烦

如果使用当机器的maven,此时需要下载Jenkins的maven插件:

全局配置中要配置一下

还有环境变量也要配置一下:

这时才可以在Jenkinsfile中使用mvn命令

3.dockerbuild:

这里步骤中的五句话:

第一句,使用的哪个app包

第二句,登录Harbor

第三句,制作临时镜像 ,此时会使用到dockerfile,可以参考docker的搭建,写一个dockerfile,示范:

  1. FROM openjdk:8-jdk-alpine
  2. #构建参数
  3. ARG JAR_FILE
  4. ARG WORK_PATH="/opt/demo"
  5. # 环境变量
  6. ENV JAVA_OPTS="" \
  7. JAR_FILE=${JAR_FILE}
  8. # 切换源
  9. RUN sed -i 's/http\:\/\/dl-cdn.alpinelinux.org/https\:\/\/mirrors.ustc.edu.cn/g' /etc/apk/repositories
  10. #设置时区
  11. RUN apk update && apk add ca-certificates && \
  12. apk add tzdata && \
  13. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
  14. echo "Asia/Shanghai" > /etc/timezone
  15. COPY target/$JAR_FILE $WORK_PATH/
  16. WORKDIR $WORK_PATH
  17. ENTRYPOINT exec java $JAVA_OPTS -jar $JAR_FILE

示范中的命令:

这个有可能因为网络原因下载失败,此时在他的上一步添加一行切换源就可以了:

RUN sed -i 's/http\:\/\/dl-cdn.alpinelinux.org/https\:\/\/mirrors.ustc.edu.cn/g' /etc/apk/repositories

注意:哪个项目需要发布的,dockerfile就在哪个项目下

第四句,推送镜像

第五句,删除本地临时镜像

4.发布:

这里使用的kubectl镜像命令发布

四句话:

第一句,创建文件夹

第二句 ,寻找下一步使用的config,来验证k8s

第三句,这个项目中有个发布模板,参考k8s搭建中发布模板,这个命令是讲参数写入模板.tpl,生成发布文件yml ,附上tpl示范:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: {APP_NAME}-deployment
  5. labels:
  6. app: {APP_NAME}
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: {APP_NAME}
  12. template:
  13. metadata:
  14. labels:
  15. app: {APP_NAME}
  16. spec:
  17. containers:
  18. - name: {APP_NAME}
  19. image: {IMAGE_URL}:{IMAGE_TAG}
  20. ports:
  21. - containerPort: 40080
  22. env:
  23. - name: SPRING_PROFILES_ACTIVE
  24. value: {SPRING_PROFILE}

第四句,发布

五、上一步中有登录harbor,此处需要配置密码:

还需要配置k8s的kube.config,示范配置:

apiVersion: v1kind: Configclusters:- name: "test" cluster: server: "https://ip" api-version: v1 certificate-authority-data: "xxxxxx"users:- name: "root" user: token: "你的token"contexts:- name: "test" context: user: "user1" cluster: "test"current-context: "test

然后编码:

base64 kube-config.yml > kube-config.txt
然后类似上一步,在jenkins凭据中增加配置文件内容。在凭据设置界面,类型选择为“Secret text”,ID设置为“jenkins-k8s-config”(此处的ID必须与Jenkinsfile中的保持一致),Secret设置为上面经过base64编码后的配置文件内容。

六、测试任务,立即构建:

成功后可以在镜像仓库中查看到镜像:

可以在k8s面板中看到运行的服务:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/960819
推荐阅读
相关标签
  

闽ICP备14008679号