web-dev-qa-db-ja.com

「docker run --init」に相当するKubernetes

ドッキングされた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フラグの動作と同じように透過的に行う方法が本当に必要です。

他の選択肢はありますか?

16
marcind

ポッドのプロセス(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/

5
Roland Weber

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"]
3
Artem Golenyaev