如何扩展代码块依赖库
单机模式
依赖库持久化
以下操作需要在服务运行中状 态下进行,仅需首次完成一次即可,后续安装扩展库时无需操作
-
创建依赖库挂载目录(实际目录可自定义),如:
mkdir -p /data/hap/script/volume/command/package/python-3.6/
mkdir -p /data/hap/script/volume/command/package/nodejs-10.18.0/ -
获取预置依赖库
docker cp $(docker ps | grep command | awk '{print $1}'):/usr/local/lib/python3.6/site-packages/ /data/hap/script/volume/command/package/python-3.6/
docker cp $(docker ps | grep command | awk '{print $1}'):/usr/local/node-10.18.0/lib/node_modules/ /data/hap/script/volume/command/package/nodejs-10.18.0/ -
修改
docker-compose.yaml,将宿主机的依赖库目录挂载到容器内services:
command:
volumes:
- ./volume/command/package/python-3.6/site-packages/:/usr/local/lib/python3.6/site-packages/
- ./volume/command/package/nodejs-10.18.0/node_modules/:/usr/local/node-10.18.0/lib/node_modules/ -
管理器根目录下执行以下命令,重启服务
bash ./service.sh restartall
在线安装扩展库
- 必须先完成“依赖库持久化”步骤,将容器内的依赖库目录持久化挂载到宿主机上,否则容器重启后扩展库需要重新安装
- 在线安装扩展库需确保服务器可以访问互联网
Python
以安装 python-dateutil 扩展库为例:
-
进入 command 容器
docker exec -it $(docker ps | grep command | awk '{print $1}') bash -
在 command 容器中安 装
python-dateutil扩展库pip3 install --target=/usr/local/lib/python3.6/site-packages/ python-dateutil
安装完成后可在宿主机默认路径 /data/hap/script/volume/command/package/python-3.6/site-packages/ 下查看新安装的扩展库。
JavaScript (基于 Nodejs)
以安装 dayjs 扩展库为例:
-
进入 command 容器
docker exec -it $(docker ps | grep command | awk '{print $1}') bash -
在容器中安装
dayjs扩展库/usr/local/node-10.18.0/bin/npm -g install dayjs
安装完成后可在宿主机默认路径 /data/hap/script/volume/command/package/nodejs-10.18.0/node_modules/ 下查看新安装的扩展库。
离线安装扩展库
- 必须先完成“依赖库持久化”步骤,将容器内的依赖库目录持久化挂载到宿主机上,否则容器重启后扩展库需要重新安装
- 在服务器无法访问互联网 或 提供的扩展库是离线包文件时可以参考离线安装扩展库的方法
Python
以安装 pycryptodome 扩展库为例:
-
在可访问互联网的环境下,获取扩展库的离线文件
pip3 download pycryptodome -d "/package"- 在 /package 目录下会生成 pycryptodome 依赖库的离线文件
-
将离线库文件上传到 HAP 服务所在的服务器
-
将离线库文件拷贝到容器内并安装
-
将 pycryptodome 依赖库的离线文件拷贝到 command 容器内 /tmp 路径下
docker cp pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl $(docker ps | grep command | awk '{print $1}'):/tmp -
进入 command 容器
docker exec -it $(docker ps | grep command | awk '{print $1}') bash -
在容器中安装 pycryptodome 扩展库离线包
pip3 install --target=/usr/local/lib/python3.6/site-packages/ /tmp/pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl
-
JavaScript (基于 Nodejs)
以安装 dayjs 扩展库为例:
-
在可访问互联网的环境下,获取扩展库的离线文件
npm install dayjs -save- 在当前目录下会生成
node_modules/dayjs依赖库的目录
- 在当前目录下会生成
-
打包 dayjs 扩展库目录
cd node_modules
tar czf dayjs.tar.gz dayjs -
将扩展库的打包文件
dayjs.tar.gz上传到 HAP 服务所在的服务器 -
将离线库文件解压到容器依赖库已持久化的路径下
tar xf dayjs.tar.gz -C /data/hap/script/volume/command/package/nodejs-10.18.0/node_modules- 如有修改过 HAP 默认数据路径,解压路径则以实际环境路径为准
集群模式
依赖库持久化
-
在第一台微服务服务器上创建依赖库挂载目录
mkdir -p /data/hap/script/volume/command/package/python-3.6/site-packages
mkdir -p /data/hap/script/volume/command/package/nodejs-10.18.0/node_modules -
获取
Python预置依赖库到本地目录kubectl cp $(kubectl get pod|grep command-|awk 'NR==1{print $1}'):/usr/local/lib/python3.6/site-packages /data/hap/script/volume/command/package/python-3.6/site-packages -
获取
JavaScript预置依赖库到本地目录kubectl cp $(kubectl get pod|grep command-|awk 'NR==1{print $1}'):/usr/local/node-10.18.0/lib/node_modules /data/hap/script/volume/command/package/nodejs-10.18.0/node_modules -
将当前服务器的
/data/hap/script/volume/command/目录进行归档打包,并同步分发至集群中所有其他微服务节点。 -
在各微服务节点上解压归档文件,务必核实并确保每个节点均已建立以下路径,且其内部文件内容保持完全一致。
/data/hap/script/volume/command/package/python-3.6/site-packages
/data/hap/script/volume/command/package/nodejs-10.18.0/node_modules
配置依赖库挂载
-
编辑微服务的
service.yaml配置文件(该文件通常存放于首个微服务节点的/data/hap/script/kubernetes/路径下)。在
deployment为command服务中添加挂载配置volumeMounts:
- mountPath: /usr/local/lib/python3.6/site-packages
name: python-volume
- mountPath: /usr/local/node-10.18.0/lib/node_modules
name: node-volume
volumes:
- name: python-volume
hostPath:
path: /data/hap/script/volume/command/package/python-3.6/site-packages
type: Directory
- name: node-volume
hostPath:
path: /data/hap/script/volume/command/package/nodejs-10.18.0/node_modules
type: Directory- 修改
command服务的实例数量- 将
replicas值修改为与当前微服务节点相同或大于的数量。 - 例如当前 3 个微服务节点,就将这个副本数改成 3 或者大于 3
- 将
- 修改
-
更新配置文件生效挂载
kubectl apply -f service.yaml -
检查
command服务状态kubectl get pod | grep command- 更新后
command服务会滚动重启,等待1-2分钟等所有command重启完成后状态为2/2就正常
- 更新后
在线安装扩展库
- 必须先完成“依赖库持久化”步骤,将容器内的依赖库目录持久化挂载到宿主机上,否则容器重启后扩展库需要重新安装
- 在线安装扩展库需确保服务器可以访问互联网
Python
在集群环境下,由于 command 服务采用多实例(Pod)部署,必须确保扩展库在每一个 Pod 实例中均已正确安装。以下示例脚本默认在 default 命名空间下运行,通过遍历所有相关的 Pod 批量执行安装指令:
以安装
python-dateutil扩展库为例
for pod in $(kubectl get pods -l app=command -n default -o jsonpath='{.items[*].metadata.name}'); do
echo "Processing Pod: $pod"
kubectl exec -it $pod -n default -- pip3 install -i https://mirrors.aliyun.com/pypi/simple/ --target=/usr/local/lib/python3.6/site-packages/ python-dateutil
done
JavaScript (基于 Nodejs)
在集群环境下,由于 command 服务采用多实例(Pod)部署,必须确保扩展库在每一个 Pod 实例中均已正确安装。以下示例脚本默认在 default 命名空间下运行,通过遍历所有相关的 Pod 批量执行安装指令:
以安装
dayjs扩展库为例
for pod in $(kubectl get pods -l app=command -n default -o jsonpath='{.items[*].metadata.name}'); do
echo "Processing Pod: $pod"
kubectl exec -it $pod -n default -- /usr/local/node-10.18.0/bin/npm -g install dayjs --registry=https://registry.npmmirror.com
done
离线安装扩展库
- 必须先完成“依赖库持久化”步骤,将容器内的依赖库目录持久化挂载到宿主机上,否则容器重启后扩展库需要重新安装
- 在服务器无法访问互联网 或 提供的扩展库是离线包文件时可以参考离线安装扩展库的方法
Python
以安装
pycryptodome扩展库为例
-
在可访问互联网的环境下,获取扩展库的离线文件
pip3 download pycryptodome -d "/package" -i https://mirrors.aliyun.com/pypi/simple/- 在 /package 目录下会生成 pycryptodome 依赖库的离线文件
-
将下载好的离线库文件(如
pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl)上传至首个微服务节点的临时目录。 -
在首个微服务节点执行以下脚本。
由于集群环境下
command服务采用多实例(Pod)部署,必须确保离线库在各实例中同步分发。以下示例脚本默认在default命名空间下运行,通过遍历相关 Pod 批量执行离线分发与安装指令:# 请根据实际获取的离线文件名修改 FILE_NAME 变量值
FILE_NAME="pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl"
for pod in $(kubectl get pods -l app=command -n default -o jsonpath='{.items[*].metadata.name}'); do
echo "Processing Pod: $pod"
kubectl cp ./$FILE_NAME $pod:/tmp/ -n default
kubectl exec -it $pod -n default -- pip3 install --target=/usr/local/lib/python3.6/site-packages/ /tmp/$FILE_NAME
done
JavaScript (基于 Nodejs)
以安装
dayjs扩展库为例
-
在可访问互联网的环境下,获取扩展库的离线文件
npm install dayjs -save --registry=https://registry.npmmirror.com- 在当前目录下会生成
node_modules/dayjs依赖库的目录
- 在当前目录下会生成
-
打包 dayjs 扩展库目录
cd node_modules
tar czf dayjs.tar.gz dayjs -
将扩展库的打包文件
dayjs.tar.gz上传到首个微服务节点的临时目录。 -
在首个微服务节点执行以下脚本。
由于集群环境下
command服务采用多实例(Pod)部署,必须确保扩展库在各实例中均同步分发。以下示例脚本默认在default命名空间下运行,通过遍历相关 Pod 批量执行拷贝与解压指令:# 请根据实际获取的离线文件名修改 NODE_FILE 变量值
NODE_FILE="dayjs.tar.gz"
for pod in $(kubectl get pods -l app=command -n default -o jsonpath='{.items[*].metadata.name}'); do
echo "Processing Pod: $pod"
kubectl cp ./$NODE_FILE $pod:/tmp/ -n default
kubectl exec -it $pod -n default -- tar xf /tmp/$NODE_FILE -C /usr/local/node-10.18.0/lib/node_modules
done