简介
spring-boot-kubernetes 是一个简单的 spring boot web 项目,提供了一个 restful 接口,通过 curl 访问:curl localhost:8080/world,
通过本文,将学习到如何将一个 spring-boot-web 项目部署到 kubernetes(简称:k8s)中。
内容包括:
- 在本机安装
Docker - 使用
minikube在本机安装 k8s 集群 - 将我们的
spring-boot-kubernetes项目打包成 docker 镜像 - 把我们的
spring-boot-kubernetes项目部署到 k8s 中
在本机安装Docker
brew 安装 docker
brew install cask docker
使用minikube在本机安装 k8s 集群
如果已经安装 k8s 集群环境,可跳过此步骤
- brew 安装 minikube
minikube 方便我们快速地在本地环境搭建一个轻量的 Kubernetes 集群。minikube 官网。
brew install minikube
更多安装方式见官网:minikube.sigs.k8s.io/docs/start/
- 创建 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 4096mb | 4g 内存 |
| --cpus 4 | 4 cpu |
| --image-mirror-country=cn | 使用国内镜像安装 k8s,否则可能安装不上 |
| --registry-mirror | docker pull 镜像,优先使用此镜像源,不设置镜像下载可能会特别慢 |
将我们的spring-boot-kubernetes项目打包成 docker 镜像
在spring-boot-kubernetes的根目录下执行,
- 项目打包成可执行 jar
# 打包成可执行 jar
mvn clean package -Pdocker;
- 把 jar 通过 Dockerfile 打包成 docker 镜像。
# 打包成 docker 镜像
docker build -t spring-boot-kubernetes:1.0.0 .
通过命令查看镜像是否已经打包好
docker images | grep spring-boot-kubernetes
有结果,则表示已经打包好。
把我们的spring-boot-kubernetes项目部署到 k8s 中
- 把镜像从本机复制到 minikube 中(非 minikube,则跳过。)
minikube cache add spring-boot-kubernetes:1.0.0
- 创建 namespace
我们的项目必须部署在某一个命名空间下,此处我们创建一个名为spring-boot的命名空间,接下来将我们项目将部署到此命名空间下。
kubectl create namespace spring-boot
- 部署到 k8s 中
deployment.yaml是我们写好的 k8s 编排文件,包含了一个 Deployment,文件中使用到我们刚才打包好的 docker 镜像。
kubectl apply -f deployment.yaml -n spring-boot
- 查看 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)
扩展功能
- 查看 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 + 随机字符。
- 进入 pod 内部
kubectl exec -it spring-boot-kubernetes-6dcd84574f-6vbgx -n spring-boot -- sh
spring-boot-kubernetes-6dcd84574f-6vbgx 是我们 pod 的 NAME,每次部署后名称都不一样。
- 删除 pod
kubectl delete -f deployment.yaml -n spring-boot;
- 删除 namespace
kubectl delete ns spring-boot
ns 是 namespace 的简写,同样可以达到删除的效果。
-
基础环境(docker、minikube、k8s)装好后,执行
run.sh也会把项目部署到 k8s 里。 -
后续我们将继续学习,如果通过持续集成工具,将以上步骤自动化。