1 容器交付流程

1.1 开发阶段

  • 编写代码。
  • 测试。
  • 编写Dockerfile。

1.2 持续集成

  • 代码编译、打包。
  • 制作镜像。
  • 将镜像上传到镜像仓库。

1.3 应用部署

  • 环境准备。
  • 创建Pod、Service、Ingress。

1.4 运维

  • 监控。
  • 故障排查。
  • 应用升级及优化。
  • ……

2 k8s中部署Java项目的流程

  • 项目部署 - 图1通过Dockerfile制作镜像。
  • 项目部署 - 图2将镜像推送到镜像仓库,比如阿里云镜像仓库等。
  • 项目部署 - 图3Pod控制器部署镜像。
  • 项目部署 - 图4创建Service或Ingress对外暴露应用。
  • 项目部署 - 图5对集群进行监控、升级等。

3 k8s中部署Java项目

3.1 前提说明

  • 本人是在Windows进行开发的,部署在Linux(CentOS7)中的k8集群。

3.2 准备Java项目,并将项目进行打包

3.2.1 概述

  • 准备一个Java项目,将Java项目进行打包,本次使用SpringBoot项目为例,使用的JDK的版本是11。

3.2.2 准备工作

  • JDK 11 。
  • Maven 3.6x。

3.2.3 演示的SpringBoot项目

  • pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.3.7.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>springboot2</artifactId>
  13. <version>1.0</version>
  14. <name>springboot2</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>11</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-test</artifactId>
  27. <scope>test</scope>
  28. <exclusions>
  29. <exclusion>
  30. <groupId>org.junit.vintage</groupId>
  31. <artifactId>junit-vintage-engine</artifactId>
  32. </exclusion>
  33. </exclusions>
  34. </dependency>
  35. </dependencies>
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-maven-plugin</artifactId>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>
  • HelloController.java
package com.example.springboot2.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 许大仙
 * @version 1.0
 * @since 2021-01-12 09:18
 */
@RestController
public class HelloController {

    @RequestMapping(value = "/hello")
    public String hello() {
        return "hello";
    }

}
  • 启动类:
package com.example.springboot2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Springboot2Application {

    public static void main(String[] args) {
        SpringApplication.run(Springboot2Application.class, args);
    }
}

3.2.4 使用Maven进行打包

  • 打包命令:
mvn clean install

使用Maven进行打包.png

3.2.5 在项目的根目录下新建Dockerfile文件

  • Dockerfile:
FROM openjdk
VOLUME /tmp
COPY ./target/springboot2-1.0.jar springboot2-1.0.jar
RUN bash -c "touch /springboot2-1.0.jar"
# 声明时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 8080
ENTRYPOINT ["java","-jar","/springboot2-1.0.jar"]

在项目的根目录下新建Dockerfile文件.png

3.3 制作镜像

  • 将整个项目通过ftp上传到k8s集群所在的服务器中(其实完全可以只上传jar包和Dockerfile文件)。

将整个项目通过ftp上传到k8s集群所在的服务器中.png

  • 进入springboot2目录:
cd springboot2

进入springboot2.png

  • 使用docker build构建镜像:
# springboot是镜像的名称
docker build -t springboot2 .

使用docker build构建镜像.gif

3.4 推送镜像

  • 阿里云创建命名空间:

阿里云镜像仓库之创建命名空间.png

阿里云镜像仓库之创建命名空间2.png

  • 阿里云创建镜像仓库:

阿里云创建镜像仓库.png

阿里云创建镜像仓库2.png

阿里云创建镜像仓库3.png

  • 登录阿里云Docker Registry:
sudo docker login --username=阿里云账号 registry.cn-hangzhou.aliyuncs.com

登录阿里云Docker Registry.png

  • 查看上传的Docker镜像的id:
docker images

查看上传的Docker镜像的id.png

  • 给镜像打tag:
sudo docker tag bc56e4a83ff7 registry.cn-hangzhou.aliyuncs.com/k8s-test-123/springboot2:latest

给镜像打tag.png

  • 推送镜像:
sudo docker push registry.cn-hangzhou.aliyuncs.com/k8s-test-123/springboot2:latest

推送镜像.gif

3.5 部署镜像暴露应用

  • 创建deployment.yaml文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: springboot2
  name: springboot2
spec:
  replicas: 3
  selector:
    matchLabels:
      app: springboot2
  template:
    metadata:
      labels:
        app: springboot2
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/k8s-test-123/springboot2:latest
        name: springboot2
  • 创建Deployment:
kubectl create -f deployment.yaml

创建Deployment.png

  • 查看Deployment和Pod:
kubectl get deploy,pod

查看Deployment和Pod.png

  • 创建service.yaml文件,内容如下:
apiVersion: v1
kind: Service
metadata:
  labels:
    app: springboot2
  name: svc
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
    nodePort: 30091
  selector:
    app: springboot2
  type: NodePort
  • 创建Service:
kubectl create -f service.yaml

创建Service.png

  • 查看Service:
kubectl get service

image.png