Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

文章目录

上线企业k8s容器化应用项目

项目描述:
描述:利用pipeline代码,上线公司企业级容器应用

1.Jenkins服务器拉取代码

2.Jenkins服务器编译打包,生成war包

3.jenkins服务器利用Dockerfile将新war包拷入镜像,生成新的镜像,镜像标签随着tag而变化(Dockerfile是在代码仓库中的,也就是开发人员每次推送代码,也会夹带着一个Dockerfile推送过去)

4.将镜像推送到远程镜像仓库中,推送成功删除镜像

5.jenkins服务器利用ansible对k8s-master节点进行更新镜像
概念图
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
我这里讲一下,我用的是俩台机器,jenkins,k8s集群master主节点,node1节点,就俩台机器
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

2.13.1 Jenkins服务器配置

配置解析
[root@jenkins-server1 ~]# cat /etc/hosts 将K8s主节点的解析

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

下载ansbile
[root@jenkins-server1 ~]# yum -y install epel-release ; yum -y install ansible
配置ansible主机清单
[root@jenkins-server1 ~]# cat /etc/ansible/hosts  #在最后面添加

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

发送公钥到k8s-master节点
[root@jenkins-server1 ~]# ssh-copy-id -i k8s-master
测试连通性
[root@jenkins-server1 ~]# ansible k8s-master -m ping

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

2.13.2 k8s主节点配置

#已有的deployment。是一个tomcat容器多副本的deployment

[root@k8s-master tomcat]# pwd
/root/tomcat
[root@k8s-master tomcat]# vim tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
spec:
  selector:
    matchLabels:
      app: tomcat
  replicas: 1
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      nodeName: k8s-node1
      containers:
      - name: tomcat
        image: daocloud.io/library/tomcat:8.0.45
        ports:
        - containerPort: 8080
#为了看效果,创建1个servcie,让tomcat能够访问
[root@k8s-master tomcat]# cat tomcat-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  type: NodePort  #类型
  ports:
    - port: 8080
      nodePort: 30002
      targetPort: 8080
  selector:   #选择器
    app: tomcat  #对应上deployment给设置的标签
[root@k8s-master tomcat]# kubectl apply -f tomcat.yaml
[root@k8s-master tomcat]# kubectl apply -f tomcat-service.yaml

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
上面是公司已有的k8s中tomcat容器,现在的需求是:

要实现持续集成/持续交付的容器更新,更新的代码,是要更新到容器中,并且重启,才能生效

2.13.3 更新仓库

我这里用的是gitee的仓库,同步的github上一个开源的项目代码
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
模拟开发人员更新代码,开发人员肯定使用自己电脑上的git客户端工具进行提交,我这里用虚拟机

[root@git-client tmp]# git clone  git@gitee.com:youngfit/easy-springmvc-maven.git

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

[root@git-client tmp]# cd easy-springmvc-maven/
[root@git-client easy-springmvc-maven]# vim Dockerfile
From daocloud.io/library/tomcat:8.0.45 #这里基于tomcat的一个镜像,从daocloud上找的拉取链接
RUN rm -rf /usr/local/tomcat/webapps/* #删除镜像中tomcat默认发布目录下的内容,方便后续放更新的war包
ADD ./target/easy-springmvc-maven.war /usr/local/tomcat/webapps/ #将编译打包好的war包,拷贝进来
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]  #启动tomcat

当然,我这里没有对代码进行更新;只添加了1个Dockerfile,下面提交代码到gitee仓库中,提交到仓库之前打tag;

[root@jenkins-server1 easy-springmvc-maven]# git add *
[root@jenkins-server1 easy-springmvc-maven]# git commit -m "v2.0"
[root@jenkins-server1 easy-springmvc-maven]# git tag -a "v2.0" -m "v2.0"
[root@jenkins-server1 easy-springmvc-maven]# git checkout v2.0 #这一步可以省略
[root@jenkins-server1 easy-springmvc-maven]# git push origin v2.0

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

2.13.3 pipeline代码

pipeline {
    agent {label 'master'}
    //设置环境变量,自定义即可
    environment {
        gitee_url = "git@gitee.com:youngfit/easy-springmvc-maven.git"
        gitee_branch = "master"
        image_url = "registry.cn-beijing.aliyuncs.com/youngfit/tomcat:${tag}"
        k8s_master = "k8s-master"
        NS = "default"
    }
	//拉取代码
    stages {
        stage('拉取代码') {
            steps {
                script{
                    git branch: "${gitee_branch}", url: "${gitee_url}"
                    sh "git checkout ${tag}; git branch"
                }
            }
        }
        //编译打包
        stage('编译打包') {
            steps {
               sh "cd /root/.jenkins/workspace/test-p1"
               sh "mvn clean package"
            }
        }
        //生成新的docker镜像
        stage('构建镜像') {
            steps {
               sh "docker build -t tomcat:${tag} ." //上一步已经切换到了Dockerfile所在的目录
            }
        }
        //将镜像上传至仓库,我这里用的是阿里云仓库,你也可以换成harbor都行;
        stage ("上传镜像到aliyun仓库") {
            steps {
                sh "docker login --username --password registry.cn-beijing.aliyuncs.com"
                sh "docker tag tomcat:${tag} registry.cn-beijing.aliyuncs.com/youngfit/tomcat:${tag}"
                sh "docker push registry.cn-   beijing.aliyuncs.com/youngfit/tomcat:${tag} && docker rmi  registry.cn-beijing.aliyuncs.com/youngfit/tomcat:${tag} tomcat:${tag}" 
            }
        }
        //更新k8s容器
        stage ("k8s集群更新docker镜像") {
            steps {
                sh "ansible '${k8s_master}' -m shell -a 'kubectl set image deployment tomcat-deployment tomcat=registry.cn-beijing.aliyuncs.com/youngfit/tomcat:${tag} '"
            }
        }
    }
}

2.13.4 进行构建

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

2.13.5 访问测试

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

2.13.6 再次模拟代码更新

开发人员:

[root@git-client webapp]# pwd
/tmp/easy-springmvc-maven/src/main/webapp
[root@git-client webapp]# ls
index.jsp  result.jsp  WEB-INF
[root@git-client webapp]# vim index.jsp

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
代码推送到仓库,记得打tag

[root@git-client webapp]# cd ../../..
[root@git-client easy-springmvc-maven]# pwd

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

[root@git-client easy-springmvc-maven]# git add *
[root@git-client easy-springmvc-maven]# git commit -m "v2.1"
[root@git-client easy-springmvc-maven]# git tag -a "v2.1" -m "v2.1"
[root@git-client easy-springmvc-maven]# git checkout v2.1
[root@git-client easy-springmvc-maven]# git push origin v2.1

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

再次构建

Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用
Jenkins-Pipeline、流水线,企业最受宠技术,实战项目二上线企业k8s容器化应用

上一篇:笔记驱动学习


下一篇:Jenkins插件依赖错误解决方法