Kubernetes Podは自動的に再起動し続ける--Exit Code=0


文書ディレクトリ
  • 問題
  • 2ソリューション
  • 1問題
    最近kubernetesをやっていて、コンテナを作って、k 8 sを使ってDepolymentで配置していますが、コンテナの状態がRnning->Complete->CrashLoopBackOffの3つの状態間で変換されているのが見えます.理由を確認するために、次のコマンドを使用しました.
    #  pod  
    kubectl get pods -o wide -n <namespace-name>
    #  pod log
    kubectl logs <pod-name>
    #  pod    
    kubectl describe <pod-name>
    

    上記のコマンドにより、Podが正常に終了した(すなわちExit code=0)、つまりPodが正常に起動したことに気づき、運転が終了しました.k 8 sにおけるPodのデフォルトrestartPolicyはAlwaysであるため、つまりPodは再起動を継続する.最後に、いくつかのスクリプトを実行することによって、Podが自動的に再起動し続ける原因はPid=1のプロセスがないこと、あるいはPodの起動時に実行されるスクリプトが1番のプロセスであることが分かったが、スクリプトの実行が完了すると1番のプロセスがないので、Podは実行が終了したことに相当する.次のリンクを表示できます.https://segmentfault.com/a/1190000009583997.
    2ソリューション
    私が作ったコンテナは起動時にデフォルトでshellスクリプトが実行されます.さっきもこのスクリプトがコンテナの1番プロセスだと言いましたが、上記のリンクで説明した方法と同じように、スクリプトに次のような内容を追加しました.
    echo "PID of this script: $$"
    echo "PPID of this script: $PPID"
    echo "UID of this script: $UID"
    

    リンクに記載されているように発見されました.つまり、この1番プロセス(注:1番プロセスはすべてのプロセスの祖先であり、存在しなければならない)を維持し、死なせないようにする必要があります.これにより、コンテナはrunning状態になります.では、この1番のプロセスをどのように維持しますか?実は方法も比較的に簡単で、以下は簡単に2つの方法を提供します:
  • メソッド1:shellスクリプトの最後に次の
  • を追加します.
    tail -f /var/log/*
    
  • メソッド2:shellスクリプトにデッドサイクル
  • を追加
    while true; do
        sleep 100;
    done
    

    関連リファレンス:
  • docker nginxを実行するにはdaemon off
  • を使用する理由
  • Kubernetesコンテナ設定起動時に実行するコマンドおよびそのパラメータ
  • Googleガイド:コンテナを構築するためのベストプラクティス
  • Kubernetesトラブルシューティングガイド-分析コンテナ終了ステータスコード
  • Kubernetes Pod異常エラー