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

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

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


1. 下载jdk
下载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


2. 下载tomcat,  到node的/home目录下
wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz


3. 下载jenkins 到/home
wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
将jenkins的war放到tomcat的webaap目录下
mv jenkins.war /home/tomcat9/webapps
启动tomcat


4. 下载git,  直接在node执行命令
apt-get install get


5. 下载maven,  到/home目录
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
修改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. 选择手动安装插件

微信图片_20220511215644.png


3. 选择安装的插件


ssh/publish over ssh
git/git parameter
maven Integration plugin


手动添加maven插件


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


微信图片_20220511215716.png


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


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

微信图片_20220511215732.png

配置jdk和git

微信图片_20220511215755.png微信图片_20220511215759.png 三. jenkins + k8s发布实例


三个目标:


Registry安装配置和使用


jenkins项目创建和配置


jenkins项目构建


1. docker的Registry的安装和配置


在node节点上, 获取registry镜像


docker pull registry


启动容器


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


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


2. registry的使用


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


/etc/docker/daemon.json


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


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


重启docker


systemctl daemon-reload
systemctl restart docker


下载一个nginx并上传到Registry仓库


领取nginx镜像
docker pull nginx
改名
docker tag nginx 192.168.1.104:5000/nginx:test


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


docker push 192.168.1.104:5000/nginx:test


微信图片_20220511215956.png


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


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


{
  "insecure-registries":["192.168.1.104:5000"],
  "registry-mirrors": ["https://w52p8twk.mirror.aliyuncs.com"]
}


重启docker


systemctl daemon-reload
systemctl restart docker


3. 在Jenkins上构建项目


构建的整体流程:


1. 设置参数化构建


2. 设置代码库的地址


3. 设置maven的构建命令, 执行后会打包出一个jar包, 将jar打包成一个动态镜像, 并推到镜像仓库中


4. 将应用部署的yaml文件拷贝到k8s的master节点上, 然后执行命令, 让k8s根据yaml文件启动应用

 

  • 创建一个maven项目
  • 微信图片_20220511220052.png微信图片_20220511220123.png

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

微信图片_20220511220138.png


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


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


https://github.com/solochen84/SpringBootDemo

 

  • 下面开始构建项目


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


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


微信图片_20220511220203.png


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


  • 添加maven构建


微信图片_20220511220218.png


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


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


微信图片_20220511220231.png微信图片_20220511220240.png


脚本内容


#!/bin/sh
jarName=spring-boot-demo-0.0.1-SNAPSHOT.jar
jarFolder=ph
projectName=ph
docker_path=${WORKSPACE}
cp ${WORKSPACE}/target/${jarName} ${docker_path}
sh /root/docker_dir/deploy_docker.sh ${projectName} ${docker_path} ${jarName}


创建deploy_docker文件. 目录: /root/docker_dir/deploy_docker.sh. 文件内容如下


设置文件的可执行权限


chmod 775 deploy_docker.sh


deploy_docker.sh文件内容


#!/bin/sh
# maven01 $workspace $jarname
# ${projectName} ${docker_path} ${jarName}
set -e
projectName=$1
docker_path=$2
appName=$3
#user_name=
#password=
tag=$(date +%s)
server_path=192.168.1.104:5000
target_image=${projectName}:${tag}
#${BUILD_NUMBER}
echo ${target_image}
cd ${docker_path}
docker build --build-arg app=${appName} -t ${target_image} .
docker tag ${target_image} ${server_path}/${projectName}
echo The name of image is "${server_path}\/${target_image}"


  • 设置jenkins服务器到k8s master ssh免密登录


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


  • 在jenkins所在服务器上执行


生成秘钥
ssh-keygen -t rsa 
拷贝公钥
ssh-copy-id -i  ~/.ssh/id_rsa.pub root@192.168.1.106


  • 测试免密登录


ssh root@192.168.1.106


