6. k8s + jenkins 实现持续集成(完)

前端之家收集整理的这篇文章主要介绍了6. k8s + jenkins 实现持续集成(完)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一.  在node节点上安装软件. 具体软件内容如下

  1. 1. 下载jdk
  2. 下载tar包,上传node https://pan.baidu.com/s/18IicPYf7W0j-sHBXvfKyyg

    配置环境变量

export JAVA_HOME=/home/jdk1.8.0_161
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH

  1.  
  1. 2. 下载tomcat,到node的/home目录下
  2. wget https:mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
  1. 3. 下载jenkins 到/home
  2. wget http:mirrors.jenkins-ci.org/war/latest/jenkins.war

    jenkinswar放到tomcatwebaap目录下
    mv
    jenkins.war /home/tomcat9/webapps

    启动tomcat
  1.  
  1. 4. 下载git,直接在node执行命令
  2. apt-get install get
  1. 5. 下载maven,到/home目录
  2. wget https:mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

    解压,mv maven... maven3

    配置环境变量

export M2_HOME=/home/maven3
export CLASSPATH=$CLASSPATH:$M2_HOME/lib
export PATH=$PATH:$M2_HOME/bin



  1. 修改maven仓库,maven3/conf/settings.xml
      <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>*</mirrorOf>
      </mirror>

 

二. jenkins配置

1. 在浏览器输入http://192.168.1.104:8080/jenkins/

然后,在服务器找到初始密码,填入

2. 选择手动安装插件

 

 

 

3. 选择安装的插件

  1. ssh/publish over ssh
  2. git/git parameter
  3. maven Integration plugin

手动添加maven插件

管理-->插件管理-->搜索maven Integration

 

 4. jenkins全局工具配置中,配置jdk/git/maven

 进入系统配置-->全局工具配置

 

 配置jdk和git

 

 

 

 

 三. jenkins + k8s发布实例

三个目标:

  • Registry安装配置和使用
  • jenkins项目创建和配置
  • jenkins项目构建

 1. docker的Registry的安装和配置

在node节点上,获取registry镜像

  1. docker pull registry

启动容器

  1. docker run -p 5000:5000 -v /home/registry_images:/var/lib/registry -d registry

 这里将registry挂载到了本地目录,避免docker重启后,镜像丢失

2. registry的使用

