ドッキングされたNode.JSアプリケーションをPID 1として実行しないことをお勧めします( https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#handling-kernelを参照)。 -signals )シグナルを正しくキャプチャするため。
docker run
コマンドは、--init
フラグを提供して、信号を正しく転送する小さなinitシステムでアプリケーションのエントリポイントをラップします。
Kubernetesに--init
フラグに相当する組み込みのものはありますか?
Kubernetes 1.10のポッドおよびコンテナオブジェクトの仕様を調べましたが、イメージの開始方法の指定に関連するものは何も見ていません。
別の方法としては、すべてのコンテナーで Tini を明示的に含めて使用することですが、--init
フラグの動作と同じように透過的に行う方法が本当に必要です。
他の選択肢はありますか?
ポッドのプロセス(PID)名前空間共有を有効にすると、initプロセス(pause
)はKubernetesから取得されます。コンテナーに個別のプロセス名前空間がある場合、それらにはtini
または別のinitプロセス自体を含める必要があります。
https://www.ianlewis.org/en/almighty-pause-container によると、Kubernetes 1.7にはデフォルトで共有プロセスの名前空間があり、それを無効にするkubeletフラグがあり、1.8にはデフォルトでオフになっていますそれを有効にするためのkubeletフラグ。 Kubernetes 1.11には、共有プロセスの名前空間を有効にするアルファ機能があります: https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/
KubernetesがDockerコマンドを使用してコンテナを作成すると想定する場合は、--init
キーについて何も認識していないことに注意してください。つまり、Kubernetesには、別の初期プロセスでコンテナを開始するためのラッパーがありません。
したがって、Kubernetesでこの機能を使用する場合は、 Tini を含むDockerイメージを準備する必要があります。
実際、TiniはDocker 1.13以降に含まれており、--init
フラグをdocker run
に渡して有効にするだけです。したがって、Tiniをイメージに追加するには、Dockerfile
で次のコードを使用します。
# Add Tini
ENV TINI_VERSION <check-version-on-github>
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]