微信图片_20220511220355.png


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


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


微信图片_20220511220411.png

set -e
echo ok
echo ${WORKSPACE}
docker_path=${WORKSPACE}
scp ${WORKSPACE}/*.yaml 192.168.1.106:/root/
ssh 192.168.1.106 '/usr/bin/kubectl apply -f /root/kube.yaml'
ssh 192.168.1.106 '/usr/bin/kubectl get svc|grep maven'


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


  • Jenkins项目构建


微信图片_20220511220439.png


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


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

微信图片_20220511220456.png 

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

 

修改对应的shell脚本


微信图片_20220511220519.png

set -e
echo ok
echo ${WORKSPACE}
docker_path=${WORKSPACE}
scp ${WORKSPACE}/*.yaml 192.168.1.106:/root/
ssh 192.168.1.106 'sed -i "s|extensions/v1beta1|apps/v1|" /root/kube.yaml'
ssh 192.168.1.106 'sed -i "s|192.168.0.108|192.168.1.104|" /root/kube.yaml'
ssh 192.168.1.106 '/usr/bin/kubectl apply -f /root/kube.yaml --validate=false' 
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

微信图片_20220511220545.png


我修改后的配置


微信图片_20220511220600.png

apiVersion: v1
kind: Service
metadata:
  name: maven-service
spec:
  type: NodePort
  ports:
  - name: maven
    port: 8080
    nodePort: 31002
    targetPort: 8080
    protocol: TCP
  selector:
    app: maven
---
apiVersion: apps/v1
kind: Deployment
metadata:
  #name: maven-deployment
  name: maven
spec:
  selector:
    matchLabels:
      app: maven
  replicas: 1
  template:
    metadata:
      labels:
        app: maven
    spec:
      containers:
        - name: maven
          image: 192.168.1.104:5000/maven:latest
          ports:
          - containerPort: 8080
          env:
            - name: key
              value: "value"


然后重新启动, 成功!


kubectl get deployments --all-namespaces


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


查看pod


kubectl get pod --all-namespaces

微信图片_20220511220646.png


发现有一个pending状态


查看pod的日志


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

微信图片_20220511220715.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
jenkins Devops Java
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第27天】在快速发展的软件开发领域,DevOps实践日益重要。Jenkins作为一款流行的开源自动化服务器,在持续集成(CI)和持续部署(CD)中扮演关键角色。本文通过案例分析,探讨Jenkins在Java项目中的应用,展示其自动化构建、测试和部署的能力,提高开发效率和软件质量。
74 2
|
27天前
|
监控 jenkins Linux
从 Jenkins 持续集成出发:探究如何监控员工电脑屏幕
Jenkins 在企业信息化管理中用于自动化构建、测试和部署,提高开发效率。本文讨论了其重要性,并从技术角度探讨了屏幕监控的可能性,但明确反对非法监控,强调应合法合规地管理企业和尊重员工隐私。
67 12
|
2月前
|
运维 jenkins Java
Jenkins在持续集成与持续部署中的价值
Jenkins在持续集成与持续部署中的价值
|
2月前
|
jenkins Devops 测试技术
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第26天】随着DevOps理念的普及,Jenkins作为一款开源自动化服务器,在持续集成(CI)与持续部署(CD)中发挥重要作用。本文通过某中型互联网企业的实际案例,展示了Jenkins如何通过自动化构建、持续集成和持续部署,显著提升开发效率、代码质量和软件交付速度,帮助企业解决传统手工操作带来的低效和错误问题。
91 4
|
3月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
85 0
|
3月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
272 0
|
5月前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
105 1
|
4月前
|
jenkins 持续交付 网络安全
利用 Jenkins 实现持续集成与持续部署-代码拉取终端的配置
安装Git、配置用户信息、生成SSH密钥以及在Gitee上创建项目仓库等。
92 0
|
3月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
2月前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
59 0

热门文章

最新文章