本文简单的演示如何发布一个 springboot 的应用到 minikube 中。
制作并发布镜像
通常,将一个 SpringBoot 的应用发布到 minikube 或 k8s 集群中的方法是将其作为 Docker 镜像。 关于如何制作 SpringBoot 应用的 Docker 镜像,可以参考:在 Docker 上部署 Spring Boot 开发的应用。
制作完成后,将制作好的镜像部分到 docker hub 或是私有镜像库中。
在本文后面的部分将直接使用一个已经发布到 docker hub 中的应用: jini/springboot-k8s-basic, 该应用是一个使用 Spring Boot 实现的简单为 WEB 应用,当客户访问时,简单的返回服务端的 ip 地址。
在 minikube 中部署应用
对于简单的情况,可以使用命令行直接建立一个”部署 deployment” 来在 minikube 中部署应用,执行下面的命令:
1 | kubectl create deployment springboot-k8s-basic --image=jini/springboot-k8s-basic:latest |
系统显示:
1 | deployment.apps/springboot-k8s-basic created |
该命令会使用默认设置构建一个 pod, 并从 docker hub 中下载镜像进行部署。 依赖于网络的快慢,过一会儿可以执行:
1 | kubectl get pods |
来查看 minikube 中 POD 的情况, 可以看到类似下面的结果:
1 | NAME READY STATUS RESTARTS AGE |
如果状态(STATUS) 是 Running, 说明部署成功。
在 minikube 内部访问应用
在完成上面的步骤以后,就可以在 minikube 内部访问刚才部署的服务了。
首先执行以下命令,找到 POD 的 IP 地址:
1 | kubectl get pods -o wide |
系统返回:
1 | NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES |
可以看到,应用的 POD 被分配了 172.17.0.6 这样一个 ip 地址。 现在,执行:
1 | minikube ssh |
登录到 minikube 内部, 系统显示:
1 | _ _ |
接着,我们访问刚才部署的服务,执行:
1 | curl http://172.17.0.6:8080 |
可以看到,返回如下结果:
1 | My IP is: 172.17.0.6 |
使用 NodePort 暴露应用
在上面的操作中,我们已经可以从 minikube 内部访问应用了,但现实中,我们一定还需要从外部也可以访问该应用,在 minikube 中,有多种技术可以实现这个目标,这里先介绍使用 NodePort。
执行:
1 | kubectl expose deployment springboot-k8s-basic --type=NodePort --port=8080 |
系统显示:
1 | service/springboot-k8s-basic exposed |
再执行:
1 | kubectl get svc |
系统显示:
1 | kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19d |
可以看到,我们建立了一个新的服务,这个服务将内部部署(应用) springboot-k8s-basic 的 8080 端口,映射到本机的 30891 端口。
现在,再执行:
1 | minikube service springboot-k8s-basic --url |
这个命令将返回能够访问 minikube 中部署的应用 URL 地址,在我的环境中,将返回:
1 | http://192.168.1.54:30891 |
打开浏览器,输入这个 url , 就可以看到反馈:
1 | My IP is: 172.17.0.6 |