kubernetes系列02-本地安装kubernetes、部署springboot服务

本文档详述了如何在本地搭建Kubernetes集群(使用minikube)并部署SpringBoot服务。首先介绍了Kubernetes的组件,包括controlplane和workernode,然后演示了Docker的安装与SpringBoot应用的Docker化。通过编写Dockerfile构建镜像,并将其推送到Docker Hub。接着,安装minikube和kubectl,创建Deployment YAML文件在Kubernetes上部署SpringBoot服务。最后,展示了如何检查Pod状态和登录到容器内部进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章我们在本地快速搭建一个kubernetes集群并且在上面部署一个springboot服务。

kubernetes组件介绍

kuberntes组件分为两部分,control plane(控制面)和worker node(工作节点)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hExbekND-1639228159386)(https://bytejava.cn/assets/images/6e0ffff6bccf7d7e8955778d3379c0231bcd0ee31c48f4383d6d94f43eb74521.png)]

control plane从名字可以看出负责控制整个系统。Control plane里面注意包含controller manager,scheduler, api server和etcd。 etcd是存放kubernetes数据信息的存储系统,是一个分布式的一致性存储服务。 api server提供了对kubernetes中各类资源的读写操作接口,内部实现是与etcd交互读写。 controller manager中包含多种控制器,例如DeploymentController负责管理容器服务的部署。 scheduler负责为新创建的pod分配部署的机器资源,pod是kubernetes中部署服务的抽象描述,一般一个pod中只包含一个容器。

每个worker node表示一个机器节点,worker node和control plane连接,接受control plane的指令,启动、关闭pod。 每个worker node中包含一个container runtime,例如docker引擎,container runtime负责容器的创建、关闭等。 kubelet负责与control plane的api server通信。 kube proxy是网络代理,负责与其他的pod通信。

安装kubernetes

今天我们在本地部署一个kubernetes,并且在上面部署一个springboot服务。 为此需要安装docker, 安装kubectl(操作kubernetes集群的命令行工具),安装kubernetes(minikube),创建一个springboot工程。

Docker安装使用

Docker和kubernetes的关系

kubernetes是管理容器的系统,Docker是容器技术的一种实现,也是目前用的比较多的容器技术。

Docker安装

Get Docker这里有不同的环境下的安装教程。

例如mac系统下载docker for mac,下载好后拖动到Applications文件夹,再双击Docker启动启动即可。

picture 3

了解Dockerfile、Docker部署springboot服务

Dockerfile文件是Docker中定义一个容器镜像的描述,描述了一个镜像的构建过程。

我们通过idea创建一个普通的springboot项目,在项目的根目录下创建一个Dockerfile文件。 我们使用的镜像基于openjdk:11,jdk11版本。构建镜像时,会把target文件夹下的jar包复制到镜像中,容器的启动命令是java -jar app.jar。注意jdk只能运行版本等于或低于自己版本的jdk编译出来的class文件,所以本地的java需要是jdk11或以下。 springboot-demo-0.0.1-SNAPSHOT.jar是我们打包的包名的名称,默认是项目的名称加上版本号,这里改成自己的。

FROM openjdk:11
MAINTAINER liuzhengyang.github.io
COPY target/springboot-demo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

定义好Dockerfile后,下一步是构建docker image也就是镜像。下面的命令通过docker build创建出一个名字是springboot-demo的镜像

docker build -t springboot-demo:latest . 

然后通过docker run命令运行刚才的镜像 -p 8080:8080表示把容器内的8080端口映射到当前宿主机器上的8080端口。:前面的是宿主机的端口,后面的是容器内的端口。

docker run -p 8080:8080 springboot-demo

测试接口

curl http://localhost:8080/

下一步我们push到Docker镜像仓库,在docker hub注册一个个人账号,然后就可以push镜像到公共仓库了,类似发布jar包到maven中央仓库。 因为docker默认使用docker官方仓库,所以我们要把镜像push到docker官方仓库

# 给我们本地的镜像加一个tag别名,名字为自己的docker hub的名字/springboot-demo
docker tag springboot-demo liuzhengyang/springboot-demo
# push镜像
docker push liuzhengyang/springboot-demo

其他参考资料

kubernetes安装使用

安装好docker后,我们需要安装kubernetes。

kubernetes安装(minikube)

本地开发时,使用minikube比较方便

# 安装minkkube, mac版本,其他版本可以参考官方文档
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

# 启动minikube
minikube start --image-mirror-country='cn'

# 可以开启一个web管理页面 
minikube dashboard

# 安装kubectl 和kubernetes集群交互的客户端
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"

# 运行kubectl 命令测试集群状态

kubectl cluster-info

# 小技巧

# 在~/.bashrc或~/.zash中给kubectl加一个alias别名,比如alias k="kubectl"可以让输入命令更方便,tab可以有命令提示(mac zsh)

用kubenetes部署springboot

在前面我们用Docker启动springboot项目有一些缺点,比如如果容器挂掉,我们需要通过报警发现再人工去启动新的镜像。 而kubernetes能够在容器挂掉后自动创建新的容器替补上。

在kubernetes中,我们可以用Deployment yaml文件来定义部署一个服务。

kubernetes-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springboot-demo
  template:
    metadata:
      labels:
        app: springboot-demo
    spec:
      containers:
        - image: liuzhengyang/springboot-demo
          name: springboot-demo

这个yaml文件中的内容可以想不用了解我们后面章节会介绍。 然后我们用kubectl apply -f kubernetes-deployment.yml来应用deployment

apply之后kubernetes内部就会部署springboot服务(第一次部署可能会稍慢,要下载镜像)

我们可以通过kubectl get pods命令查看pod状态

NAME                               READY   STATUS              RESTARTS   AGE
springboot-demo-6865d48f85-fslc9   0/1     ContainerCreating   0          7s

通过kubectl describe pods可以查看pods的详细状态

Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  95s   default-scheduler  Successfully assigned default/springboot-demo-6865d48f85-fslc9 to minikube
  Normal  Pulling    94s   kubelet            Pulling image "liuzhengyang/springboot-demo"
  Normal  Pulled     44s   kubelet            Successfully pulled image "liuzhengyang/springboot-demo" in 50.297270315s
  Normal  Created    44s   kubelet            Created container springboot-demo
  Normal  Started    44s   kubelet            Started container springboot-demo

不断执行kubectl get pods,最终可以看到pods状态变成running

NAME                               READY   STATUS    RESTARTS   AGE
springboot-demo-6865d48f85-fslc9   1/1     Running   0          2m17s

登录到k8s容器中

后面的章节我们会介绍怎么在容器外部访问这个服务。 现在我们看下如何登录到容器中。

通过上面的kubectl get pods命令我们可以看到我们的pod name是springboot-demo-6865d48f85-fslc9

现在我们登录到这个机器上

kubectl exec -it springboot-demo-6865d48f85-fslc9 -- sh

登录上去之后,就可以执行jps等命令观察我们的服务了。

### Kubernetes 部署 Spring Boot 和 Vue 的最佳实践 #### 1. 环境准备 为了成功部署包含 Spring Boot 后端和 Vue 前端的应用程序,需满足以下前提条件:拥有一个可用的 Kubernetes 集群环境[^2];熟悉 Docker 容器技术并能够创建自定义镜像;具备一定的 Java 和 Spring Boot 编程经验以及对 Kubernetes 基本概念的理解。 #### 2. 构建后端 Spring Boot 应用 开发完成后,将 Spring Boot 应用打包成 JAR 文件,并通过 Dockerfile 创建容器化版本。以下是典型的 Dockerfile 示例: ```dockerfile FROM openjdk:17-jdk-alpine ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] ``` 完成上述操作之后,利用 `docker build` 命令生成镜像并将该镜像推送到私有的 Harbor 或公共仓库中以便于后续拉取使用[^3]。 #### 3. 构建前端 Vue.js 应用 对于 Vue.js 前端部分同样需要制作对应的 Docker 映像文件来实现自动化构建流程。这里给出一段简单的例子作为参考: ```dockerfile # 使用官方 Node.js 运行时为基础映像 FROM node:lts-alpine AS builder WORKDIR /app # 将 package.json 和其他依赖项复制进去 COPY ./frontend/package*.json ./ RUN npm install --silent && mv node_modules ../node_modules.cache # 复制源码至工作目录下 COPY ./frontend . # 执行生产模式下的编译命令 RUN npm run build # 切换到 Nginx 来提供静态资源服务 FROM nginx:alpine # 替换默认配置为自己的站点设置 COPY ./nginx.conf /etc/nginx/conf.d/default.conf # 把之前阶段产生的产物移入最终位置 COPY --from=builder /app/dist /usr/share/nginx/html/ ``` 此脚本会先基于 Node.js 对项目进行构建再切换回轻量级 webserver 提供页面加载支持。 #### 4. Kubernetes 资源对象设计 ##### (a) Namespace 设置 推荐单独划分命名空间用于隔离不同业务场景或者团队之间的冲突情况: ```yaml apiVersion: v1 kind: Namespace metadata: name: my-app-space labels: purpose: demo-application ``` ##### (b) Deployment & Service 定义 分别针对前后两端编写各自的 deployment descriptor 并暴露对外接口形式如下所示: ###### **Spring Boot Backend** ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: spring-boot-backend-deployment spec: replicas: 2 selector: matchLabels: app: backend-service template: metadata: labels: app: backend-service spec: containers: - name: springboot-container image: your-repo/springboot-image:v0.1 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: backend-svc spec: type: ClusterIP selector: app: backend-service ports: - protocol: TCP port: 80 targetPort: 8080 ``` ###### **Vue Frontend** ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: vuejs-frontend-deployment spec: replicas: 3 selector: matchLabels: app: frontend-service template: metadata: labels: app: frontend-service spec: containers: - name: vuejs-container image: your-repo/vuejs-image:v0.1 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: frontend-svc spec: type: LoadBalancer # 可选 Ingress 控制流量入口策略 selector: app: frontend-service ports: - protocol: TCP port: 80 targetPort: 80 ``` ##### (c) Ingress Controller 组件安装与路由规则制定 如果希望进一步简化外部访问路径,则可以通过引入 ingress controller 实现统一管理功能。例如采用 NGINX-ingress-controller 解决方案时其 CRD 示例如下: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: / name: example-ingress spec: rules: - host: "example.com" http: paths: - pathType: Prefix path: "/api" backend: service: name: backend-svc port: number: 80 - pathType: Prefix path: "/" backend: service: name: frontend-svc port: number: 80 ``` 以上即完成了整个从前端展示层到后台逻辑处理单元的整体架构搭建过程概述^。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高级Java进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值