修改master机器上的registry容器为所在的宿主机

  1. /etc/docker/daemon.json
  1. {
  2. "insecure-registries":["192.168.1.104:5000"],//修改为registry所在容器的宿主机
  3. "registry-mirrors": [https://w52p8twk.mirror.aliyuncs.com"]
  4. }

我的registry在node节点上,node的ip是192.168.1.104

重启docker

  1. systemctl daemon-reload
  2. systemctl restart docker

 

下载一个Nginx上传到Registry仓库 

  1. 领取Nginx镜像
  2. docker pull Nginx
  3. 改名
  4. docker tag Nginx 192.168.1.104:5000/Nginx:test

尝试把 192.168.1.104:5000/Nginx:test上传到我们的Registry仓库

  1. docker push 5000/Nginx:test

 可以成功push,说明我们的仓库是创建成功了.

 下面在node上做同样的操作. 修改/etc/docker/daemon.json文件

  1. {
  2. insecure-registries":[192.168.1.104:5000],]
  3. }

重启docker

  1. systemctl daemon-reload
  2. systemctl restart docker

 

 3. 在Jenkins上构建项目

  1. 构建的整体流程:
  2. 1. 设置参数化构建
  3. 2. 设置代码库的地址
  4. 3. 设置maven的构建命令,执行后会打包出一个jar包,将jar打包成一个动态镜像,并推到镜像仓库中
  5. 4. 将应用部署的yaml文件拷贝到k8smaster节点上,然后执行命令,让k8s根据yaml文件启动应用

 

  • 创建一个maven项目 

 

 

 

 

 

  • 勾选丢弃旧的构建,  保持构建的天数为2天,最大构建个数为2个

 

 

 

  •  勾选参数化构建,选择git参数,名称填写branch,参数类型是分支或标签

目的是: 可以根据分支进行构建.或者标签进行构建

https://github.com/solochen84/SpringBootDemo

 

  • 下面开始构建项目

项目地址: https://github.com/solochen84/SpringBootDemo

git项目地址: https://github.com/solochen84/SpringBootDemo.git

 

 

 这个项目是public的,所以,不需要配置Credentials

@H_668_403@

 

 

 

  • 设置构建后,将jar包打包成docker镜像,并推送到Registry

设置构建完之后执行的动作

 

 

 

 

 

 脚本内容

  1. #!/bin/sh
  2. jarName=spring-boot-demo-0.0.1-SNAPSHOT.jar
  3. jarFolder=ph
  4. projectName=ph
  5. docker_path=${WORKSPACE}
  6. cp ${WORKSPACE}/target/${jarName} ${docker_path}
  7. sh /root/docker_dir/deploy_docker.sh ${projectName} ${docker_path} ${jarName}
  1. 创建deploy_docker文件. 目录: /root/docker_dir/deploy_docker.sh. 文件内容如下

    设置文件的可执行权限
  1. chmod 775 deploy_docker.sh

 

deploy_docker.sh文件内容

  1. #!/bin/sh
  2. # maven01 $workspace $jarname
  3. # ${projectName} ${docker_path} ${jarName}
  4. set -e
  5. projectName=$
  6. docker_path=$
  7. appName=$3
  8. #user_name=
  9. #password=
  10. tag=$(date +%s)
  11. server_path=5000
  12. target_image=${projectName}:${tag}
  13. #${BUILD_NUMBER}
  14. echo ${target_image}
  15. cd ${docker_path}
  16. docker build --build-arg app=${appName} -t ${target_image} .
  17. docker tag ${target_image} ${server_path}/${projectName}
  18. echo The name of image is ${server_path}\/${target_image}"
  • 设置jenkins服务器到k8s master ssh免密登录

设置了免密登录,jenkins就可以到k8s上运行脚本,执行命令

    • 在jenkins所在服务器上执行
  1. 生成秘钥
  2. ssh-keygen -t rsa
  3. 拷贝公钥
  4. ssh-copy-id -i ~/.ssh/id_rsa.pub root@1.106

ssh root@192.168.1.106

 

  • 设置构建后操作,将yaml文件拷贝到k8s master 上并运行应用 

yaml文件的位置,是在项目里面的.  

 

 

  

  1. e
  2. echo ok
  3. echo ${WORKSPACE}
  4. docker_path=${WORKSPACE}
  5. scp ${WORKSPACE}/*.yaml 192.168.1.106:/root/
  6. ssh 192.168.1.106 '/usr/bin/kubectl apply -f /root/kube.yaml'
  7. ssh 192.168.1.106 '/usr/bin/kubectl get svc|grep maven'

这里的ip地址填master的ip地址

  • Jenkins项目构建

 

构建的过程中,会出现各种各样的问题

1. no matches for kind "Deployment" in version "extensions/v1beta1"

 

 

 参考文章https://www.cnblogs.com/nnylee/p/11779653.html

 

修改对应的shell脚本

 

 

 

  1. .yaml 192.168.1.106:/root/
  2. ssh 192.168.1.106 'sed -i "s|extensions/v1beta1|apps/v1|" /root/kube.yaml'
  3. ssh 192.168.1.106 'sed -i "s|192.168.0.108|192.168.1.104|" /root/kube.yaml'
  4. ssh 192.168.1.106 '/usr/bin/kubectl apply -f /root/kube.yaml --validate=false'
  5. ssh 192.168.1.106 '/usr/bin/kubectl get svc|grep maven'

2. spec.template.Metadata.labels: Invalid value: map[string]string{"app":"maven"}: `selector` does not match template `labels`.

  Build step 'Execute shell' marked build as failure

参考的是这篇文章https://www.cnblogs.com/robinunix/p/11155860.html

 

 

 我修改后的配置

 

  1. apiVersion: v1
  2. kind: Service
  3. Metadata:
  4. name: maven-service
  5. spec:
  6. type: NodePort
  7. ports:
  8. - name: maven
  9. port: 8080
  10. nodePort: 31002
  11. targetPort:
  12. protocol: TCP
  13. selector:
  14. app: maven
  15. ---
  16. apiVersion: apps/v1
  17. kind: Deployment
  18. Metadata:
  19. #name: maven-deployment
  20. name: maven
  21. spec:
  22. selector:
  23. matchLabels:
  24. app: maven
  25. replicas:
  26. template:
  27. Metadata:
  28. labels:
  29. app: maven
  30. spec:
  31. containers:
  32. - name: maven
  33. image: 192.168.1.104:5000/maven:latest
  34. ports:
  35. - containerPort:
  36. env:
  37. - name: key
  38. value: value"

然后重新启动,成功!

  1. kubectl get deployments --all-namespaces

 

发现,name为maven的deployment的Ready状态是0个

查看pod

  1. kubectl get pod --all-namespaces

 

 发现有一个pending状态

查看pod的日志

  1. kubectl describe pod maven-7589958577-5ms68 -n default

猜你在找的Kubernetes相关文章