名词解释

  • 命名空间:服务运存在K8S集群的命名空间
  • harbor私仓:docker 镜像私有仓库,存放多个项目及工程打包后的镜像、版本
  • 工程镜像tag:通过 docker builddocker push 命令构建镜像得到,K8S运行的Docker镜像版本
  • 域名:服务访问的主入口,K8S需要通过域名来转发代理请求到各个服务
  • 伪域名:在没有申请到域名的情况下,可以通过更改本机的host文件内,IP对应的英文名的形式,实现伪域名访问网站的功能。
  • 服务入口:主入口下的二级目录;

部署流程

若依前后端分离版本为例

  1. 安装docker harbor私仓
  2. 在docker harbor私仓中创建项目及账号
  3. 创建数据库
  4. 前端工程镜像打包,及推送至harbor私仓
  5. 后端工程镜像打包,及推送至harbor私仓
  6. 编写k8s拉取镜像的yaml脚本
  7. kuboard操作并拉取镜像部署

更新流程

首次将前后端工程部署至k8s,需要配置如Dockerfiledefault.confDeployment.yaml等配置文件,但在后续更新过程中,在路由等配置不变的情况下,这些文件往往也不需要做什么调整,所以更新流程会比较简洁。

  1. 前端工程镜像打包,及推送至harbor私仓
  2. 后端工程镜像打包,及推送至harbor私仓
  3. k8s修改镜像版本,自动拉取及部署

1. 安装docker harbor私仓

为了便于管理及维护工程镜像版本,推荐使用harbor私仓管理工程迭代过程中的镜像源及版本

安装方式不具体讲解,请自行查阅资料

2. 在docker harbor私仓中创建项目及账号

根据研发管理体系,创建不同的项目及账号,将不同业务线、业务组按项目划分
注意:私仓中的项目需要为公开项目,否则k8s无法从私有项目拉取镜像

这里不详细展开讲解创建项目步骤,请自行查阅资料。

本教程创建pi-lz项目,作为后续存储镜像源。

3. 创建数据库

涉及到后端工程部署,对数据库在哪里没有特别要求,只要部署后能访问到即可。

注意:数据库需支持utf8mb4_general_ci格式

创建数据库命令如下

CREATE DATABASE IF NOT EXISTS `数据库名` DEFAULT CHARACTER SET utf8mb4 COLLATE 'utf8mb4_general_ci';

4. 前端工程镜像打包,及推送至harbor私仓

前端工程打包镜像及推送harbor私仓步骤为:

  1. 安装工程依赖(首次)
  2. 打包
  3. 制作镜像
  4. 通过docker进行编译镜像
  5. 推送镜像到私仓
  6. 登录私仓查看结果
    注意:打包时,工程名称和描述文件中的工程名称尽量保持一致

1.安装工程依赖(首次)

执行命令,安装依赖

# cd到前端工程目录
cd /www/ruoyi/RuoYi-Vue-master/ruoyi-ui
# 指定安装源,速度快一些
npm install --registry=https://registry.npmmirror.com

2.打包

工程每次发版都需要打包

执行打包命令

npm run build:prod

成功后,ruoyi-ui目录下,生成dist文件夹

3.制作镜像

在不调整路由等情况下,往往只需要做一次。
文件建议放在工程根目录管理

在工程根目录(ruoyi-ui下)创建Dockerfiledefault.conf文件
下面2个文件模板是根据若依前端调整,具体可以由飞企协助调整后作为终版模板。

Dockerfile文件格式如下:

FROM node:14-alpine as builder
WORKDIR /build
COPY . .

RUN npm install --registry=https://registry.npmmirror.com
RUN npm run build:prod

FROM nginx:alpine
MAINTAINER 罗震<lz@demo.cn>

USER root
WORKDIR /usr/share/nginx/html/myfronted

COPY default.conf /etc/nginx/conf.d/
COPY --from=builder /build/dist /usr/share/nginx/html/myfronted/

expose 80

default.conf文件格式如下:

server {
    listen       80;
    server_name  localhost;
    charset utf-8;
    access_log  /var/log/nginx/host.access.log  main;
    error_log  /var/log/nginx/error.log  error;

    location / {
        root   /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
    }

    location /prod-api/ {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 根据实际地址替换,如: http[s]://域名:端口号/ruoyi-admin/
        proxy_pass $后端访问地址 ;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

4.通过docker进行编译

在工程根目录(ruoyi-ui下)运行命令,进行编译

# 私仓地址:为Harbor私仓url地址(不需要http[s]://),如dev.demo.cn:8082
# 项目名称:为Harbor私仓项目名称,如pi-lz(本教程为pi-lz)
# 工程名称:自定义,但不能和已上线镜像名相同,如my_fronted
# TAG版本:当前镜像版本,相同版本会覆盖私仓版本,如0.0.1
docker build -t 私仓地址/项目名称/工程名称:TAG版本 .

如:

docker build -t dev.demo.cn:8082/pi-lz/my_fronted:0.0.1 .

5.推送镜像到私仓

使用命令登录到个人私仓(首次,未过期情况下无需再次Login)

# 私仓地址:为Harbor私仓url地址(需要http[s]://),如https://dev.demo.cn:8082
# 回车后,需要输入创建的账号密码
docker login 私仓地址

使用命令推送build成功的镜像至私仓

# 私仓地址:为Harbor私仓url地址(不需要http[s]://),如dev.demo.com:8082
# 项目名称:为Harbor私仓项目名称,如pi-lz(本教程为pi-lz)
# 工程名称:自定义,但不能和已上线镜像名相同,如my_fronted
# TAG版本:当前镜像版本,相同版本会覆盖私仓版本,如0.0.1
docker push 私仓地址/项目名称/工程名称:TAG版本 .

如:

docker push dev.demo.cn:8082/pi-lz/my_fronted:0.0.1

6.登录私仓查看结果

浏览器访问私仓地址,登录账号密码,查看项目中是否存在push后的镜像及版本

5. 后端工程镜像打包,及推送至harbor私仓

后端工程打包镜像及推送harbor私仓步骤为:

  1. IDE打包jar包
  2. 制作镜像
  3. 通过docker进行编译镜像
  4. 推送镜像到私仓
  5. 登录私仓查看结果
    注意:打包时,工程名称和描述文件中的工程名称尽量保持一致

1. IDE打包jar包

由于使用IDE打开工程后,会自动安装依赖,这里跳过安装依赖步骤
自有的后端脚手架,只需打包成jar文件即可

这里不描述打包方式,如IDEA使用maven clean package进行打包

2. 制作镜像

在工程根目录创建Dockerfile文件

Dockerfile文件格式如下:
请根据实际注释,调整文件内容

FROM dev.demo.cn:8082/library/openjdk-fonts:8.302-jdk-alpine
MAINTAINER 罗震<lz@demo.cn>
EXPOSE 8080

WORKDIR /app
COPY ./target/ruoyi-admin.jar ./server.jar

ENTRYPOINT exec java  $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /server.jar $ENV_PROFILE

3. 通过docker进行编译镜像

和前端工程步骤一致

4. 推送镜像到私仓

和前端工程步骤一致

5. 登录私仓查看结果

和前端工程步骤一致

6. 编写k8s拉取镜像的yaml脚本

创建Deployment.yaml脚本,并描述相关信息。
请在这里描述,为什么要这样做!!!!!!!!!!!!!!

确定k8s部署的命名空间

登录kuboard管理工具

Kuboard运维管理工具
访问地址:http://域名:30080
默认账号:admin
默认密码: Kuboard123

查看命名空间

我们为客户部署的环境,自带ext命名空间,推荐直接使用

  1. 点击default集群

  1. 查看ext命名空间是否存在

前端工程

创建Deployment.yaml文件

创建使用下面的Deployment.yaml后,粘贴并修改下面模板。
推荐Deployment.yaml放到工程根目录中,一同管理。

注1:yaml中工程名不能有_下划线
注2:yaml中真实域名不能有端口号

apiVersion: apps/v1
kind: Deployment
metadata:
  name: $替换成工程名(如:myfronted)
  labels:
    app: $替换成工程名(如:myfronted)
    k8s.kuboard.cn/layer: 'web'
  namespace: $替换成真实命名空间(如:ext)
spec:
  replicas: 1
  selector:
    matchLabels:
      app: $替换成工程名(如:myfronted)
  template:
    metadata:
      labels:
        app: $替换成工程名(如:myfronted)
    spec:
      containers:
        - name: $替换成工程名(如:myfronted)
          image: 私仓地址/项目名称/工程名称:TAG版本(如:dev.demo.cn:8082/pi-lz/my_fronted:0.0.1)
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
          readinessProbe:
            failureThreshold: 3
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 80
            timeoutSeconds: 1
      dnsConfig:
        nameservers:
          - 114.114.114.114
      terminationGracePeriodSeconds: 60
---
apiVersion: v1
kind: Service
metadata:
  name: $替换成工程名(如:myfronted)
  namespace: $替换成真实命名空间(如:ext)
  labels:
    app: $替换成工程名(如:my_fronted)
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: $替换成工程名(如:my_fronted)
---
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
  name: $替换成工程名(如:my_fronted)
  namespace: $替换成真实命名空间(如:ext)
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
    nginx.ingress.kubernetes.io/proxy-body-size: 200m
spec:
  rules:
    - host: $替换成真实域名(如:如:dev.demo.cn)
      http:
        paths:
          - path: /$替换成服务入口(如:my_fronted)(/|$)(.*)
            backend:
              serviceName: $替换成工程名(如:my_fronted)
              servicePort: 80

后端工程

创建Deployment.yaml文件

创建使用下面的Deployment.yaml后,粘贴并修改下面模板。
推荐Deployment.yaml放到工程根目录中,一同管理。


apiVersion: apps/v1
kind: Deployment
metadata:
  name: $替换成工程名(如:ruoyi-admin)
  labels:
    app: $替换成工程名(如:ruoyi-admin)
    k8s.kuboard.cn/layer: 'svc'
  namespace: $替换成真实命名空间(如:ext)
spec:
  replicas: 1
  selector:
    matchLabels:
      app: $替换成工程名(如:ruoyi-admin)
  template:
    metadata:
      labels:
        app: $替换成工程名(如:ruoyi-admin)
    spec:
      containers:
        - name: $替换成工程名(如:ruoyi-admin)
          image: 私仓地址/项目名称/工程名称:TAG版本(如:dev.demo.cn:8082/pi-lz/ruoyi-admin:0.0.1imagePullPolicy: IfNotPresent
          envFrom:
            - configMapRef:
                name: pai-env-base
          ports:
            - containerPort: 8080
              protocol: TCP
            - containerPort: 2201
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 8080
            timeoutSeconds: 1
      dnsConfig:
        nameservers:
          - 114.114.114.114
      terminationGracePeriodSeconds: 60
---
apiVersion: v1
kind: Service
metadata:
  name: $替换成工程名(如:ruoyi-admin)
  namespace: $替换成真实命名空间(如:ext)
  labels:
    app: $替换成工程名(如:ruoyi-admin)
spec:
  type: NodePort
  ports:
    - name: web
      port: 8080
      protocol: TCP
      targetPort: 8080
    - name: health
      port: 2201
      protocol: TCP
      targetPort: 2201
  selector:
    app: $替换成工程名(如:ruoyi-admin)

配置后端路由

每个工程增加路由,只需做首次,后续无需重复
配置后端路由有2种方式:Nacos配置、k8s直接配置
配置方式二选一,取决于后端使用的技术栈,如果使用了Nacos,则用Nacos配置,反之使用k8s
注:由于若依未使用Nacos技术,所以使用k8s直接配置

Nacos配置

如果后端工程使用nacos,则通过Nacos来配置路由

  1. 登录Nacos管理工具

访问地址:https://域名/nacos
默认账号:nacos
默认密码:nacos

  1. 修改nacos配置文件

需要去nacosprod命名空间,找到pai-gateway-prod.yaml并编辑,加上此服务的路由。
放到id: index-workbench之前

        - id: $替换成工程名(如:ruoyi-admin)
          uri: lb://$替换成工程名(如:ruoyi-admin)
          predicates:
            - Path=/$替换成工程名(如:ruoyi-admin)-api/**
          filters:
            - StripPrefix=1

点击发布

配置完,当k8s部署工程成功后,访问的地址为:http[s]://域名/ruoyi-admin访问

k8s直接配置

k8s直接配置,需要在k8s拉取镜像后操作,请见第7章(下一章)第6节

7. kuboard操作并拉取镜像部署

前后端操作一致
拉取镜像的操作只需做一次,后续升级无需再重复拉取,只需调整镜像版本,见第8章

登录kuboard管理工具

Kuboard运维管理工具
访问地址:http://域名:30080
默认账号:admin
默认密码: Kuboard123

进入ext命名空间

  1. 点击default集群

  1. 点击ext命名空间

  1. 展开常用操作

从yaml创建

  1. 点击从yaml创建

  1. 选择yaml文件

  1. 查看yaml文件,确定

  1. 查看结果

    等待k8s拉取镜像并启动,需要几分钟的时间。
    点击该微服务,可以查看进度及详情

  1. 查看部署情况及分析部署日志

    k8s拉取镜像后,会执行运行工程。此时,工程如果运行报错,则根据报错信息调整镜像,重新拉取

k8s直接配置[可选]

如果后端工程不是用Nacos配置路由,则使用这种方式配置

  1. 访问kuboard管理工具
  2. 进入ext命名空间
  3. 选择应用程序 - 应用路由菜单
  4. 创建新的路由

  1. 添加新的路由规则(将域名和路径映射换成自己的)

配置完,当k8s部署工程成功后,访问的地址为:http[s]://域名/ruoyi-admin访问

8. 镜像、配置更新,部署运维等

镜像版本调整

仅需调整镜像版本,即可

修改版本号,k8s会自动从私仓拉取新的版本镜像。可以实现镜像升级、回滚

镜像回滚

镜像版本调整之外,通过点击历史版本也可以实现回滚操作

编辑yaml

不建议直接修改yaml,而是通过编辑的方式,修改配置内容
编辑中,包括了yaml脚本的配置项,不易出错

文档更新时间: 2024-08-04 11:29   作者:姚连洲