Kubernetes实战教程:基于Vue前端与Java后端的应用部署
在云原生时代,Kubernetes 已成为管理容器化应用的核心平台。本文不仅详细介绍了 Kubernetes 的背景、架构和核心特性,还将通过一个具体的案例——基于 Vue 前端和 Java 后端的应用部署,带你一步步了解如何在 Kubernetes 集群中构建和运行一个完整的微服务系统。
一、Kubernetes 概述
1.1 Kubernetes 的起源与架构
Kubernetes 是由 Google 发起并开源的容器编排平台,采用主控制平面和工作节点的分布式架构。
- 主控制平面 包含 API Server、Scheduler、Controller Manager 和 etcd,用于管理集群状态和调度任务。
- 工作节点 运行 kubelet 和容器运行时(如 Docker、containerd),负责实际运行 Pod。
1.2 核心特性
- 自愈能力:自动重启失败的容器,保持集群健康。
- 自动扩展:根据负载自动调整 Pod 副本数。
- 服务发现与负载均衡:通过 Service 对象为 Pod 提供稳定的访问入口。
- 声明式配置:所有资源通过 YAML 文件描述,便于版本控制和持续交付。
二、案例概述:Vue 前端 + Java 后端
在本案例中,我们将构建一个包含两个部分的应用:
- 前端:基于 Vue.js 开发的单页面应用
- 后端:基于 Spring Boot 的 Java REST API
整个流程包括应用的打包、构建 Docker 镜像、编写 Kubernetes 部署配置文件以及在 Kubernetes 集群中的部署。
三、具体教程
3.1 环境准备
- 安装 Kubernetes 集群
- 可选择使用 Minikube、Kind 在本地搭建测试集群,或使用云服务商提供的托管 Kubernetes 服务(如 AKS、EKS、GKE)。
- 安装必要工具
kubectl
:Kubernetes 命令行工具Docker
:用于构建镜像- Git:代码管理工具
3.2 构建与打包应用
3.2.1 前端(Vue.js)
-
构建 Vue 应用
在 Vue 项目目录下运行:npm install npm run build
构建完成后,会在项目根目录生成一个
dist
目录,包含打包好的静态文件。 -
编写 Dockerfile
在 Vue 项目根目录下创建一个 Dockerfile:# 使用 Nginx 作为前端服务器 FROM nginx:alpine # 删除默认配置 RUN rm -rf /usr/share/nginx/html/* # 将构建好的文件复制到 Nginx 目录 COPY dist/ /usr/share/nginx/html # 暴露80端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
-
构建镜像
在终端中运行:docker build -t my-vue-app:latest .
3.2.2 后端(Java Spring Boot)
-
构建 Spring Boot 应用
使用 Maven 进行打包:mvn clean package
生成的 JAR 文件位于
target/
目录下(例如my-java-app.jar
)。 -
编写 Dockerfile
在 Spring Boot 项目根目录下创建 Dockerfile:FROM openjdk:11-jre-slim # 将 JAR 文件复制到容器中 COPY target/my-java-app.jar /app/my-java-app.jar # 设置工作目录 WORKDIR /app # 暴露应用端口 EXPOSE 8080 # 运行 Java 应用 ENTRYPOINT ["java", "-jar", "my-java-app.jar"]
-
构建镜像
在终端中运行:docker build -t my-java-app:latest .
四、编写 Kubernetes 配置文件
4.1 创建命名空间
为了便于管理,我们为应用创建一个命名空间:
apiVersion: v1
kind: Namespace
metadata:
name: my-app
保存为 namespace.yaml
并运行:
kubectl apply -f namespace.yaml
4.2 部署前端应用
编写前端的 Deployment 和 Service 文件,保存为 vue-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: vue-deployment
namespace: my-app
spec:
replicas: 2
selector:
matchLabels:
app: vue-app
template:
metadata:
labels:
app: vue-app
spec:
containers:
- name: vue-container
image: my-vue-app:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: vue-service
namespace: my-app
spec:
selector:
app: vue-app
type: ClusterIP
ports:
- port: 80
targetPort: 80
应用配置:
kubectl apply -f vue-deployment.yaml
4.3 部署后端应用
编写后端的 Deployment 和 Service 文件,保存为 java-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-deployment
namespace: my-app
spec:
replicas: 2
selector:
matchLabels:
app: java-app
template:
metadata:
labels:
app: java-app
spec:
containers:
- name: java-container
image: my-java-app:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: java-service
namespace: my-app
spec:
selector:
app: java-app
type: ClusterIP
ports:
- port: 8080
targetPort: 8080
应用配置:
kubectl apply -f java-deployment.yaml
4.4 配置 Ingress(可选)
如果希望外部访问应用,可以配置 Ingress。以下是一个简单的示例,保存为 ingress.yaml
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
namespace: my-app
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /vue
pathType: Prefix
backend:
service:
name: vue-service
port:
number: 80
- path: /java
pathType: Prefix
backend:
service:
name: java-service
port:
number: 8080
应用配置:
kubectl apply -f ingress.yaml
(注意:需要部署 Ingress Controller,如 Nginx Ingress Controller)
五、验证与监控
-
验证部署状态
使用以下命令查看所有 Pod 状态:kubectl get pods -n my-app
-
访问服务
如果配置了 Ingress,可在浏览器中访问http://myapp.example.com/vue
和http://myapp.example.com/java
进行验证;否则可通过 NodePort 或 Port Forward 方式测试服务。 -
监控集群
配置 Prometheus、Grafana 等监控工具,可以实时查看应用运行状态、资源使用情况以及日志信息,为后续故障排查和性能优化提供支持。
六、结语
本文通过 Vue 前端和 Java 后端的具体案例,详细演示了如何利用 Kubernetes 构建、部署和管理一个完整的微服务应用。从构建 Docker 镜像到编写 Kubernetes YAML 文件,再到部署 Ingress 实现外部访问,每一步都体现了 Kubernetes 的自动化和灵活性。
通过实践这一教程,你不仅可以掌握 Kubernetes 的基本操作,还能了解如何将应用组件化、服务化,从而为构建高效、弹性和可扩展的云原生应用打下坚实基础。
欢迎在评论区分享你的问题与经验,一起探索 Kubernetes 带来的无限可能!