当該コンテンツは、ローカリゼーションサービスを準備しております。早急にローカライズサービスをご提供できるよう、努めております。
ノードメンテナンスガイド
始める前に
クバネティスは、ワーカーノードの障害が発生しても正常に、または部分的に機能を遂行できるよう欠陥耐え(fault tolerant)システムでデザインされています。 クバネティスのマスターノードは、仮想マシンのようなインフラの状態を周期的にワーカーノードから受信し、何らかの理由で問題が発生した場合には、これを復旧するように動作します。 しかし、すべての場合の問題の解決には限界があり、ノードのメンテナンスのために開発者が特定のワーカーノード上で運営中だったパド(pod)の優雅な終了(gracefully shutting down)のための介入が必要になる場合があります。
この文書では、クバネティスクラスタの Ready
状態のノード数を、サーバ返却やメンテナンスのための中断などで意図的に縮小させようとするとき、縮小対象ノードで駆動中のアプリケーションを他のノードに排出(drain)させる過程を扱います。
クバネティスに対する誤解
クーバネティスに対するよくある誤解 十分なリソースがあれば、クバネティスは問題のあるノードのすべてのパーツを他のノードに再スケジューリングするため、ワーカーノードに発生しうる問題について心配する必要はありません。 また、必要に応じてCluster Autoscalerが新しいワーカーノードを追加するので、アプリケーションやクラスタに対する運用は問題なく継続できる。
上記は、クーバネティス運営についてよく誤解されています。 クバネティスマスターノードのkube-controller-manager
は、特定のワーカーノードのコンディションに問題を感知しても、パドの締め出し(eviction)条件が満たされた場合に再スケジューリングを行います。
動作中のワーカーノードを強制的に再起動させる場合は、前述した条件が満たされない場合、一定時間、そのワーカーノードにスケジュールされたパドの停止(downtime)を誘発します。 特定のワーカーノードの再起動前のkubectl drain
のコマンドにより、駆動中だったパドを他のワーカーノードに追い出す優雅な終了(gracefully shutting down pods)過程を通じて、安定的にサービスを運営することができます。
ワーカーノードの状態確認
クバネティスのマスターノードは、周期的にインフラの状態を周期的にワーカーノードから受信します。 ノードの状態と詳細情報は、次のコマンドで確認できます。詳細は [公式文書]を参考にしてください。
$ kubectl --kubeconfig $KUBE_CONFIG describe node $NODENAME
ノードのコンディションはJSONオブジェクトに返されます。 次は、正常な状態のノードのコンディションを示す応答例題です。
"conditions": [
{
"type": "Ready",
"status": "True",
"reason": "KubeletReady",
"message": "kubelet is posting ready status",
"lastHeartbeatTime": "2019-06-05T18:38:35Z",
"lastTransitionTime": "2019-06-05T11:41:27Z"
}
]
ノードのコンディションのうち、 Ready
タイプの状態がマスターノードの kube-controller-manager
に引数が送られる pod-eviction-timeout
よりも長Unknown
または False
に維持される場合、ノード上のすべてのパドはノードコントローラによって削除されるようにスケジュールされます。
ネイバークラウドプラットフォームのクバネティスサービスでは、 pod-eviction-timeout
を5分設定値として使用します。
kubectl drain
命令を使用してワーカーノードからパドを追放
ノードに対するカーネルアップデートおよびインフラのメンテナンスなどの作業を行う前に、kubectl drain
のようなコマンドを使用して、そのノードからパドを安全に追い出すことができます。 安全な排出は、パドのコンテナを優雅に終了(gracefully terminate)させるようにします。
Note:
kubectl drain
コマンドは、ノード内で削除できない特定のシステムファドを無視します。 詳細は [kubectl drain] を参照してください。
kubectl drain
命令が成功裏に実行されたなら、これはすべてのパドが安全に特定のワーカーノードから追放されたことを意味します。 その後、仮想マシンを停止、再起動、または返却してノードを中断すると安全です。
① パドを追い出そうとするノードを確認します。 クラスタ内のすべてのワーカーノードを照会するためには、次のコマンドを利用します。
$ kubectl --kubeconfig $KUBE_CONFIG get nodes
② 照会したノードの名前の中に、パドを排出(drain)する対象のワーカーノードの名前を入力します。 この動作は、ノードにスケジュールができないように表示しながら、対象ワーカーノード上にあるすべてのパドを優雅に終了します。
$ kubectl --kubeconfig $KUBE_CONFIG drain $NODENAME
上記のコマンドは、対象ワーカーノードのパドが次の場合に属すると動作しません。
- パドが
emptyDir
を使用してローカルデータを保存する場合emptyDir
を使用してlocal dataを保存するパドが該当ワーカーノードにある場合、このパドを削除するとそのデータも削除されるので実行されません。 該当するパドが除去されても問題がない場合には、--delete-local-data
フラグを drain コマンドに追加して実行します。
当該ワーカーノードにデモンセットが駆動されている場合 デモンセットに属するパドが該当ワーカーノードで駆動されている場合、
kubectl drain
コマンドは実行されません。 デモンセットコントローラは、ノードのunschedulable
状態があっても、これを無視してそのノードのパドをスケジュールして配置することができます。 デモンセットに属するパドがある場合には、--ignore-daemonsets
フラグを追加し、そのパドを追放対象から除外できます。クバネティスのコントローラで管理されていないパドが駆動している場合 クバネティスでは、Deployment、Statefulset、DaemonSet、ReplicaSet、Jobなどのコントローラが管理しないパドが該当ワーカーノード上にある場合、
kubectl drain
コマンドはこれを保護するために動作しません。kubectl drain
コマンドを--force
オプションで実行する場合、これらのパドはクラスターから除去され、再スケジューリングされません。
コマンド例題
$ kubectl --kubeconfig $KUBE_CONFIG drain $NODENAME --delete-local-data --ignore-daemonsets
③ エラーの返還もな kubectl drain
コマンドが成功した場合、仮想マシンを再起動させたり、パド除去などのクラスターメンテナンス作業を行うことができます。 メンテナンス作業後には、該当ワーカーノードに再びパドがスケジュールされるように、次のコマンドを使用します。 該当ワーカーノードを返却する場合は、以下のコマンドを実行する必要はありません。
$ kubectl --kubeconfig $KUBE_CONFIG uncordon $NODENAME