【开源 API 网关】Apinto 安装与配置详解【Go 语言开发】
创始人
2024-06-03 01:32:53
0

Apinto 完全基于 Golang 开发,不基于现有第三方产品,因此具有外部依赖少,部署简单等特点。

各位可以通过以下方式进行部署:

下载官方提供的安装包安装(推荐)

1.下载安装包并解压,

wget https://github.com/eolinker/apinto/releases/download/v0.12.1/apinto_v0.12.1_linux_amd64.tar.gz && tar -zxvf apinto_v0.12.1_linux_amd64.tar.gz && cd apinto

Apinto 支持在 arm64、amd64 架构上运行。

请根据需要下载对应架构及系统的安装包,安装包下载请前往:https://github.com/eolinker/apinto

2.安装网关:

./install.sh install

执行该步骤将会生成配置文件 /etc/apinto/apinto.yml 和 /etc/apinto/config.yml,可根据需要修改。

3.启动

apinto start

备注:若网关启动不成功可以在 /var/log/apinto 目录下的日志文件排查原因,一般是路由监听端口被占用的情况,可以在 apinto 执行文件相同目录下的 config.yml 修改路由监听端口。

编译源码进行安装

访问 https://github.com/eolinker/apinto,下载源码后可执行编译脚本或者打包成安装包

1.从官方 github 仓库 clone 源码并且进入到项目中

git clone https://github.com/eolinker/apinto.git && cd apinto

2.编译脚本,编译后的可执行文件输出到当前目录下的 out 文件夹内

./build/cmd/build.sh  

3.进入程序所在目录并且运行程序

cd out
cd apinto-{time_stamp} #apinto-{time_stamp}目录是按编译时间生成的
cp config.yml.tmp config.yml #拷贝模板配置文件作为程序运行的配置文件
./apinto start

备注:由于代码会不定时更新,不推荐使用该方式进行安装。

Docker

Docker 部署教程点此进行跳转

Kubernetes 集群部署应用

APINTO 容器有两个可挂载的目录:

  • /var/lib/apinto:目录内有 data(数据文件放置目录),log(日志放置目录),extends(扩展仓库目录)

  • /etc/apinto:存放了config.yml 文件,该文件用于指定节点的路由监听端口,ssl 证书等信息。

备注/etc/apinto 目录不挂载的话将会使用默认配置文件,默认 admin 端口为 9400,http 端口为 8080。

创建 Service

以 NodePort 类型为例,端口配置请以应用的配置文件为标准。

注意:该服务需要与 APINTO 的 pod 在同一命名空间内。

apiVersion: v1
kind: Service
metadata:name: apinto-gateway-svc #服务名
spec:selector: app: apinto-gateway  #绑定标签为app: apinto-gateway的PODtype: NodePort # 默认为ClusterIP 集群内可访问,NodePort 节点可访问,LoadBalancer负载均衡模式ports:- port: 8080      #默认http端口name: apintohttptargetPort: 8080  # 容器端口nodePort: 31080   # 节点端口,范围固定 30000 ~ 32767- port: 9400      #默认admin端口name: apintoadmintargetPort: 9400  # 容器端口nodePort: 31094   # 节点端口,范围固定 30000 ~ 32767

部署POD(不挂载目录)

不挂载容器目录可以使用 deployment 进行部署。使用 replicas 指定副本数量,创建该 deployment 之后所有 POD 会自动加入集群。

apiVersion: apps/v1
kind: Deployment
metadata:name: apinto-gateway
spec:replicas: 3selector:  matchLabels:app: apinto-gateway #POD标签,用于与Service绑定。# 定义 Pod 相关数据template:metadata:labels:app: apinto-gateway #pod的标签spec:# 定义容器containers:- name: apinto-gateway # 容器名字image: eolinker/apinto-gateway:latestimagePullPolicy: Alwayslifecycle:postStart: #容器运行加入集群脚本exec:command: ["/bin/bash", "-c", "nohup bash /apinto/join.sh >nohup.out 2>&1 &"]preStop:  #容器关闭前运行离开集群脚本exec:command: ["/bin/bash","-c","bash /apinto/leave.sh"]env:- name: POD_IP #将pod_id加入环境变量valueFrom:fieldRef:fieldPath: status.podIP- name: SVC_NAME  #将apinto服务名加入环境变量value: "apinto-gateway-svc"- name: SVC_NAMESPACE #指定apinto服务所在命名空间value: "default"- name: APINTO_ADMIN_PORTvalue: "9400"- name: SVC_TOKEN  #将访问k8s集群的TOKEN加入环境变量value: "${TOKEN}"

