开源项目one-api的k8s容器化部署(上)-- 制作镜像及部署准备

news2025/6/23 21:04:54

一、背景

最近需要对开源项目one-api进行k8s容器化部署,主要分以下几个步骤:

  • 制作docker镜像
  • 申请mysql和redis数据库
  • docker-compose部署方式
  • k8s部署方式

整个的篇幅比较长,将会分成上下两篇来阐述。

二、制作docker镜像

开源项目one-api已经提供了Dockerfile文件,按说制作一个私有镜像是非常简单的事情,可是却遇到了一个大坑。
主要是因为golang的版本问题。

官方Dockerfile所使用的是golang,并没有指定版本,也即golang:latest。
go version查看得到其版本为1.17。

这是我们要修改的第一点,指定golang的版本。

# 修改前
FROM golang AS builder2

# 修改后
FROM golang:1.19-alpine AS builder2

golang:1.19-alpine

在这里插入图片描述

第二、我们在构建go项目的时候,增加国内镜像代理,以加速构建。

ENV GOPROXY=https://goproxy.cn,direct

第三、整个Dockerfile先是构建前端页面,再是构建go项目。本文主要是针对go项目的构建进行了改动。
完整的Dockerfile,修改后的内容,详见下:

# 指定golang的版本
FROM golang:1.19-alpine AS builder2

# 增加go镜像代理
ENV GOPROXY=https://goproxy.cn,direct \
    GO111MODULE=on \
    CGO_ENABLED=1 \
    GOOS=linux

# 切换工作目录至/build
WORKDIR /build

ADD go.mod go.sum ./
RUN go mod download

# 安装C编译器
RUN apk add --no-cache build-base

COPY . .
COPY --from=builder /web/build ./web/build
RUN go build -ldflags "-s -w -X 'github.com/songquanpeng/one-api/common.Version=$(cat VERSION)' -extldflags '-static'" -o one-api

# 总结这一阶段,会在工作目录/build下生成一个可执行文件one-api

# 下面是把它单拎出去,使用轻量级容器alpine,运行该可执行文件。

FROM alpine

RUN apk update \
    && apk upgrade \
    && apk add --no-cache ca-certificates tzdata \
    && update-ca-certificates 2>/dev/null || true

# 把可执行文件/build/one-api拷贝至alpine系统的根目录/下
COPY --from=builder2 /build/one-api /

EXPOSE 5175

# 切换工作目录至/data
WORKDIR /data

# 运行根目录下的可执行文件one-api
ENTRYPOINT ["/one-api"]

golang版本导致build报错

  • /go/pkg/mod/github.com/jackc/pgx/v5@v5.5.4/pgtype/builtin_wrappers.go:9:2: package net/netip is not in GOROOT (/usr/local/go/src/net/netip)
    在Go 1.17及以后的版本中,net/netip包已经被移动到golang.org/x/net模块中。这个错误的解决办法就是升级go版本。

  • github.com/mattn/go-sqlite3 cgo: C compiler “gcc” not found: exec: “gcc”: executable file not found in $PATH
    安装CGO所需的C编译器和库,在RUN go mod download后面,在RUN go build的前面,增加命令:RUN apk add --no-cache build-base。(因为golang:1.19-alpine使用musl libc,而不是glibc,并且默认不包含gcc)

  • Step 20/29 : RUN go mod download
    —> Running in f29cd7f8f144
    go mod download: zip: not a valid zip file
    这是因为网络慢导致的错误,解决版本是使用go镜像代理。

  • github.com/jackc/puddle/v2
    /go/pkg/mod/github.com/jackc/puddle/v2@v2.2.1/pool.go:142:30: undefined: atomic.Int64
    note: module requires Go 1.19
    github.com/mattn/go-sqlite3
    cgo: C compiler “gcc” not found: exec: “gcc”: executable file not found in $PATH
    这个错误是当时使用了golang:1.19镜像,后修改为golang:1.19-alpine解决。

其他调试命令

