メインコンテンツへ移動

コードブロック依存関係の拡張方法

スタンドアロンモード​

依存ライブラリの永続化​

以下の操作はサービス稼働中に1度だけ実施する必要があります。追加の拡張ライブラリをインストールする際は、これらの手順を繰り返す必要はありません。

  1. 依存ライブラリ用のマウントディレクトリを作成します(実際のディレクトリパスは任意で変更可能です)。例:
mkdir -p /data/hap/script/volume/command/package/python-3.6/
mkdir -p /data/hap/script/volume/command/package/nodejs-10.18.0/
  1. 事前インストール済の依存ライブラリを取得します
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/
  1. 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/
  1. マネージャのルートディレクトリで次のコマンドを実行し、サービスを再起動します
bash ./service.sh restartall

拡張ライブラリのオンラインインストール​

注意
  • 必ず先に「依存ライブラリの永続化」手順を完了してください。 拡張ライブラリのディレクトリがコンテナからホストにマウントされていない場合、コンテナ再起動時に拡張ライブラリも再インストールとなります。
  • 拡張ライブラリのオンラインインストールには、サーバーがインターネットにアクセスできることが必要です。

Python​

python-dateutil拡張ライブラリのインストール例:

  1. コマンドコンテナへ入ります
docker exec -it $(docker ps | grep command | awk '{print $1}') bash
  1. コマンドコンテナ内で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拡張ライブラリのインストール例:

  1. コマンドコンテナへ入ります
docker exec -it $(docker ps | grep command | awk '{print $1}') bash
  1. コマンドコンテナ内で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拡張ライブラリのインストール例:

  1. ネットワーク接続が可能な場合、拡張ライブラリのオフラインファイルを取得します
pip3 download pycryptodome -d "/package"
  • /packageディレクトリにpycryptodome依存ライブラリのオフラインファイルが生成されます。
  1. オフラインファイルをHAPサービス稼働中のサーバーにアップロードします。

  2. オフラインファイルをコンテナにコピーし、インストールします

  3. pycryptodome依存ライブラリのオフラインファイルを、コマンドコンテナ内 /tmp パスにコピーします

docker cp pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl $(docker ps | grep command | awk '{print $1}'):/tmp
  1. コマンドコンテナへ入ります
docker exec -it $(docker ps | grep command | awk '{print $1}') bash
  1. コマンドコンテナ内で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 が生成されます。
  1. dayjs拡張ライブラリディレクトリを圧縮します
cd node_modules
tar czf dayjs.tar.gz dayjs
  1. 拡張ライブラリの圧縮ファイル dayjs.tar.gz をHAPサービス稼働サーバーにアップロードします。

  2. オフラインファイルを永続化用の依存ライブラリパスへ解凍します

tar xf dayjs.tar.gz -C /data/hap/script/volume/command/package/nodejs-10.18.0/node_modules
  • HAPのデフォルトデータパスが変更されている場合は、解凍先も実環境に合わせて指定してください。

クラスタモード​

依存ライブラリの永続化​

  1. 最初のマイクロサービスサーバーに依存ライブラリのマウントディレクトリを作成します。

    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
  2. 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
  3. 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
  4. 現在のサーバーの /data/hap/script/volume/command/ をアーカイブし、クラスタ内の他のすべてのマイクロサービスノードに配布します。

  5. 各マイクロサービスノードでアーカイブを展開し、以下のパスがすべてのノードに存在し、その内容が完全に一致することを確認します。

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

依存ライブラリのマウント設定​

  1. マイクロサービスの 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
    1. command サービスのインスタンス数を変更します。
      • replicas を現在のマイクロサービスノード数以上に設定します。
      • 例えばノードが3台の場合、レプリカ数を3以上にします。
  2. 設定を適用してマウントを有効にします。

    kubectl apply -f service.yaml
  3. command サービスの状態を確認します。

    kubectl get pod | grep command
    • 更新後、command サービスはローリング再起動します。1~2分待ち、すべての再起動が完了して状態が 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