备注

  • 若 k8s 集群开启了 token 访问模式,则需要在配置内传入 token 作为环境变量;
  • 需指定 Apinto 服务名以及其命名空间作为 POD 环境变量;
  • 若只想部署单个 POD,可以将配置文件内的 lifecycle 和 env 环境变量删除。

部署 POD (挂载目录)

注意:当要挂载存放日志和数据文件的 /var/lib/apinto 目录时,一个 PVC 只能被一个 POD 使用。

以下均以挂载 /var/lib/apinto 为示例。

Local 卷本地挂载

使用 Local 卷需要创建 SC,PV 以及 PVC。建议 PV 配置 nodeAffinity,使挂载目录分配到所有 worker 节点。

创建 StorageClass 存储类

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: local-storage
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain  #回收策略
volumeBindingMode: WaitForFirstConsumer #延迟卷绑定使得调度器在为 PersistentVolumeClaim 选择一个合适的 PersistentVolume 时能考虑到所有 Pod 的调度限制。

创建 PersistentVolume

使用 nodeAffinity 指定具体的 worker 节点挂载。

apiVersion: v1
kind: PersistentVolume
metadata:name: apinto-pv1 #pv名labels:pv: local-pv1 #标签,可用来匹配具体的pvc
spec:capacity:storage: 1GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /mnt/apinto/ #节点目录nodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostname #表示pv创建在含有kubernetes.io/hostname:node1 标签的节点operator: In values:- node1

备注:要创建多个PV时需要修改示例里metadata的pv名以及标签,其他配置仅作参考。

创建 PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-local-node1  #pvc名
spec:storageClassName: local-storageaccessModes:- ReadWriteOnceresources:requests:storage: 1Giselector:  #选择器,可用来匹配特定的pv。也可不配置selector,交由调度器匹配。matchLabels:pv: local-pv1

备注:要创建多个PVC时需要修改示例里metadata的pvc名以及spec-selector-matchLabels匹配标签,其他配置仅作参考。

创建 POD

以下为多个 POD 集群部署的示例,单个 POD 部署删除 lifecycle 以及 env 即可。

apiVersion: v1
kind: Pod
metadata:name: apinto-pod1  #pod名labels: app: apinto-gateway #标签,用于绑定Service
spec:volumes:- name: pv-localpersistentVolumeClaim:claimName: pvc-local-node1 #使用的pvccontainers:- name: apinto-gateway image: eolinker/apinto-gateway:latest imagePullPolicy: Always lifecycle:postStart: #容器运行前启动加入集群脚本exec:command: ["/bin/bash", "-c", "nohup bash /apinto/join.sh >nohup.out 2>&1 &"]preStop:  #容器关闭前运行离开集群脚本exec:command: ["/bin/bash","-c","bash /apinto/leave.sh"]volumeMounts:  #目录挂载- mountPath: /var/lib/apintoname: pv-localenv:- name: POD_IP #将pod_id加入环境变量valueFrom:fieldRef:fieldPath: status.podIP- name: SVC_NAME  #将apinto服务名加入环境变量value: "apinto-gateway-svc"- name: SVC_NAMESPACE #指定apinto服务所在命名空间value: "default"- name: APINTO_ADMIN_PORTvalue: "9400"- name: SVC_TOKEN  #将master节点的TOKEN加入环境变量value: "${TOKEN}"

静态 NFS 卷

