Spring on Kubernetes 最佳实践(二) Java应用程序构建优化工具:Jib

什么是Jib?

  • Jib 是由Google提供的一个简化Docker容器构建的工具
  • 基于Maven或Gradle插件的方式运行
  • 不需要Docker deamon
  • 自动实施很多Docker的最佳实践

传统构建和Jib构建的区别

传统构建镜像的方式

  • Build Jar 包
  • 通过Docker构建镜像
  • 上传镜像到镜像仓库

fkzRqe2.png

Jib构建镜像方式

  • 一行命令构建,自动上传到镜像仓库


    b4uolYy.png

添加Jib到POM

打开Spring Boot应用的pom.xml文件,添加下面的plugin 和build 选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
...
<build>
   <plugins>
      ...
      <plugin>
          <groupId>com.google.cloud.tools</groupId>
          <artifactId>jib-maven-plugin</artifactId>
          <version>1.8.0</version>
          <configuration>
             <from>
                <image>openjdk:8u222-slim</image>
             </from>
             <to>
                <image>k8s-demo-app</image>
             </to>
             <container>
                <user>nobody:nogroup</user>
             </container>
          </configuration>
       </plugin>
       ...
   </plugins>
</build>
...

使用Jib构建一个Docker容器

现在构建一个Spring Boot应用的容器将会变得简单

1
$ ./mvnw clean compile jib:dockerBuild

输出如下

1
2
3
4
5
6
7
8
9
10
[INFO] Built image to Docker daemon as k8s-demo-app
[INFO] Executing tasks:
[INFO] [==============================] 100.0% complete
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:21 min
[INFO] Finished at: 2020-04-18T17:59:19+08:00
[INFO] ------------------------------------------------------------------------

NOTE: This still uses your local Docker dameon to build the container


使用Jib推送容器到私有镜像仓库

由于网络的原因,推送到 Docker Hub 在国内不是一个很好的选择,这里推荐两个国内的镜像仓库

  • 腾讯容器服务
  • 阿里云容器服务

登录私有镜像仓库

  • 你需要先登录到镜像仓库,Jib才能把镜像推送到私钥的镜像仓库中,此处使用腾讯容器服务作为演示
1
2
3
docker login --username=your_username --password=your_password ccr.ccs.tencentyun.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

修改Jib Plugin 配置

回到pom.xml文件,需要修改一下Jib的配置,如镜像名字.我们还添加了一个执行目标,以便在运行Maven构建后进行容器构建并推送至镜像仓库

请务必替换 NAMPSPACE 为你自己的命名空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>1.8.0</version>
    <configuration>
        <from>
            <image>openjdk:8u222-slim</image>
        </from>
        <to>
            <image>ccr.ccs.tencentyun.com/[namespace]/k8s-demo-app</image>
        </to>
        <container>
            <user>nobody:nogroup</user>
        </container>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>

构建和部署容器

  • 现在你应该可以使用Maven build, 它将构建容器并将容器推送到镜像仓库
1
    ./mvnw clean package
  • 回到镜像仓库,你应该看到了你新构建的容器在镜像仓库中


    test2.png

部署到Kubernetes

参考第一篇文章,在deployment.yaml里面修改一些 images

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: k8s-demo-app
  name: k8s-demo-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8s-demo-app
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: k8s-demo-app
    spec:
      containers:
      - image: ccr.ccs.tencentyun.com/[YONUR_NAMESPACE]/k8s-demo-app:latest
        name: k8s-demo-app
        imagePullPolicy: IfNotPresent
        resources: {}
status: {}

执行命令部署

1
kubectl apply -f ./k8s

测试

1
2
curl http://localhost:30080
hello world

简单吧,当你修改了代码之后,你只需要两条命令,就能将新的应用部署到kubernetes

1
2
./mvnw clean package
kubectl apply -f ./k8s

代码地址