- 系统架构
- 操作步骤:
部署文档中除标红和加粗的文字需要格外注意!!! - 常用工具
./startup.sh (早期版本)
./startup.sh (今后版本)
repository_list.sh
trigger_init_global_repo.sh
reset.sh
reset_proxy.sh
download_docker_image.sh - 常用命令
- 常见问题排查
(1) 服务器更换ip之后,k8s集群启动失败:
可通过命令kubectl get pods -n ctbox 查看,如果返回类似 “The connection to the server :6443 was refused - did you specify the right host or port?” 的提示,可以断定k8s没有正常启动
(2) 服务器更换了ssh登陆的端口:
(3) 服务器重启之后,license-server 没有启动:
(4) 运行一段时间后所有服务cramped,通过 kubectl get pods -n ctbox 命令查看服务状态,有很多处于 “Evicted” 的状态:
(5) 服务正常启动,页面访问数据源管理没有显示任何库:
(6) 图片流正常,但盒子一直没有抓拍: - Q/A
(1) Q: 测试用推的视频流/图片流产生的抓拍和报警可以删除吗?
(2) Q: 本地库入库后发现有部分没有人员信息的图片,怎么批量筛选重导?
演示
培训视频:
安装和常用工具培训 http://r.qsh1.cn/rec/page?id=h84d4881476800zdp4
常用工具和常见问题排查培训 http://r.qsh1.cn/rec/page?id=h84d49080496002olp
- 系统架构
middlewares
Kubernetes
系统: uBeanOS 18.1.0 + docker ce
系统盘+驱动
(加密的)数据盘/data + docker数据
PaaS 0.6.2
License server
抓拍机管理程序
ctbox
middlewares命名空间中pod服务:
ctbox命名空间中pod服务:
- 操作步骤:
0.4版本系统内网部署操作文档
总结来说,部署方面:
(1) 安装操作系统和驱动
(2) 加密数据盘
(3) 镜像软链接
(4) 安装PaaS
(5) 抓拍机管理程序安装并且启动
(6) 配置 license,部署 license server,充值 license
(7) 安装
(8) 部署盒子服务,修改配置,启动盒子服务
(9) 验证盒子服务
(10) 更新repo alarm参数配置
部署文档中除标红和加粗的文字需要格外注意!!!
除此之外仍有一些需要解释:
-
早期版本是指在 成都天府 的项目,其他都是今后版本
-
加密数据盘是出于数据安全考虑,加密数据盘时会格式化磁盘,因此步骤(2)应紧邻安装系统(1)之后操作。同时不能对系统盘加密(会格式化系统),也不能对/home目录加密(会删除用户相关信息)
-
镜像软连接是因为docker和k8s的镜像地址默认在系统盘(分别位于/var/lib/docker和/opt/local-path-provisioner目录下),而系统盘空间远小于数据盘,为了防止空间被占满,需要迁移保存地址到数据盘。需要提醒的是,部署文档中迁移docker使用mv命令,故会原样保留原先已经加载的镜像包,迁移后无需重新下载包。而k8s的命令是rm后再mkdir,因此会删除所有已经下载的包。因此建议在安装PaaS之前完成
-
从架构图中可以看出,license server、抓拍机管理程序和PaaS处于同一层,因此它们的安装顺序原则上不分先后
-
PaaS安装后可以通过up create -f all_in_one.yaml 或在ctbox-deploy目录下运行 ./startup.sh -m (早期版本) ./startup.sh -m middlewares (今后版本)来安装k8s和部分中间组件。中间组件包括MySQL,Redis和MongoDB,位于middlewares命名空间下
-
在ctbox-deploy目录下运行./startup.sh -c (早期版本) ./startup.sh -m ctbox (今后版本) 可以安装ctbox相关服务,其中各个服务pod在启动之前会有初始化检查,用于判断该服务所依赖的其他服务是否已经完整启动,这些校验是通过轮询并sleep实现的,下面列举几个依赖的例子:
pilot服务是用于验证登陆用户和权限的服务,这些数据存储在MySQL数据库中,因此在pilot启动时会检查middlewares命名空间中的MySQL是否能连接上
ctbox-server是盒子的主要服务,在启动时需要去初始化人像库和设备树根节点,因此分别需要检查cvpf-repository-manager和cvpf-devman两个服务是否正常运行,同时ctbox-server将自己的一些数据和报警存储在MongoDB中,因此也要检测MongoDB的连通性
MongoDB
MySQL
Redis
ctbox-server
api-gateway
ctbox-server
ctbox-server
cvpf-devman
ctbox-server
cvpf-image-server
cvpf-repository-manager
ctbox-server
ctbox-server
ctbox-server
对于一个服务而言,只有它所依赖的其他服务都已经正常运行了,该服务才会开始启动。启动后服务不一定立刻调用所依赖的服务,一般会在有实际请求的时候才去调用
-
在ctbox-deploy目录下运行./startup.sh -a 可以同时完成4) 5) 两步,但需要提前修改好相关配置项再运行
-
由于使用容器化管理,各个服务之间的调用主要通过HTTP请求(少部分通过RPC),实现了一定程度的解耦,因此在有新的服务镜像包发布时,可单独停止该服务,修改配置(主要是相应服务的values.yaml中的image和tag字段),然后再启动该服务,无需停止其他服务。但自然地,在此期间所有依赖此服务的其他服务在调用此服务时会报错
-
导图入库要求服务读取指定位置的图片文件夹,该路径通常是/ctboxRuntime/ctboxImportRepo/data,但在发送HTTP请求时又不带上这些路径前缀,这是因为物理机路径和容器内路径的配置所致,可以查看/ctbox-deploy/XXX-serive/templates/deployment.yaml文件中关于volume和volumeMount相关配置
- 常用工具
对于部署在k8s之上的ctbox,早期版本工具有 ./startup.sh,repository_list 和 trigger_init_global_repo,今后版本还有reset.sh,reset_proxy.sh和download_docker_image.sh 工具
./startup.sh (早期版本)
可通过 ./startup.sh -h 查看帮助
各命令主要功能:
-c 安装盒子相关的服务
-m 删除k8s并重新安装,随后安装中间件服务,位于 middlewares 命名空间下,是唯一需要sudo权限运行的命令 相当于 sudo up destory && sudo up create -f all_in_one.yaml
-r 删除指定命名空间,但不会删除pvc(持久化存储)
-d 删除指定名称的服务,一般是删除ctbox命名空间下的服务
-i 安装指定名称的服务,一般是在ctbox命名空间下的服务
-l 列出所有可以安装/卸载的服务,与~/ctbox-deploy/charts/中目录结构相同
./startup.sh (今后版本)
可通过 ./startup.sh -h 查看帮助
各命令主要功能:
-a 先后安装k8s,middlewares和ctbox
-m 删除原先安装的模块(k8s,middlewares或ctbox),随后再安装相应的模块
-c 删除所有的模块(k8s,middlewares和ctbox),同时会删除pvc(持久化存储)
-r 删除指定命名空间,但不会删除pvc(持久化存储)
-d 删除指定名称的服务,一般是删除ctbox命名空间下的服务
-i 安装指定名称的服务,一般是在ctbox命名空间下的服务
-l 列出所有可以安装/卸载的服务,与~/ctbox-deploy/charts/中目录结构相同
-s 相当于kubectl get pods -n <default_namespace> 监控指定地命名空间的所有服务状态
repository_list.sh
快速获取 ”布局重点人员库“ 和 ”本地重点人员库“ 的信息,用于后续更换 repo-alarm 配置,这也可以通过前端页面访问 ”数据源管理“ 页面,在控制台中查看发送的repo请求获取
trigger_init_global_repo.sh
用于触发feature-control服务从一所同步 ”布局重点人员库信息“,使用时需要修改文件
reset.sh
删掉所有k8s数据,从PaaS层开始安装,安装后续所有的服务
reset_proxy.sh
kill 掉本机占用27018端口的应用,随后将mongo服务的27017端口暴露至物理机,之后可在物理机上直接连接mongo服务,通过修改其中的参数也可以实现其他服务端口的暴露
download_docker_image.sh
在内网执行此命令可以下载所有ctbox所需的镜像包并分别打包,用于非内网部署的安装包下载
- 常用命令
查看位于ctbox命名空间下的各服务运行状态 kubectl get pods -n ctbox
查看位于middlewares命名空间下各服务运行状态 kubectl get pods -n middlewares
查看位于ctbox命名空间下各服务端口暴露情况(即绑定的物理机端口) kubectl get svc -n ctbox
进入位于ctbox命名空间下某容器内查看文件/调试 1. kubectl get pods -n ctbox 并复制下服务的名称 2. kubectl exec -it -n ctbox bash
查看位于ctbox命名空间下某服务的日志 1. kubectl get pods -n ctbox 并复制下服务的名称 2. kubectl logs -f -n ctbox ,
如果仅查看最近1000条日志 kubectl logs --tail=1000 -n ctbox ,
如果查看最近1h日志 kubectl logs --since=1h
导出日志 kubectl logs -n ctbox > .log
- 常见问题排查
(1) 服务器更换ip之后,k8s集群启动失败:
可通过命令kubectl get pods -n ctbox 查看,如果返回类似 “The connection to the server :6443 was refused - did you specify the right host or port?” 的提示,可以断定k8s没有正常启动
此时请按照 PaaS0.6.2实施运维手册-6.3单机k8sip变化 操作
(2) 服务器更换了ssh登陆的端口:
-
在ctbox-deploy 目录下执行 sudo ./startup.sh -c
-
sudo ./startup.sh -a
-
检查软链接 0.4版本系统内网部署操作文档#0.4版本系统内网部署操作文档-2.3镜像软链接
-
修改mysql配置信息 0.4版本系统内网部署操作文档#0.4版本系统内网部署操作文档-4.4.7修改mysql配置信息
注意: 如在此之前已有一定的运行数据,此操作会删除所以历史数据,请慎重
(3) 服务器重启之后,license-server 没有启动:
license-server默认是开机自启的,如何检验license-server是否启动? 可以通过以下2种方式任意之一检查:
-
netstat -an | grep 7412 查看是否有应用占用7412
-
前端页面访问 http://{$ip}:7412 查看是否有充值页面出现
如果license-server没有启动,请依次尝试下列方法,尝试之后请检查服务状态
-
查看绑定的硬件狗是否在机器上,且该机器没有重装系统或license-server
-
systemctl start license_service_ficus
-
cd opt/yitu_license_server_runtime/license_server
sudo ./start.sh
cat nohup.out -
[License Server] 系统服务安装启动方法
(4) 运行一段时间后所有服务cramped,通过 kubectl get pods -n ctbox 命令查看服务状态,有很多处于 “Evicted” 的状态:
检查安装步骤中 0.4版本系统内网部署操作文档#0.4版本系统内网部署操作文档-2.3镜像软链接 是否正常完成, 查看 /var/lib/docker 和 /opt/local-path-provisioner 是否已经软链接出去(分别进入 /var/lib 和 /opt 文件夹下运行 ll )
软链接指向的地址应该是空间较大的数据盘(标准数据盘大小约15T),如果其中有任意一个没有软链接,均有可能出现该问题,再通过df -lh 查看系统盘空间使用程度,如果系统盘使用量接近90%或更好,则可断定 系数据占满了系统盘,没有额外空间分配导致。此时应进行数据的迁移。
-
sudo systemctl stop kubelet.service && sudo systemctl status kubelet.service 停止k8s服务,并复核服务状态是否已经关闭
-
sudo systemctl stop docker && sudo systemctl status docker 停止docker服务,并复核服务状态是否已经关闭
-
进入 /var/lib/docker (如果是docker未软链接) 或 /opt/local-path-provisioner (如果是k8s未软链接), 运行 ll 查看目录结构,权限和用户组,截图保存。如下图:
进入 /var/lib/docker,运行 ll 查看目录结构,权限和用户组,截图保存
docker目录结构,权限和用户组
进入 /opt/local-path-provisioner, 运行 ll 查看目录结构,权限和用户组,截图保存
sudo mv /var/lib/docker /data/ctbox/docker_data 移动文件夹至数据盘(如果数据盘挂载在/data/ctbox路径下时) sudo mv /opt/local-path-provisioner /data/ctbox/local-path-provisione 移动文件夹至数据盘(如果数据盘挂载在/data/ctbox路径下时)
上述命令也可以使用 sudo cp -p -r <source_folder> <tartget_folder> 复制文件夹到数据盘,该操作运行之后需要删除原文件夹
-
进入移动后的目录运行 ll 查看目录结构,权限和用户组,确保没有变化
-
创建软链接
创建软链
sudo ln -s /data/ctbox/docker_data /var/lib/docker
查看软链接是否正常 (1) 查看软链接路径是否正常 (2) 查看是否能正常进入软链的目录
cd /var/lib && ll
cd docker
创建软链
sudo ln -s /data/ctbox/local-path-provisioner /opt/local-path-provisioner
查看软链接是否正常 (1) 查看软链接路径是否正常 (2) 查看是否能正常进入软链的目录
cd /opt && ll
cd local-path-provisioner
-
sudo systemctl start kubelet.service && sudo systemctl status kubelet.service 启动k8s服务,并复核服务状态是否已经开启
-
sudo systemctl start docker && sudo systemctl status docker 启动docker服务,并复核服务状态是否已经开启
-
kubectl get pods --all-namespaces=true 查看所有服务状态
-
kubectl get pods --all-namespaces=true | grep Evicted | awk ‘{print $2}’ | xargs kubectl delete pod 删除所有处于 “Evicted” 状态的pod
-
使用startup.sh 重启盒子服务
(5) 服务正常启动,页面访问数据源管理没有显示任何库:
这可能是因为ctbox-server并没有成功连接上license-server,首先查看ctbox-server的日志是否有相关的license记录, 如有请查看 ctbox-deploy/ctbox/ctbox-server/values.yaml中关于license的配置是否正确,ip 是否配置为真实的ip而非127.0.01或0.0.0.0
随后请验证license-server是否正常启动, 之后请重启ctbox-server服务
(6) 图片流正常,但盒子一直没有抓拍:
-
请查看盒子 “数据源管理 -> 设备管理”页面,设备配置正确且处于开启状态
-
请查看抓拍机管理程序的相关配置, 进入box-adaptor-manager-deploy文件夹,打开 config/var.yml 文件,默认配置应是:
ct_host: 10.10.24.12 # 本机 IP
ct_port: 32080 # 本机盒子服务对外暴露端口
ct_username: admin # 盒子管理员登陆的账户
ct_password: [email protected] # 盒子管理员登陆的密码
如需修改抓拍机管理平台的设置,需要执行以下步骤:
停止程序 ./scripts/stop.sh
做相关更新
部署更新 ./scripts/install.sh
启动程序 ./scripts/start.sh
3)是否设备数量已经超过了license配置的限制,可通过 http://$IP:7412/api/v1/recharge_status?key=anfang_box 查看license相关的信息
- Q/A
注意: 以下所有操作均为非常规操作,有类似的要求还请首先提出jira,或提给产品经理,这样才会将运维相关的功能逐渐添加进来
(1) Q: 测试用推的视频流/图片流产生的抓拍和报警可以删除吗?
A: 报警可以删除但路人抓拍不可以,报警和路人抓拍都没有提供删除的接口。
报警可以进入mongo库中删除:
- 在Chrome前端设定好能筛选出当前报警的条件之后,F12打开控制台切换到Network页面,随后点击搜索,查看控制台中返回结果中的id并复制下来
- kubectl exec -it -n middlewares mongo-mongodb-replicaset-0 bash 进入mongo容器
- mongo 进入mongo shell
- use ctbox 切换数据库到ctbox
- db.alarm_general.find(ObjectId("<报警的id>")) 检索报警,确认报警是想要删除的报警
- db.alarm_general.remove(ObjectId("<报警的id>")) 删除报警
路人库会定时清除较旧的路人抓拍(默认100天),且目前提供的接口只能查询当日的路人抓拍
(2) Q: 本地库入库后发现有部分没有人员信息的图片,怎么批量筛选重导?
A: 对于少量数据,建议将库中图片缩略图下载,随后使用 Duplicate Cleaner Pro 软件中图片比对的功能找出导入失败的图片
对于数据量较多的数据,可以用以下操作获取 “本地重点人员库” 中所有有身份证号的记录:
- kubectl exec -it -n middlewares mongo-mongodb-replicaset-0 bash 进入mongo容器
- mongo 进入mongo shell
- use cvpf_repository_manager 切换数据库到cvpf_repository_manager
- db.repository.find() 然后记下 “本地重点人员库” 的id
- CTRL + C 退出mongo shell
- mongoexport --db cvpf_repository_manager --collection Subject_repo_<刚刚记下的库id> --query ‘{“attrs.residentID”:{$ne:null}}’ --fields ‘attrs.residentID’ --type=csv --out /work-dir/result.csv
- more /work-dir/result.csv 查看导出的结果,Space 可向后翻页, CTRL + B 可向前翻页
- 将文件中的内容复制出来并保存