10 分钟在 k8s 中部署一个前后端项目

转载至我的博客www.infrastack.cn ,公众号:架构成长指南

大家好,我是蜗牛哥,好多开发人员,尤其是没接触过 k8s 的人员对如何在k8s中部署一个 前后端应用很模糊,不知如何下手,所以本篇讲一下如何快速在 k8s 部署一个前后端应用,让大家对k8s有个快速认识

前置依赖

  • k8s集群,如果没有安装,请参考k8s 部署手册
  • kubectl ,客户端部署需要依赖

应用镜像构建

应用镜像构建不用自己去执行,相关镜像已经推送到docker hub仓库,如果要了解过程和细节,可以看一下,否则直接跳到k8syaml文件配置章节

Java应用镜像构建

代码地址:github.com/dongweizhao...

Java应用打包

调用sh package.sh会执行mvn的package命令,进行打包

编写Dockerfile

从target目录复制可执行jar

dockerfile 复制代码
FROM openjdk:8-jre
COPY target/backend-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT java -jar ${JAVA_OPTS} /app.jar

镜像打包推送

执行sh push.sh 推送至dockerhub仓库,镜像地址:dweizhao/backend:latest

前端应用镜像构建

代码地址:github.com/dongweizhao... 前端项目结构如下 采用百度低代码平台amis进行开发

编写Dockerfile

拷贝前端工程dist目录至/frontend,并进行目录授权

dockerfile 复制代码
from nginx
copy ./dist /frontend
run chown nginx.nginx /frontend -R
copy nginx.conf /etc/nginx/conf.d/default.conf

编写nginx.conf文件

nginx 复制代码
server{
    listen 80;
    server_name localhost;
     root  /frontend;
     index index.html index.htm;

     location /login {
             try_files $uri $uri/ /login.html;
     }
}

推送镜像

执行sh push.sh推送dockerhub仓库,镜像地址:dweizhao/frontend:latest

k8s yaml文件配置

以下是我们部署的服务在k8s 中路由示意图

后端服务配置

backend-dp.yaml

由于我们服务是无状态服务,使用Deployment进行部署,Deployment拥有更加灵活强大的升级、回滚功能,并且支持滚动更新

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  backend
spec:
  selector:
    matchLabels:
      app:  backend
  replicas: 1
  template:
    metadata:
      labels:
        # service 会根据此标签来查找此pod
        app:  backend
        version: latest
    spec:
      containers:
        - name: backend
          image: "dweizhao/backend:latest"
          imagePullPolicy: Always

backend-svc.yaml

Service相当于Spring cloud中Ribbon的作用,提供了服务发现和负载均衡的功能,而不用关心具体服务实例有多少个,在 k8s的服务实例就是Pod,这里我们使用ClusterIP类型,因为是通过Ingress在集群内访问,通过 app:backend标签,来查找对应pod,所以 pod 的label必须包含app:backend

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: backend
spec:
  type: ClusterIP
  ports:
    - name: backend-http
      port: 8080
      targetPort: 8080
      protocol: TCP
  selector:
    # 根据标签查找 pod
    app: backend

前端服务配置

frontend-dp.yaml

前端镜像是一个 nginx

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  frontend
spec:
  selector:
    matchLabels:
      app:  frontend
  replicas: 1
  template:
    metadata:
      labels:
        # service 会根据此标签来查找此pod
        app:  frontend
        version: latest
    spec:
      containers:
        - name: frontend
          image: "dweizhao/frontend:latest"
          imagePullPolicy: Always

frontend-svc.yaml

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  type: ClusterIP
  ports:
    - name: frontend-http
      port: 80
      targetPort: 80
      protocol: TCP
  selector:
    # 根据标签查找 pod
    app: frontend

Ingress配置

Ingress相当于nginx的作用,匹配url转发请求至Service

注意:k8s不同的版本,对应的Ingress apiVerson有点细微差别,所以要找到对应k8s版本的Ingress,我们的k8s版本为v1.25.13

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  ingressClassName: nginx
  rules:
    - host: k8sdemo.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: frontend
              port:
                number: 80
        #backend开头的 url,转发到后端服务 ,否则都转发到前端服务              
        - path: /backend
          pathType: Prefix
          backend:
            service:
              name: backend
              port:
                number: 8080

k8s部署

部署使用kubectl进行部署,如果没有请先安装,安装完成以后,把以上yaml文件保存至本地

创建命名空间

arduino 复制代码
kubectl create namespace k8sdemo

部署

部署系统至k8sdemo空间下

shell 复制代码
kubectl create namespace k8sdemo && kubectl apply -f backend-dp.yaml -f backend-svc.yaml -f frontend-dp.yaml -f frontend-svc.yaml -f ingress.yaml -n k8sdemo

查看系统状态

shell 复制代码
#查看pod 启动状态
kubectl get pods -n k8sdemo
# 查看服务状态
kubectl get svc -n k8sdemo
# 查看Ingress状态
kubectl get ingress -n k8sdemo

host 解析

在 hosts 文件中,对k8sdemo.com域名映射,映射到k8s 的任意node节点上即可,假设IP为172.18.2.53,配置如下

复制代码
172.18.2.53 k8sdemo.com

测试

在浏览器访问k8sdemo.com,如果出现以下结果则部署成功,可以看到正确请求到数据,这个数据为backend提供

总结

以上我们只是简单演示了下,如何在 k8s 中快速部署一个前后端应用,让你对在 k8s 操作有一个快速认识,但是此应用如果要在生产使用还要在做些配置,比如探针配置,因为后端服务的启动,可能是个假启动,必须要配置探针探活之后,才能让 service访问,否则导致请求异常,同时应用有些文件如果需要持久化,还需要配置存储卷等操作

相关推荐
cfm_29149 分钟前
SpringBoot启动原理
java·spring boot·spring
漫随流水1 小时前
Java——springboot web案例
java·开发语言·spring boot
从此以后自律1 小时前
Java Object 类常用方法全讲解
java·开发语言
念何架构之路1 小时前
Docker 容器状态机 学习
java·学习·docker
你有我备注吗1 小时前
SQL学习之查询
java·sql·学习
xixi09242 小时前
JMeter5.6.3基础使用教程1
java·开发语言
带刺的坐椅2 小时前
用 Solon ReActAgent 落地发票识别与智能报销
java·llm·solon·react-agent
罗超驿2 小时前
15.Java异常处理:从束手无策到从容应对
java·开发语言
半夜修仙2 小时前
RabbitMQ的推模式和拉模式
java·分布式·中间件·rabbitmq·github·java-rabbitmq
掉鱼的猫2 小时前
用 Solon ReActAgent 落地发票识别与智能报销
java·llm·agent