跳到主要内容

如何扩展代码块依赖库

单机模式

依赖库持久化

以下操作需要在服务运行中状态下进行,仅需首次完成一次即可,后续安装扩展库时无需操作

  1. 创建依赖库挂载目录(实际目录可自定义),如:

    mkdir -p /data/mingdao/script/volume/command/package/python-3.6/
    mkdir -p /data/mingdao/script/volume/command/package/nodejs-10.18.0/
  2. 获取预置依赖库

    docker cp $(docker ps | grep command | awk '{print $1}'):/usr/local/lib/python3.6/site-packages/ /data/mingdao/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/mingdao/script/volume/command/package/nodejs-10.18.0/
  3. 修改 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/
  4. 管理器根目录下执行以下命令,重启服务

    bash ./service.sh restartall

在线安装扩展库

提醒
  • 必须先完成“依赖库持久化”步骤,将容器内的依赖库目录持久化挂载到宿主机上,否则容器重启后扩展库需要重新安装
  • 在线安装扩展库需确保服务器可以访问互联网

Python

以安装 python-dateutil 扩展库为例:

  1. 进入 command 容器

    docker exec -it $(docker ps | grep command | awk '{print $1}') bash 
  2. 在 command 容器中安装 python-dateutil 扩展库

    pip3 install --target=/usr/local/lib/python3.6/site-packages/ python-dateutil

安装完成后可在宿主机默认路径 /data/mingdao/script/volume/command/package/python-3.6/site-packages/ 下查看新安装的扩展库。

JavaScript (基于 Nodejs)

以安装 dayjs 扩展库为例:

  1. 进入 command 容器

    docker exec -it $(docker ps | grep command | awk '{print $1}') bash 
  2. 在容器中安装 dayjs 扩展库

    /usr/local/node-10.18.0/bin/npm -g install dayjs

安装完成后可在宿主机默认路径 /data/mingdao/script/volume/command/package/nodejs-10.18.0/node_modules/ 下查看新安装的扩展库。

离线安装扩展库

提醒
  • 必须先完成“依赖库持久化”步骤,将容器内的依赖库目录持久化挂载到宿主机上,否则容器重启后扩展库需要重新安装
  • 在服务器无法访问互联网 或 提供的扩展库是离线包文件时可以参考离线安装扩展库的方法

Python

以安装 pycryptodome 扩展库为例:

  1. 在可访问互联网的环境下,获取扩展库的离线文件

    pip3 download pycryptodome -d "/package"
    • 在 /package 目录下会生成 pycryptodome 依赖库的离线文件
  2. 将离线库文件上传到 HAP 服务所在的服务器

  3. 将离线库文件拷贝到容器内并安装

    1. 将 pycryptodome 依赖库的离线文件拷贝到 command 容器内 /tmp 路径下

      docker cp pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl $(docker ps | grep command | awk '{print $1}'):/tmp
    2. 进入 command 容器

      docker exec -it $(docker ps | grep command | awk '{print $1}') bash 
    3. 在容器中安装 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 扩展库为例:

  1. 在可访问互联网的环境下,获取扩展库的离线文件

    npm install dayjs -save
    • 在当前目录下会生成 node_modules/dayjs 依赖库的目录
  2. 打包 dayjs 扩展库目录

    cd node_modules
    tar czf dayjs.tar.gz dayjs
  3. 将扩展库的打包文件 dayjs.tar.gz 上传到 HAP 服务所在的服务器

  4. 将离线库文件解压到容器依赖库已持久化的路径下

    tar xf dayjs.tar.gz -C /data/mingdao/script/volume/command/package/nodejs-10.18.0/node_modules
    • 如有修改过 HAP 默认数据路径,解压路径则以实际环境路径为准

集群模式

依赖库持久化

  1. 在第一台微服务服务器上创建依赖库挂载目录

    mkdir -p /data/mingdao/script/volume/command/package/python-3.6/site-packages
    mkdir -p /data/mingdao/script/volume/command/package/nodejs-10.18.0/node_modules
  2. 获取 Python 预置依赖库到本地目录

    kubectl cp $(kubectl get pod|grep command-|awk 'NR==1{print $1}'):/usr/local/lib/python3.6/site-packages /data/mingdao/script/volume/command/package/python-3.6/site-packages
  3. 获取 JavaScript 预置依赖库到本地目录

    kubectl cp $(kubectl get pod|grep command-|awk 'NR==1{print $1}'):/usr/local/node-10.18.0/lib/node_modules /data/mingdao/script/volume/command/package/nodejs-10.18.0/node_modules
  4. 将当前服务器的 /data/mingdao/script/volume/command/ 目录进行归档打包,并同步分发至集群中所有其他微服务节点。

  5. 在各微服务节点上解压归档文件,务必核实并确保每个节点均已建立以下路径,且其内部文件内容保持完全一致。

    /data/mingdao/script/volume/command/package/python-3.6/site-packages
    /data/mingdao/script/volume/command/package/nodejs-10.18.0/node_modules

配置依赖库挂载

  1. 编辑微服务的 service.yaml 配置文件(该文件通常存放于首个微服务节点的 /data/mingdao/script/kubernetes/ 路径下)。

    deploymentcommand 服务中添加挂载配置

            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/mingdao/script/volume/command/package/python-3.6/site-packages
    type: Directory
    - name: node-volume
    hostPath:
    path: /data/mingdao/script/volume/command/package/nodejs-10.18.0/node_modules
    type: Directory
    1. 修改 command 服务的实例数量
      • replicas 值修改为与当前微服务节点相同或大于的数量。
      • 例如当前 3 个微服务节点,就将这个副本数改成 3 或者大于 3
  2. 更新配置文件生效挂载

    kubectl apply -f service.yaml
  3. 检查 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 扩展库为例

  1. 在可访问互联网的环境下,获取扩展库的离线文件

    pip3 download pycryptodome -d "/package" -i https://mirrors.aliyun.com/pypi/simple/ 
    • 在 /package 目录下会生成 pycryptodome 依赖库的离线文件
  2. 将下载好的离线库文件(如 pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl)上传至首个微服务节点的临时目录。

  3. 在首个微服务节点执行以下脚本。

    由于集群环境下 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 扩展库为例

  1. 在可访问互联网的环境下,获取扩展库的离线文件

    npm install dayjs -save  --registry=https://registry.npmmirror.com
    • 在当前目录下会生成 node_modules/dayjs 依赖库的目录
  2. 打包 dayjs 扩展库目录

    cd node_modules
    tar czf dayjs.tar.gz dayjs
  3. 将扩展库的打包文件 dayjs.tar.gz 上传到首个微服务节点的临时目录。

  4. 在首个微服务节点执行以下脚本。

    由于集群环境下 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