#(1)根据dockerfile构建基础镜像
1)dockerfile

#mkdir /temp/basic
#cd /temp/basic 
#cat dockerfile 
FROM java:8
MAINTAINER wangfang
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
        && echo 'Asia/Shanghai' >/etc/timezone

2)构建

docker build registry.cn-hangzhou.aliyuncs.com/wangfang-k8s/java:v1 . 
docker push registry.cn-hangzhou.aliyuncs.com/wangfang-k8s/java:v1

#(2)根据打包生成的jar包生成新的dockerfile文件

1)dockerfile

#mkdir /temp/release; cd /temp/release
#cat dockerfile 
FROM registry.cn-hangzhou.aliyuncs.com/wangfang-k8s/java:v1
ADD demo-0.0.1-SNAPSHOT.jar /
WORKDIR /
EXPOSE 8080
ENTRYPOINT ["java","-jar","demo-0.0.1-SNAPSHOT.jar"]

#(3)准备项目的资源配置清单

1)deployment对象资源配置清单文件

#cd /temp/release 
# cat springboot-test.yaml 
apiVersion: apps/v1beta2
kind: Deployment
metadata:
    name: springboot-test-deployment
spec:
    strategy:
        rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
        type: RollingUpdate
    replicas: 2
    selector:
        matchLabels:
            app: springboot-test
    template:
        metadata:
            labels:
                app: springboot-test
        spec:
            containers:
            - name: springboot-test
                image: registry.cn-hangzhou.aliyuncs.com/wangfang-k8s/springboot-test:tag
                ports:
                - containerPort: 8080
                resources:
                    requests:
                        memory: "256Mi"
                        cpu: "256m"
                    limits:
                        memory: "512Mi"
                        cpu: "512m"
                livenessProbe:
                    httpGet:
                        path: /
                        port: 8080
                    initialDelaySeconds: 20
                    periodSeconds: 3
                    successThreshold: 1
                    failureThreshold: 3
                readinessProbe:
                    httpGet:
                        path: /
                        port: 8080
                    initialDelaySeconds: 20
                    periodSeconds: 3
                    successThreshold: 1
                    failureThreshold: 3

2)service对象资源配置清单文件

# cat springboot-test-service.yaml 
apiVersion: v1 
kind: Service 
metadata: 
    name: springboot-test-service
spec: 
    selector:      
        app: springboot-test
    type: NodePort
    ports: 
    - name: http 
        protocol: TCP
        port: 8080
        targetPort: 8080
        nodePort: 33333
    type: NodePort

#(3)配置jenkins
1)丢弃旧的构建
k8s之根据tag发布spring boot项目_第1张图片

2)参数化构建过程
k8s之根据tag发布spring boot项目_第2张图片

3)配置tag
k8s之根据tag发布spring boot项目_第3张图片

4)配置git仓库地址

k8s之根据tag发布spring boot项目_第4张图片

5)配置打包命令
k8s之根据tag发布spring boot项目_第5张图片

6)ssh到jenkins服务器, 这台机器我配置的也是kubectl客户端;
命令说明:
把打包生成的jar包拷贝到工作目录, 根据tag构建新的镜像,
实验演示我是推送到阿里云的容器镜像仓库, 生产环境建议部署habor开源镜像仓库, 速度更快
然后根据tag把资源配置的tag里面替换成真实的tag;
最后根据资源配置清单文件发布项目

cd /temp/release
\cp /var/lib/jenkins/workspace/test/target/demo-0.0.1-SNAPSHOT.jar .
docker build -t registry.cn-hangzhou.aliyuncs.com/wangfang-k8s/springboot-test:${tag} .
docker login --username=your_name registry.cn-hangzhou.aliyuncs.com --password=your_password
docker push registry.cn-hangzhou.aliyuncs.com/wangfang-k8s/springboot-test:${tag} 
sed -ri "s/tag/${tag}/g" springboot-test.yaml
kubectl apply -f .

k8s之根据tag发布spring boot项目_第6张图片

注意: 第一次发布项目, 使用的是sed替换和apply发布项目; 第一次之后把sed和apply方式修改成set image发布项目
kubectl set image deployment deployment_name container_name=image:version
k8s之根据tag发布spring boot项目_第7张图片

#(4)测试
1)修改源代码如下, 同时提交到git仓库和打tag
k8s之根据tag发布spring boot项目_第8张图片

k8s之根据tag发布spring boot项目_第9张图片

k8s之根据tag发布spring boot项目_第10张图片

2)开始构建项目
k8s之根据tag发布spring boot项目_第11张图片

pod容器创建成功
k8s之根据tag发布spring boot项目

发布的tag的版本
k8s之根据tag发布spring boot项目

访问资源, 确实是修改后的资源
k8s之根据tag发布spring boot项目_第12张图片

3)修改资源进行第二次发布

k8s之根据tag发布spring boot项目_第13张图片

上传到git远程仓库
k8s之根据tag发布spring boot项目_第14张图片

创建tag并上传到git仓库
k8s之根据tag发布spring boot项目_第15张图片

4)修改jenkins为滚动发布, 不使用资源配置清单

k8s之根据tag发布spring boot项目_第16张图片

k8s之根据tag发布spring boot项目_第17张图片

k8s之根据tag发布spring boot项目_第18张图片