概要
Kubernetesで、コンテナがうまく起動しなかったり、コンテナは起動したのに通信ができないというときなどに、原因を調査する方法について、私がやっていることを紹介します。
紹介するものは、kubectlコマンドを使ったものなので、kubectlが使える環境を用意してください。
私の状況
私自身、Kubernetesを使っていて、うまくコンテナが起動できず困ったり、コンテナが起動しても通信ができなくて困ったりということがありました。
原因はイメージの作り方が悪かったり、Kubernetesでの設定が悪かったり色々でしたが、ほとんどの場合、コンテナの状況やログを見ると分かるものがほとんどでした。
なので、皆さんもKubernetesでコンテナの調子が悪いような時は、これらのことを確認してみましょう。
nodeの一覧
Kubernetesでコンテナが動作するサーバのことをnodeと言います。
nodeは一台の時もありますが、ほとんどの場合複数台あると思います。
nodeは、kubectlコマンドで確認することができます。
kubectl get nodes
nodeのところに「Ready」と表示されていれば正常に動作していますが、もし「NotReady」と表示されていれば、正常に動作していません。
コンテナの一覧
まず、Kubernetes上で動作している全てのコンテナを確認してみましょう。
Kubernetesでは、コンテナの単位をpodというもので表現しています。
なので、Kubernetesでコンテナを確認する時は、podを確認します。
kubectl get pods
これだけでは、全てのpodを確認することができません。
どうしてかというと、Kubernetesにはnamespace(名前空間)というものがあり、上のコマンドではデフォルトのnamespaceに属しているpodの情報しか見ることができないからです。
なので、全てのpodを確認するにはこのようにします。
kubectl get pods --all-namespaces=false
--all-namespaces=false
をつけて、全てのnamespaceのpodを確認できます。
namespaceを指定する場合はこのようにします。
kubectl get pods --namespace namespace名
namespaceの一覧
全てのnamespaceを確認するには、下記のコマンドを実行します。
kubectl get namespaces
podの場合、--all-namespaces=false
をつけて全てを表示することもできますが、一部のnamespaceのものだけ知りたいというときには、このようにしてnamespaceの名前を調べておく必要があります。
serviceの一覧
serviceは、podが別のpodや外部のサーバと通信するためのものです。
なので、serviceを調べると、podにどのようなIPアドレスが割り当てられているのか、外部と通信することができるのかなどを知ることができます。
serviceの一覧はこのようにして知ることができます。
kubectl get services
これはpodと違い、namespaceとは関係なく全てのserviceを知ることができます。
ログ
Kubernetesは、Dockerのオーケストラレーションツールということで、内部ではDockerを使っています。
なので、Dockerと同じように、ログを見ることが可能です。
Kubernetesでは、コンテナではなくpod単位でログを見るので、まずkubectl get pods
などでpodの名前を調べておきます。
そうしたら、次のコマンドでログを見ることができます。
kubectl logs pod名
見ることができるログは、Dockerでコンテナを起動したときに表示されるログと同じです。
詳細情報
podが起動できれば、ログなどで状況を知ることができるのですが、podが起動しないような時もあります。
そのような時は、describeを使ってログとは別に詳細情報を見ることができます。
kubectl describe pod pod名
これは、pod以外の情報を見ることもできます。その場合podのところをそれぞれの単語で置き換えます。
serviceの場合はこのようにします。
kubectl describe service service名
さらに、nodeの場合はこのようにします。
kubectl describe node node名
podにログイン
podが動作していれば、そのpodに入って操作することができます。
その場合はこのようにします。
kubectl exec --it pod名 /bin/bash
基本的に、Dockerのexecコマンドを使うのと同じように使います。
使い分けの指標
私はよく、これらのコマンドを使って、Kubernetesの状況を確認しています。
podが起動できないようなときには、kubectl get pods
でpodの状況や名前を調べて、`kubectl describe pod pod名`で詳細な情報を調べます。
通信ができないようなときには、kubectl get services
でserviceの状況や名前を調べて、kubectl describe service service名
で詳細な情報を調べます。
起動しているpodで不具合が発生したり、何か操作したいというときがあったらkubectl logs pod名
でログを調べたり、kubectl exec
でpodにログインしたりします。
大体の場合、これでうまく動かない原因を発見できるはずです。
ちなみに、気づいている人もいると思いますが、kubectl get リソース名
のようにして、それぞれの情報を知ることができ、kubectl describe リソース名 名前
のようにしてそれぞれの詳細情報知ることができるようになっています。
そして、複数の情報が手に入るような場合は、複数形で単語を記述します。
まとめ
Kubernetesは、コンテナを動作させるという点で普通のサーバとは違った考えが求められたり、制限があったりします。
そこを覚えておいて、Kubernetesと付き合っていきましょう。