0%

非运维相关服务

非运维相关服务

这里记录一些非运维技术性服务的安装部署及运维相关问题。因公司用到,故记录一下。

yapi

可视化接口管理平台

k8s部署yapi

yapi依赖于nodejs,因这里是容器化部署,则不考虑node版本号。其数据库为mongodb,这里部署采用的镜像是dockerhub上面的yapipro/yapi。

dockerhub地址:https://hub.docker.com/r/yapipro/yapi

mongodb部署

mongodb.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1 #apiserver的版本
kind: Deployment #副本控制器deployment,管理pod和RS
metadata:
name: mongo #deployment的名称,全局唯一
spec:
replicas: 1 #Pod副本期待数量
selector:
matchLabels: #定义RS的标签
app: mongo #符合目标的Pod拥有此标签
strategy: #定义升级的策略
type: RollingUpdate #滚动升级,逐步替换的策略
template: #根据此模板创建Pod的副本(实例)
metadata:
labels:
app: mongo #Pod副本的标签,对应RS的Selector
spec:
containers: #Pod里容器的定义部分
- name: mongo #容器的名称
image: docker-registry.finsiot.com/finsiot/mongo:latest #容器对应的docker镜像
volumeMounts: #容器内挂载点的定义部分
- name: time-zone #容器内挂载点名称
mountPath: /etc/localtime #容器内挂载点路径,可以是文件或目录
- name: mongo-data
mountPath: /data/db #容器内mongo的数据目录
ports:
- containerPort: 27017 #容器暴露的端口号
env: #写入到容器内的环境容量
- name: MONGO_INITDB_DATABASE
value: "yapi"
- name: MONGO_INITDB_ROOT_USERNAME
value: 'yapipro'
- name: MONGO_INITDB_ROOT_PASSWORD
value: 'yapipro1024'
resources:
limits:
cpu: 2000m
memory: 2048Mi
requests:
cpu: 200m
memory: 512Mi
volumes:
- name: time-zone #数据卷名称,需要与容器内挂载点名称一致
hostPath:
path: /etc/localtime #挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区
- name: mongo-data
persistentVolumeClaim:
claimName: mongo
---
apiVersion: v1
kind: Service
metadata:
name: mongo
labels:
app: mongo
spec:
type: ClusterIP
ports:
- name: tcp
port: 27017
selector:
app: mongo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
部署以及创建用户和库
kubectl apply -f mongodb.yaml
kubectl exec -it mongodb-xx /bin/bash
mongosh
进入 MongoDB 的 mongo cli 后,执行以下语句进行初始化库表
use admin;
db.auth("yapipro", "yapipro1024");
# 创建 yapi 数据库
use yapi;
# 创建给 yapi 使用的账号和密码,限制权限
db.createUser({
user: 'yapi',
pwd: 'yapi123456',
roles: [
{ role: "dbAdmin", db: "yapi" },
{ role: "readWrite", db: "yapi" }
]
});
# 退出 Mongo Cli
exit
# 退出容器
exit

yapi部署

config.json:

该文件是yapi启动的配置文件,数据库配置是必选项。(mail和ldap可以不用配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"port": "3000",
"adminAccount": "hexiaohei1024@gmail.com",
"timeout":120000,
"db": {
"servername": "192.168.110.29",
"DATABASE": "yapi",
"port": 27017,
"user": "yapi",
"pass": "yapi123456",
"authSource": ""
},
"ldapLogin": {
"enable": true,
"server": "ldap://192.168.110.29:30389",
"baseDn": "cn=Admin,dc=finsiot,dc=com",
"bindPassword": "123456",
"searchDn": "ou=people,dc=finsiot,dc=com",
"searchStandard": "&(objectClass=posixAccount)(uid=%s)"
},
"mail": {
"enable": true,
"host": "smtp.gmail.com",
"port": 465,
"from": "*",
"auth": {
"user": "hexiaohei1024@gmail.com",
"pass": "123456"
}
}
}
1
kubectl create configmap yapi-configjson -n devops --from-file=config.json

