1 容器交付流程

1.1 开发阶段

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

1.2 持续集成

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

1.3 应用部署

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

1.4 运维

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

2 k8s中部署Java项目的流程

  • ① 通过Dockerfile制作镜像。
  • ② 将镜像推送到镜像仓库,比如阿里云镜像仓库等。
  • ③ Pod控制器部署镜像。
  • ④ 创建Service或Ingress对外暴露应用。
  • ⑤ 对集群进行监控、升级等。

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
  1. package com.example.springboot2.web;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. /**
  5. * @author 许大仙
  6. * @version 1.0
  7. * @since 2021-01-12 09:18
  8. */
  9. @RestController
  10. public class HelloController {
  11. @RequestMapping(value = "/hello")
  12. public String hello() {
  13. return "hello";
  14. }
  15. }
  • 启动类:
  1. package com.example.springboot2;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Springboot2Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Springboot2Application.class, args);
  8. }
  9. }

3.2.4 使用Maven进行打包

  • 打包命令:
  1. mvn clean install

使用Maven进行打包.png

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

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

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

3.3 制作镜像

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

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

  • 进入springboot2目录:
  1. cd springboot2

进入springboot2.png

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

使用docker build构建镜像.gif

3.4 推送镜像

  • 阿里云创建命名空间:

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

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

  • 阿里云创建镜像仓库:

阿里云创建镜像仓库.png

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

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

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

登录阿里云Docker Registry.png

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

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

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

给镜像打tag.png

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

推送镜像.gif

3.5 部署镜像暴露应用

  • 创建deployment.yaml文件,内容如下:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: springboot2
  6. name: springboot2
  7. spec:
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. app: springboot2
  12. template:
  13. metadata:
  14. labels:
  15. app: springboot2
  16. spec:
  17. containers:
  18. - image: registry.cn-hangzhou.aliyuncs.com/k8s-test-123/springboot2:latest
  19. name: springboot2
  • 创建Deployment:
  1. kubectl create -f deployment.yaml

创建Deployment.png

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

查看Deployment和Pod.png

  • 创建service.yaml文件,内容如下:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. labels:
  5. app: springboot2
  6. name: svc
  7. spec:
  8. ports:
  9. - port: 8080
  10. protocol: TCP
  11. targetPort: 8080
  12. nodePort: 30091
  13. selector:
  14. app: springboot2
  15. type: NodePort
  • 创建Service:
  1. kubectl create -f service.yaml

创建Service.png

  • 查看Service:
  1. kubectl get service

查看Service.png

转载 https://www.yuque.com/fairy-era/yg511q/rwzb34