创建静态 NFS PV 很简单,指定 nfs 的服务器地址即可。需要注意的是 NFS Server 要能与 k8s 集群内使用 nfs 卷的 worker 节点连通。

创建 PersistentVolume

apiVersion: v1
kind: PersistentVolume
metadata:name: apinto-nfs-pv1 #pv名labels:pv: nfs-pv1 #标签,可用来匹配具体的pvc
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain storageClassName: nfsnfs:path: /nfs/data/apinto #nfs服务器上的挂载目录server: ${nfs_server_ip}nodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostname #表示pv创建在含有kubernetes.io/hostname:node1 标签的节点operator: In values:- node1 

备注: 需要在部署了 NFS 的服务器上,给要挂载的共享目录分配权限。

创建 PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc1
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: nfsselector:matchLabels:pv: nfs-pv1

创建 POD

以下为多个 POD 集群部署的示例,单个 POD 部署删除 lifecycle 以及 env 即可。

apiVersion: v1
kind: Pod
metadata:name: apinto-nfs-pod1  #pod名labels:app: apinto-gateway
spec:volumes:- name: pv-nfspersistentVolumeClaim:claimName: nfs-pvc1 #使用的pvccontainers:- name: nfs-apinto image: eolinker/apinto-gateway:latestimagePullPolicy: Alwayslifecycle:postStart: #容器运行前启动加入集群脚本exec:command: ["/bin/bash", "-c", "nohup bash /apinto/join.sh >nohup.out 2>&1 &"]preStop:  #容器关闭前运行离开集群脚本exec:command: ["/bin/bash","-c","bash /apinto/leave.sh"]volumeMounts:- mountPath: /var/lib/apintoname: pv-nfsenv:- name: POD_IP #将pod_id加入环境变量valueFrom:fieldRef:fieldPath: status.podIP- name: SVC_NAME  #将服务名加入环境变量value: "apinto-gateway-svc"- name: SVC_NAMESPACE #指定apinto服务所在命名空间value: "default"- name: APINTO_ADMIN_PORTvalue: "9400"- name: SVC_TOKEN  #将master节点的TOKEN加入环境变量value: "${TOKEN}"

动态 NFS 卷(推荐)

我们推荐使用动态 NFS 卷进行远程目录挂载,理由如下:

  • 可以通过创建 PVC 动态地创建对应 PV,无需手动创建 PV。
  • 每创建一个 PVC,都会在 NFS 服务器上的共享目录创建一个以 ${namespace}-${pvcName}-${pvName}的命名格式的目录,无需手动在 NFS 服务器上创建多个目录。并且回收时会重命名为archieved-${namespace}-${pvcName}-${pvName} 的命名格式的目录。

备注:NFS Server 要能与 k8s 集群内使用 nfs 卷的 worker 节点连通。

创建 nfs-client-provisioner POD

apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisioner
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: quay.io/external_storage/nfs-client-provisioner:latestvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: apinto/nfs-client-provisioner  #PROVISIONER_NAME需要与下面StorageClass的provisioner保持一致- name: NFS_SERVERvalue: ${NFS_SERVER}   #NFS_SERVER的值需要与下面的NFS_SERVER保持一致- name: NFS_PATHvalue: /nfs/data/apinto   #NFS_PATH的值需要与厦门的path值保持一致volumes:- name: nfs-client-rootnfs:server: ${NFS_SERVER} #NFS服务器IPpath: /nfs/data/apinto    #NFS 共享目录

创建 StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-nfs-storage
provisioner: apinto/nfs-client-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
reclaimPolicy: Delete  #回收策略
parameters:archiveOnDelete: "true" #回收时是否将要删除的目录重命名保存

注意:nfs 的 reclaimPolicy 字段只支持 Delete 和 Retain

授权 provisioner

若集群启用了 RBAC,需要配置授权。

kind: ServiceAccount
apiVersion: v1
metadata:name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io

创建 PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-dynamic-claimannotations:volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi

创建 POD

yaml 文件参考静态 NFS 的 POD,不再赘述。

相关内容