如果你根据报错信息去修改的话,可能会需要打印一些环境信息。

  • RUN go env
  • RUN go version
  • RUN echo $PATH

在构建docker镜像的过程中,还遇到许多报错,这里就不一一列举,报错的原因也都是因为golang的版本,期间使用过1.16/1.18/1.19,最后是使用1.19-alpine解决。

而one-api项目的go.mod文件指定使用1.18。

所以说,关于golang的版本问题很乱,我也是一通乱试。

在这里插入图片描述

三、关系型数据库DDL

在开发环境,我们只需新建数据库one_api即可。
但是,在生产环境,我们建议你手动建库建表.

CREATE DATABASE `one_api` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */;


CREATE TABLE `one_api`.`abilities` (
  `group` varchar(32) COLLATE utf8mb4_bin NOT NULL,
  `model` varchar(191) COLLATE utf8mb4_bin NOT NULL,
  `channel_id` bigint(20) NOT NULL,
  `enabled` tinyint(1) DEFAULT NULL,
  `priority` bigint(20) DEFAULT '0',
  PRIMARY KEY (`group`,`model`,`channel_id`),
  KEY `idx_abilities_priority` (`priority`),
  KEY `idx_abilities_channel_id` (`channel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `one_api`.`channels` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `type` bigint(20) DEFAULT '0',
  `key` text COLLATE utf8mb4_bin,
  `status` bigint(20) DEFAULT '1',
  `name` varchar(191) COLLATE utf8mb4_bin DEFAULT NULL,
  `weight` bigint(20) unsigned DEFAULT '0',
  `created_time` bigint(20) DEFAULT NULL,
  `test_time` bigint(20) DEFAULT NULL,
  `response_time` bigint(20) DEFAULT NULL,
  `base_url` varchar(191) COLLATE utf8mb4_bin DEFAULT '',
  `other` longtext COLLATE utf8mb4_bin,
  `balance` double DEFAULT NULL,
  `balance_updated_time` bigint(20) DEFAULT NULL,
  `models` longtext COLLATE utf8mb4_bin,
  `group` varchar(32) COLLATE utf8mb4_bin DEFAULT 'default',
  `used_quota` bigint(20) DEFAULT '0',
  `model_mapping` varchar(1024) COLLATE utf8mb4_bin DEFAULT '',
  `priority` bigint(20) DEFAULT '0',
  `config` longtext COLLATE utf8mb4_bin,
  PRIMARY KEY (`id`),
  KEY `idx_channels_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `one_api`.`logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL,
  `created_at` bigint(20) DEFAULT NULL,
  `type` bigint(20) DEFAULT NULL,
  `content` longtext COLLATE utf8mb4_bin,
  `username` varchar(191) COLLATE utf8mb4_bin DEFAULT '',
  `token_name` varchar(191) COLLATE utf8mb4_bin DEFAULT '',
  `model_name` varchar(191) COLLATE utf8mb4_bin DEFAULT '',
  `quota` bigint(20) DEFAULT '0',
  `prompt_tokens` bigint(20) DEFAULT '0',
  `completion_tokens` bigint(20) DEFAULT '0',
  `channel_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_username_model_name` (`model_name`,`username`),
  KEY `idx_logs_token_name` (`token_name`),
  KEY `idx_logs_model_name` (`model_name`),
  KEY `idx_logs_channel_id` (`channel_id`),
  KEY `idx_logs_user_id` (`user_id`),
  KEY `idx_created_at_type` (`created_at`,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `one_api`.`options` (
  `key` varchar(191) COLLATE utf8mb4_bin NOT NULL,
  `value` longtext COLLATE utf8mb4_bin,
  PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `one_api`.`redemptions` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL,
  `key` char(32) COLLATE utf8mb4_bin DEFAULT NULL,
  `status` bigint(20) DEFAULT '1',
  `name` varchar(191) COLLATE utf8mb4_bin DEFAULT NULL,
  `quota` bigint(20) DEFAULT '100',
  `created_time` bigint(20) DEFAULT NULL,
  `redeemed_time` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_redemptions_key` (`key`),
  KEY `idx_redemptions_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `one_api`.`tokens` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL,
  `key` char(48) COLLATE utf8mb4_bin DEFAULT NULL,
  `status` bigint(20) DEFAULT '1',
  `name` varchar(191) COLLATE utf8mb4_bin DEFAULT NULL,
  `created_time` bigint(20) DEFAULT NULL,
  `accessed_time` bigint(20) DEFAULT NULL,
  `expired_time` bigint(20) DEFAULT '-1',
  `remain_quota` bigint(20) DEFAULT '0',
  `unlimited_quota` tinyint(1) DEFAULT '0',
  `used_quota` bigint(20) DEFAULT '0',
  `models` varchar(191) COLLATE utf8mb4_bin DEFAULT '',
  `subnet` varchar(191) COLLATE utf8mb4_bin DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_tokens_key` (`key`),
  KEY `idx_tokens_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `one_api`.`users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(191) COLLATE utf8mb4_bin DEFAULT NULL,
  `password` longtext COLLATE utf8mb4_bin NOT NULL,
  `display_name` varchar(191) COLLATE utf8mb4_bin DEFAULT NULL,
  `role` bigint(20) DEFAULT '1',
  `status` bigint(20) DEFAULT '1',
  `email` varchar(191) COLLATE utf8mb4_bin DEFAULT NULL,
  `github_id` varchar(191) COLLATE utf8mb4_bin DEFAULT NULL,
  `wechat_id` varchar(191) COLLATE utf8mb4_bin DEFAULT NULL,
  `lark_id` varchar(191) COLLATE utf8mb4_bin DEFAULT NULL,
  `access_token` char(32) COLLATE utf8mb4_bin DEFAULT NULL,
  `quota` bigint(20) DEFAULT '0',
  `used_quota` bigint(20) DEFAULT '0',
  `request_count` bigint(20) DEFAULT '0',
  `group` varchar(32) COLLATE utf8mb4_bin DEFAULT 'default',
  `aff_code` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL,
  `inviter_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `idx_users_aff_code` (`aff_code`),
  UNIQUE KEY `idx_users_access_token` (`access_token`),
  KEY `idx_users_lark_id` (`lark_id`),
  KEY `idx_users_email` (`email`),
  KEY `idx_users_git_hub_id` (`github_id`),
  KEY `idx_users_we_chat_id` (`wechat_id`),
  KEY `idx_users_inviter_id` (`inviter_id`),
  KEY `idx_users_username` (`username`),
  KEY `idx_users_display_name` (`display_name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

最后,登录用户初始化一个root用户:

  • dml语句:
INSERT INTO `one_api`.`users`
(id, username, password, display_name, `role`, status, email, github_id, wechat_id, lark_id, access_token, quota, used_quota, request_count, `group`, aff_code, inviter_id)
VALUES(1, 'root', '$2a$10$HAJRqAF884IGFJYvaAR.eu82GA8vNhQR.iQ0.jEYfovZNioyD91Te', 'Root User', 100, 1, '', '', '', '', '47d954235a724c399bfc3ea400eb3b2c', 500000000000000, 0, 0, 'default', '', 0);

四、redis数据库连接

非关系型数据库,不涉及ddl和dml了,仅给出连接地址的示例(区分有无密码)

  • 无密码
    redis://:192.168.80.116:6379

  • 有密码
    redis://:{password}:192.168.80.116:6379

五、docker-compose部署

测试并验证上面制作好的docker镜像,下文将把它部署到k8s容器里。

version: '3.4'

services:
  one-api:
    image: "xxx/one-api:1.0.0"
    container_name: one-api
    restart: always
    command: --port 5175
    ports:
      - "5175:5175"
    environment:
      - SQL_DSN=root:123456@tcp(192.168.80.116:3306)/one_api  # 修改此行,或注释掉以使用 SQLite 作为数据库
      - REDIS_CONN_STRING=redis://:192.168.80.116:6379
      - SESSION_SECRET=random_string  # 修改为随机字符串
      - TZ=Asia/Shanghai

在这里插入图片描述

[root@emc7 one-api]# docker-compose ps
 Name                Command               State           Ports         
-------------------------------------------------------------------------
one-api         /one-api --port 5175        Up      0.0.0.0:5175->5175/tcp

六、推送镜像

验证docker镜像后,推送至远程仓库,为下文k8s部署做准备。

[root@emc7 one-api]# docker images | grep one
xxx/one-api                                                       1.0.0               c290c605bd1b        6 hours ago         72.1MB
xxx-harbor-registry.cn-hangzhou.cr.aliyuncs.com/xxx/one-api-web   1.0.0               c290c605bd1b        6 hours ago         72.1MB

[root@emc7 one-api]# docker tag c290c605bd1b xxx-harbor-registry.cn-hangzhou.cr.aliyuncs.com/xxx/one-api-web:1.0.0

[root@emc7 one-api]# docker login --username={用户名} xxx-harbor-registry.cn-hangzhou.cr.aliyuncs.com --password {密码}

[root@emc7 one-api]# docker push xxx-harbor-registry.cn-hangzhou.cr.aliyuncs.com/xxx/one-api-web:1.0.0

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1584502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计选题之基于SSM的旅游管理系统【源码+PPT+文档+包运行成功+部署讲解】

💓项目咨询获取源码联系v💓xiaowan1860💓 🚩如何选题?🍑 对于项目设计中如何选题、让题目的难度在可控范围,以及如何在选题过程以及整个毕设过程中如何与老师沟通,有疑问不清晰的可…

迭代器模式【行为模式C++】

1.简介 迭代器模式是一种行为设计模式, 让你能在不暴露集合(聚合对象)底层表现形式 (列表、 栈和树等) 的情况下遍历集合(聚合对象)中所有的元素。 迭代器的意义就是将这个行为抽离封装起来&a…

非关系型数据库(缓存数据库)redis的集群

目录 一.群集模式——Cluster 1.原理 2.作用 3.特点 4.工作机制 哈希槽 哈希槽的分配 哈希槽可按照集群主机数平均分配(默认分配) 根据主机的性能以及功能自定义分配 redis集群的分片 分片 如何找到给定key的分片 优势 二. 搭建Redis群集…

Java快速入门系列-7(测试与调试)

第七章:测试与调试 第7章:测试与调试7.1 单元测试(JUnit)7.1.1 为什么要进行单元测试7.1.2 JUnit基础7.1.3 断言7.1.4 测试套件7.2 集成测试与系统测试7.2.1 集成测试7.2.2 系统测试7.3 调试技巧与工具7.3.1 断点7.3.2 单步执行7.3.3 变量检查7.3.4 条件断点7.3.5 日志记录…

Java快速入门系列-6(数据库编程与JDBC)

第六章:数据库编程与JDBC 6.1 SQL基础6.1.1 SQL基本结构与命令6.1.2 SQL高级查询6.1.3 SQL子查询与联接6.2 JDBC原理与使用6.2.1 JDBC驱动程序与URL6.2.2 Statement、PreparedStatement与CallableStatement6.2.3 数据库事务处理6.3 数据库连接池6.4 事务管理6.1 SQL基础 SQL(…

【Linux的进程篇章 - 环境变量的理解】

Linux学习笔记---007 Linux之进程优先级、环境变量以及地址空间的理解1、进程优先级1.1、什么是优先级?1.2、为什么要有优先级?1.3、Linux的优先级特点以及查看方式1.4、进程的几个特性 2、环境变量2.1、概念2.2、命令行参数2.2.1、什么是命令行参数&…

OVITO-2.9版本

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩! 主要专栏内容包括: †《LAMMPS小技巧》: ‾ \textbf…

BTI下的JOP问题

BTI分支目标识别精讲与实践系列 思考 1、什么是代码重用攻击?什么是ROP攻击?区别与联系? 2、什么是JOP攻击?间接分支跳转指令? 3、JOP攻击的缓解技术?控制流完整性保护? 4、BTI下的JOP如何缓解?什么是目标着陆台? 5、BTI的架构细节?硬件原理?间接分支类型?指…

HUD抬头显示器中如何设计LCD的阳光倒灌实验

关键词:阳光倒灌实验、HUD光照温升测试、LCD光照温升测试、太阳光模拟器 HUD(Head-Up Display,即抬头显示器)是一种将信息直接投影到驾驶员视线中的技术,通常用于飞机、汽车等驾驶舱内。HUD系统中的LCD(Liq…

背 单 词

单词: 买考研词汇闪过 研究艾宾浩斯遗忘曲线 https://www.bilibili.com/video/BV18Y4y1h7YR/?spm_id_from333.337.search-card.all.click&vd_source5cbefe6dd70d6d84830a5891ceab2bf9 单词方法 闪记背两排(5min)重复一遍(2mi…

test4111

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

在linux服务器上安装anaconda

遇到问题: 在linux服务器中查看当前有哪些虚拟环境,conda环境用不了,anaconda没有安装,所以要在linux服务器中安装虚拟环境 解决步骤如下: 1.首先下载anaconda的Linux版本的安装包 方法1:官网下载&#…

冯喜运:4.11白盘黄金原油最新走势分析及操作建议

黄金消息面解读:周三公布的数据显示,一项衡量美国基础通胀的指标连续第三个月超过预期,表明持续的价格压力可能会将美联储的降息推迟到今年晚些时候。美国3月未季调CPI年率录得3.5%,高于预期的3.4%水平,为2023年9月以来…

C#手术麻醉信息系统源码,技术框架:Vue,Ant-Design+百小僧开源框架

C#手术麻醉信息系统源码,技术框架:Vue,Ant-Design百小僧开源框架 手术麻醉系统主要用于在手术过程中监测和控制患者的状态,确保手术的顺利进行并保障患者的生命安全。该系统通过一系列先进的医疗设备和技术,为手术患者…

ruoyi-nbcio-plus基于vue3的flowable的自定义业务提交申请组件的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Shotcut:免费且开源的优质视频剪辑工具

Shotcut:您的专业级免费开源视频编辑利器,助您轻松实现创意无限的剪辑梦想!- 精选真开源,释放新价值。 概览 Shotcut,一款广受赞誉的免费、开源跨平台视频编辑软件,以其卓越的功能性和易用性赢得了全球用户…

【MATLAB源码-第6期】基于matlab的QPSK的误码率BER和误符号率SER仿真。

1、算法描述 QPSK,有时也称作四位元PSK、四相位PSK、4-PSK,在坐标图上看是圆上四个对称的点。通过四个相位,QPSK可以编码2位元符号。图中采用格雷码来达到最小位元错误率(BER) — 是BPSK的两倍. 这意味著可以在BPSK系统…

【动手学深度学习】15_汉诺塔问题

注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备python语言基础,本人小白,如内容有误感谢您的批评指正 汉诺塔(To…

成都百洲文化传媒有限公司靠谱吗?怎么样?

随着互联网的迅猛发展,电子商务行业迎来了前所未有的发展机遇。在这个变革的浪潮中,成都百洲文化传媒有限公司凭借其深厚的行业经验和创新的服务模式,正逐渐成为电商服务领域的新领军者。 一、创新引领,塑造电商服务新标准 成都百…

antd+Vue 3实现table行内upload文件图片上传【超详细图解】

目录 一、背景 二、效果图 三、代码 一、背景 一名被组长逼着干前端的苦逼后端&#xff0c;在一个晴天霹雳的日子&#xff0c;被要求前端订单产品实现上传产品图片并立刻回显图片。 二、效果图 三、代码 <template><a-table :dataSource"dataSource" :c…