文章目录
上线企业k8s容器化应用项目
项目描述:
描述:利用pipeline代码,上线公司企业级容器应用
1.Jenkins服务器拉取代码
2.Jenkins服务器编译打包,生成war包
3.jenkins服务器利用Dockerfile将新war包拷入镜像,生成新的镜像,镜像标签随着tag而变化(Dockerfile是在代码仓库中的,也就是开发人员每次推送代码,也会夹带着一个Dockerfile推送过去)
4.将镜像推送到远程镜像仓库中,推送成功删除镜像
5.jenkins服务器利用ansible对k8s-master节点进行更新镜像
概念图
我这里讲一下,我用的是俩台机器,jenkins,k8s集群master主节点,node1节点,就俩台机器
2.13.1 Jenkins服务器配置
配置解析
[root@jenkins-server1 ~]# cat /etc/hosts 将K8s主节点的解析
下载ansbile
[root@jenkins-server1 ~]# yum -y install epel-release ; yum -y install ansible
配置ansible主机清单
[root@jenkins-server1 ~]# cat /etc/ansible/hosts #在最后面添加
发送公钥到k8s-master节点
[root@jenkins-server1 ~]# ssh-copy-id -i k8s-master
测试连通性
[root@jenkins-server1 ~]# ansible k8s-master -m ping
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
上面是公司已有的k8s中tomcat容器,现在的需求是:
要实现持续集成/持续交付的容器更新,更新的代码,是要更新到容器中,并且重启,才能生效
2.13.3 更新仓库
我这里用的是gitee的仓库,同步的github上一个开源的项目代码
模拟开发人员更新代码,开发人员肯定使用自己电脑上的git客户端工具进行提交,我这里用虚拟机
[root@git-client tmp]# git clone git@gitee.com:youngfit/easy-springmvc-maven.git
[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
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 进行构建
2.13.5 访问测试
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
代码推送到仓库,记得打tag
[root@git-client webapp]# cd ../../..
[root@git-client easy-springmvc-maven]# pwd
[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