阿里云k8s发布vue项目

作为一个后端 偶尔会承担一些运维工作 此次经历了发布vue项目的过程 因网上资料混乱 做个记录

首先要编写对应的Dockerfile (花了一些时间弄清楚[为什么需要用nginx作为基础镜像 而不是node.js])

Dockerfile

bash 复制代码
FROM nginx:1.16.0

WORKDIR /front

COPY dist /front/

COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

比如后端springboot项目 肯定用例如 java8作为基础镜像 那vue为什么不用同理的运行环境node.js来构建

先来看node.js的构建命令

bash 复制代码
cnpm install
node --max_old_space_size=4096 node_modules/@vue/cli-service/bin/vue-cli-service.js build

后来查阅资料 才了解 执行node build命令后 前端vue项目会被构建成一个纯静态资源放在dist目录

静态资源就不需要启动命令(类似npm run serve)来运行 可以直接静态访问。所以,只需要把静态访问的路径交由nginx管理即可

nginx.conf

bash 复制代码
log_format  spockportallog  '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $bytes_sent $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for" '
                   '$upstream_addr $host $sent_http_x_reqid $upstream_response_time $request_time';

server {
  listen 80; //ngnix的默认端口 通过访问安装了ngnix的服务器ip:80 可以访问nginx服务

  access_log  /var/log/nginx/access.log  main;
  error_log   /var/log/nginx/error.log;

  # Make site accessible from http://localhost/

  client_max_body_size 1024m;
  proxy_send_timeout 500s;
  proxy_read_timeout 500s;

  location @rewrites {
    rewrite ^(.+)$ /index.html last;
  }

  location / {
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
    add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
    if_modified_since off;
    expires off;
    etag off;
    root /front/; //这里很关键 /front文件夹存放的是vue build后的静态文件(Dockerfile... COPY dist /front/) 通过这句 ngnix和vue项目关联起来 这样 访问80端口 ngnix就会把请求转发到 /front/index.html
    index index.html index.htm;
    try_files $uri $uri/ @rewrites;
  }

  //这里是配置请求后端接口的反向代理 效果例如 www.test.com/api/t01-->http://XXX.XXX.XX.XX:30960/t01
  location /api/{
      proxy_pass http://XXX.XXX.XX.XX:30960/; //后端的服务地址
      proxy_set_header Host $host;
      proxy_set_header Referer $http_referer;
    }

  
}

vue项目中 要配置对应的api基础路径

.env

bash 复制代码
NODE_ENV=production
VUE_APP_PLATFORM_NAME=demo vue项目
VUE_APP_API_BASE_URL=/api

创建axios实例时配置前缀

bash 复制代码
const request = axios.create({
  // API 请求的默认前缀
  baseURL:process.env.VUE_APP_API_BASE_URL,
  timeout: 30000 // 请求超时时间
})

接下来就是在项目根目录创建manifests文件夹 里面有3个文件

1.image仓库 密钥

imageSecret.yaml

bash 复制代码
kind: Secret
apiVersion: v1
metadata:
  name: imageSecret
  namespace: ${namespace}
  annotations:
    kubesphere.io/creator: admin
data:
  .dockerconfigjson: >-
    XXXXXXXXXXXXXXX
type: kubernetes.io/dockerconfigjson

2.k8s deployment文件

frontend-deployment.yaml

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: front-uat
  name: front-uat
spec:
  replicas: 1
  selector:
    matchLabels:
      app: front-uat
      version: front-uat
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: front-uat
        version: front-uat
    spec:
      imagePullSecrets:
      - name: imageSecret
      containers:
      - image: ${image}
        name: frontend
        ports:
        - containerPort: 80
          name: nginx-port
        resources:
          limits:
            cpu: 2000m
            memory: 2000Mi
          requests:
            cpu: 500m
            memory: 1000Mi

3.nodePort service 和 ingress

frontend-service.yaml

bash 复制代码
apiVersion: v1
kind: Service
metadata:
  labels:
    app: front-uat
  name: front-uat
spec:
  type: NodePort
  ports:
  - name: "front-uat"
    port: 80
    targetPort: 80
  selector:
    app: front-uat
    version: front-uat
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: front-uat
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: ${host}.demo.com
    http:
      paths:
      - path: /
        backend:
          serviceName: front-uat
          servicePort: 80

一共在根目录添加了2个文件 1个文件夹

Dockerfile nginx.conf manifests(imageSecret.yaml frontend-deployment.yaml frontend-service.yaml)

流水线主要有2个步骤

1.镜像构建并推送到阿里云buildkit

2.kubectl发布到阿里云k8s集群

ps: Dockerfile中 是可以用 node.js作为基础镜像的 那就是另外一种构建方法了 不使用node build命令

而是直接在Dockerfile中使用CMD npm run serve。

相关推荐
爱泡脚的鸡腿1 小时前
uni-app D6 实战(小兔鲜)
前端·vue.js
北极糊的狐1 小时前
Vue3 中父子组件传参是组件通信的核心场景,需遵循「父传子靠 Props,子传父靠自定义事件」的原则,以下是资料总结
前端·javascript·vue.js
看到我请叫我铁锤2 小时前
vue3中THINGJS初始化步骤
前端·javascript·vue.js·3d
谢尔登2 小时前
defineProperty如何弥补数组响应式不足的缺陷
前端·javascript·vue.js
涔溪3 小时前
实现将 Vue2 子应用通过无界(Wujie)微前端框架接入到 Vue3 主应用中(即 Vue3 主应用集成 Vue2 子应用)
vue.js·微前端·wujie
敲上瘾4 小时前
【探索实战】:Kurator分布式统一应用分发平台的全面解析与实践指南
分布式·容器·kubernetes·serverless
T***u3334 小时前
前端框架在性能优化中的实践
javascript·vue.js·前端框架
jingling5555 小时前
vue | 在 Vue 3 项目中集成高德地图(AMap)
前端·javascript·vue.js
油丶酸萝卜别吃5 小时前
Vue3 中如何在 setup 语法糖下,通过 Layer 弹窗组件弹出自定义 Vue 组件?
前端·vue.js·arcgis
J***Q29212 小时前
Vue数据可视化
前端·vue.js·信息可视化