热门资讯

苹果表有安卓系统时间,时间同步... 你有没有发现,最近苹果表也开始支持安卓系统了?没错,就是那个一直以封闭著称的苹果,竟然也开始拥抱安卓...
原生安卓系统裁剪图片,原生安卓... 你有没有发现,用原生安卓系统拍照,有时候拍出来的照片分辨率超高,但就是有点大,想裁剪却不知道怎么操作...
安卓系统蓝牙开关APP,安卓系... 你有没有遇到过这种情况:手机里的安卓系统蓝牙开关总是让人摸不着头脑?有时候想开蓝牙,却找不到开关在哪...
安卓系统能登录ios系统王者吗... 你有没有想过,安卓系的手机能不能登录iOS系统的王者荣耀呢?这可是个让人好奇不已的问题哦!毕竟,两个...
苹果和安卓系统文件怎么,系统架... 你有没有想过,为什么你的手机里那么多乱糟糟的文件,有时候找起来还真是头疼?今天,就让我来给你好好捋一...
安卓系统9.0稳定版,深度解析... 你知道吗?最近安卓系统9.0稳定版可是火得一塌糊涂呢!这款系统不仅带来了全新的功能和优化,还让无数安...
安卓系统目录结构网盘,安卓系统... 你有没有想过,你的安卓手机里那些看似杂乱无章的文件,其实背后隐藏着一个有序的目录结构呢?今天,就让我...
安卓系统在哪里买专辑,专辑购买... 你有没有想过,手机里那熟悉的安卓系统,竟然也能帮你买到心仪的专辑呢?没错,就是那个让你随时随地畅享音...
鸿蒙系统离开了安卓吗,迈向独立... 你有没有听说最近鸿蒙系统的大动作?没错,就是那个让安卓和iOS都紧张起来的操作系统。今天,咱们就来聊...
安卓系统耗电本地视频,本地视频... 手机电量总是不够用,是不是你也和我一样,对安卓系统的耗电问题头疼不已?尤其是当你想看个本地视频放松一...
手机安卓最好的系统是,揭秘最佳... 你有没有想过,为什么你的手机用起来有时候那么顺畅,有时候又那么卡顿呢?这背后其实和手机系统有着千丝万...
怎么拍镜像照片安卓系统,如何拍... 摄影爱好者们,你是否曾对那些在水中倒影中捕捉到的美丽瞬间感到着迷?想要在安卓手机上也能轻松拍出这样的...
安卓7运行xp系统,兼容性与性... 你有没有想过,把一个古老的操作系统装在现代的安卓设备上?想象安卓7系统下运行Windows XP,这...
戴尔安卓系统升级,解锁无限可能 你有没有发现,你的戴尔安卓设备最近是不是变得有点儿不一样了?没错,就是那个戴尔安卓系统升级,它就像一...
安卓系统怎么变苹果主题,打造苹... 你有没有想过,把你的安卓手机变成苹果风格的呢?想象那光滑的界面、简洁的图标,是不是瞬间觉得高大上了?...
系统进程有病毒吗安卓,安卓安全... 你有没有想过,你的安卓手机里那些忙碌的系统进程,它们会不会突然生病了呢?没错,我说的就是病毒!今天,...
编程安卓系统和鸿蒙主题,跨平台... 你有没有想过,手机的世界里,除了苹果的iOS和安卓的操作系统,还有个神秘的鸿蒙系统?今天,咱们就来聊...
哪个安卓机系统好用,探索安卓系... 你有没有想过,手机里的安卓系统就像是个大厨,不同的系统就像不同的烹饪手法,有的让你吃得津津有味,有的...
安卓如何控制苹果系统,从安卓到... 你知道吗?在这个科技飞速发展的时代,安卓和苹果两大操作系统之间的较量从未停歇。虽然它们各自有着忠实的...
安卓原生系统文件夹,安卓原生系... 你有没有发现,每次打开安卓手机,里面那些文件夹就像是一个个神秘的宝箱,里面藏着各种各样的宝贝?今天,...