将一个 spring-boot 项目部署到 kubernetes/k8s 中

1,930 阅读3分钟

简介

spring-boot-kubernetes 是一个简单的 spring boot web 项目,提供了一个 restful 接口,通过 curl 访问:curl localhost:8080/world, 通过本文,将学习到如何将一个 spring-boot-web 项目部署到 kubernetes(简称:k8s)中。

内容包括:

  1. 在本机安装Docker
  2. 使用minikube在本机安装 k8s 集群
  3. 将我们的spring-boot-kubernetes项目打包成 docker 镜像
  4. 把我们的spring-boot-kubernetes项目部署到 k8s 中

在本机安装Docker

brew 安装 docker

brew install cask docker

使用minikube在本机安装 k8s 集群

如果已经安装 k8s 集群环境,可跳过此步骤

  1. brew 安装 minikube

minikube 方便我们快速地在本地环境搭建一个轻量的 Kubernetes 集群。minikube 官网

brew install minikube

更多安装方式见官网:minikube.sigs.k8s.io/docs/start/

  1. 创建 k8s 集群
minikube start --memory 4096mb --cpus 4 \      
--image-mirror-country=cn \
--registry-mirror="https://registry.docker-cn.com,https://docker.mirrors.ustc.edu.cn"
参数描述
--memory 4096mb4g 内存
--cpus 44 cpu
--image-mirror-country=cn使用国内镜像安装 k8s,否则可能安装不上
--registry-mirrordocker pull 镜像,优先使用此镜像源,不设置镜像下载可能会特别慢

将我们的spring-boot-kubernetes项目打包成 docker 镜像

spring-boot-kubernetes的根目录下执行,

  1. 项目打包成可执行 jar
# 打包成可执行 jar
mvn clean package -Pdocker;
  1. 把 jar 通过 Dockerfile 打包成 docker 镜像。
# 打包成 docker 镜像
docker build -t spring-boot-kubernetes:1.0.0 .

通过命令查看镜像是否已经打包好

docker images | grep spring-boot-kubernetes

有结果,则表示已经打包好。

把我们的spring-boot-kubernetes项目部署到 k8s 中

  1. 把镜像从本机复制到 minikube 中(非 minikube,则跳过。)
minikube cache add spring-boot-kubernetes:1.0.0
  1. 创建 namespace

我们的项目必须部署在某一个命名空间下,此处我们创建一个名为spring-boot的命名空间,接下来将我们项目将部署到此命名空间下。

kubectl create namespace spring-boot
  1. 部署到 k8s 中

deployment.yaml是我们写好的 k8s 编排文件,包含了一个 Deployment,文件中使用到我们刚才打包好的 docker 镜像。

kubectl apply -f deployment.yaml -n spring-boot
  1. 查看 pod 启动日志
kubectl logs -l app=spring-boot-kubernetes -n spring-boot --tail=100 -f

看到以下内容表示项目已经启动成功

  .   ____          _            __ _ _
 /\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )___ | '_ | '_| | '_ / _` | \ \ \ \
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |___, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.5.RELEASE)

2022-03-31 18:31:30.298  INFO 1 --- [           main] c.d.s.kubernetes.KubernetesApplication   : Starting KubernetesApplication on spring-boot-kubernetes-6dcd84574f-6vbgx with PID 1 (/app/spring-boot-kubernetes-1.0.0.jar started by root in /app)
2022-03-31 18:31:30.306  INFO 1 --- [           main] c.d.s.kubernetes.KubernetesApplication   : The following profiles are active: single
2022-03-31 18:31:51.003  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-03-31 18:31:51.307  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-03-31 18:31:51.308  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.39]
2022-03-31 18:31:52.310  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-03-31 18:31:52.311  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 20413 ms
2022-03-31 18:32:01.996  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2022-03-31 18:32:07.303  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-03-31 18:32:07.598  INFO 1 --- [           main] c.d.s.kubernetes.KubernetesApplication   : Started KubernetesApplication in 44.993 seconds (JVM running for 52.588)

扩展功能

  1. 查看 k8s 运行的 pod
kubectl get pod -n spring-boot

结果如下:

NAME                                      READY   STATUS    RESTARTS   AGE
spring-boot-kubernetes-6dcd84574f-6vbgx   1/1     Running   0          15m

NAME 命名规则是我们deployment.yaml文件中的metadata/name + 随机字符

  1. 进入 pod 内部
kubectl exec -it spring-boot-kubernetes-6dcd84574f-6vbgx -n spring-boot -- sh

spring-boot-kubernetes-6dcd84574f-6vbgx 是我们 pod 的 NAME,每次部署后名称都不一样。

  1. 删除 pod
kubectl delete -f deployment.yaml -n spring-boot;
  1. 删除 namespace
kubectl delete ns spring-boot

ns 是 namespace 的简写,同样可以达到删除的效果。

  1. 基础环境(docker、minikube、k8s)装好后,执行run.sh也会把项目部署到 k8s 里。

  2. 后续我们将继续学习,如果通过持续集成工具,将以上步骤自动化