阿里云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。

相关推荐
xuelong-ming2 小时前
ElementUI el-tree 树组件 增加辅助线
vue.js·elementui
颜淡慕潇2 小时前
【K8S系列】深入解析 Kubernetes 网络策略(二)
网络·容器·kubernetes·网络策略
customer082 小时前
【开源免费】基于SpringBoot+Vue.JS新闻推荐系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
阿里云大数据AI技术3 小时前
云栖实录 | 开源大数据全面升级:Native 核心引擎、Serverless 化、湖仓架构引领云上大数据发展
大数据·阿里云·开源·serverless·云栖大会
魏时烟3 小时前
vue3项目中组件切换不起作用
前端·javascript·vue.js
先知demons3 小时前
超好用的element的el-pagination分页组件二次封装-附源码及讲解
前端·javascript·vue.js·elementui·html
jokeWorld3 小时前
阿里云部署1Panel(失败版)
阿里云·云计算
小美哥13143 小时前
yum使用阿里云的镜像源报错 Failed connect to mirrors.aliyuncs.com:80; Connection refused“
linux·运维·服务器·阿里云·云计算
caohuixue_20213 小时前
阿里云k8s如何创建可用的api token
阿里云·kubernetes·云计算