yapi.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
apiVersion: apps/v1                 #apiserver的版本
kind: Deployment #副本控制器deployment,管理pod和RS
metadata:
name: yapi #deployment的名称,全局唯一
spec:
replicas: 1 #Pod副本期待数量
selector:
matchLabels: #定义RS的标签
app: yapi #符合目标的Pod拥有此标签
strategy: #定义升级的策略
type: RollingUpdate #滚动升级,逐步替换的策略
template: #根据此模板创建Pod的副本(实例)
metadata:
labels:
app: yapi #Pod副本的标签,对应RS的Selector
spec:
containers: #Pod里容器的定义部分
- name: yapi #容器的名称
image: yapipro/yapi #容器对应的docker镜像
args: ['server/app.js']
volumeMounts: #容器内挂载点的定义部分
- name: time-zone #容器内挂载点名称
mountPath: /etc/localtime #容器内挂载点路径,可以是文件或目录
- name: yapi-configjson
mountPath: /yapi/config.json
subPath: config.json #容器内yapi的数据目录
ports:
- containerPort: 3000 #容器暴露的端口号
volumes:
- name: time-zone #数据卷名称,需要与容器内挂载点名称一致
hostPath:
path: /etc/localtime #挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区
- name: yapi-configjson
configMap:
name: yapi-configjson
---
apiVersion: v1
kind: Service
metadata:
name: yapi
labels:
app: yapi
spec:
type: ClusterIP
ports:
- name: tcp
port: 3000
selector:
app: yapi
---
apiVersion: networking.k8s.io/v1 #这里ingress没用到可以不填写,但需要改service的类型,否则没有外部访问的地址。
kind: Ingress
metadata:
name: yapi
spec:
ingressClassName: nginx
rules:
- host: yapi.dev.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: yapi
port:
number: 3000

1
kubectl apply -f yapi.yaml

yapi迁移

yapi本身没有数据文件(除了config.json),所以只需要迁移其mongodb即可。

mongodb迁移

1
2
mongodump -h 原有mongo地址 -d yapi -u yapi -p yapi123456 -o /tmp/mongodb-ysw/
mongorestore -h 迁移的mongo地址 -d yapi -u yapipro -p yapipro1024 --authenticationDatabase admin /tmp/mongodb-ysw/

禅道

著名的开源项目管理系统,这里就不做上面接受了。

官网:https://www.zentao.net/

禅道本身是php的,如果是二进制部署,除了本身的包文件以为,需要提前部署nginx、php-fpm,以及数据库mysql。

k8s部署禅道

dockerhub:https://hub.docker.com/r/easysoft/zentao

由于这里用到了禅道ldap插件,所以使用禅道12版本。(高版本ldap不兼容)

这里禅道官方容器默认继承了mysql,所以mysql无需额外安装。需要注意的是这里的mysql默认只监听了127.0.0.1,如果要监听外网访问,除了svc配置端口以外,还需要把mysql配置文件挂载进去。配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
挂载mysql配置文件,使其监听外网访问:
首先创建配置文件
50-server.cnf
---
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

bind-address = 0.0.0.0
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
query_cache_limit = 1M
query_cache_size = 16M
log_error = /var/log/mysql/error.log
expire_logs_days = 10
max_binlog_size = 100M
---
kubectl create configmap zentao-mycnf --from-file=50-server.cnf

zendao.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zentao
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 250Gi
#禅道本身需要将数据文件目录挂载出来
---
apiVersion: apps/v1 #apiserver的版本
kind: Deployment #副本控制器deployment,管理pod和RS
metadata:
name: zentao #deployment的名称,全局唯一
spec:
replicas: 1 #Pod副本期待数量
selector:
matchLabels: #定义RS的标签
app: zentao #符合目标的Pod拥有此标签
strategy: #定义升级的策略
type: RollingUpdate #滚动升级,逐步替换的策略
template: #根据此模板创建Pod的副本(实例)
metadata:
labels:
app: zentao #Pod副本的标签,对应RS的Selector
spec:
containers: #Pod里容器的定义部分
- name: zentao #容器的名称
image: easysoft/zentao:12.5.3 #容器对应的docker镜像
volumeMounts: #容器内挂载点的定义部分
- name: time-zone #容器内挂载点名称
mountPath: /etc/localtime #容器内挂载点路径,可以是文件或目录
- name: zentao
mountPath: /www/zentaopms #容器内zentao的数据目录
subPath: zentaopms
- name: zentao
mountPath: /var/lib/mysql #容器内zentao的数据目
subPath: mysql
- name: mycnf
mountPath: /etc/mysql/mariadb.conf.d/50-server.cnf
subPath: 50-server.cnf
ports:
- containerPort: 80 #容器暴露的端口号
env: #写入到容器内的环境容量
- name: MYSQL_ROOT_PASSWORD #定义了一个zentao的root密码的变量
value: "123456"
resources:
limits:
cpu: 2000m
memory: 2048Mi
requests:
cpu: 200m
memory: 512Mi
volumes:
- name: time-zone #数据卷名称,需要与容器内挂载点名称一致
hostPath:
path: /etc/localtime #挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区
- name: zentao
persistentVolumeClaim:
claimName: zentao
- name: mycnf
configMap:
name: zentao-mycnf
---
apiVersion: v1
kind: Service
metadata:
name: zentao
labels:
app: zentao
spec:
type: NodePort
ports:
- name: tcp
port: 80
- name: mysql
port: 3306
selector:
app: zentao
---
apiVersion: networking.k8s.io/v1 #这个看需求创建,如果不使用域名访问可以不创建
kind: Ingress
metadata:
name: zentao
spec:
ingressClassName: nginx
rules:
- host: zentao.dev.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: zentao
port:
number: 80

1
kubectl apply -f zentao.yaml