Kubernetesチートシート: 知っておくべきコマンドと例

Kubernetesチートシートの表紙画像

Kubernetesを初めて使う場合は、ちょっと辛いかもしれませんね。色々なオブジェクトがあるって理解するだけじゃ終わらないんです。実際にK8sクラスターとやりとりする時、初心者にはさらにややこしくなるんですよ。

kubectlの紹介


Kubernetesクラスターとやりとりする時に最も一般的なツールはkubectlです。これを使って作ったオブジェクトを管理したり、ログを見たりできるんです。K8sを学び始めた人は皆、同意すると思いますが、KUBECTLのコマンドが多すぎて覚えきれないんです!

でも安心してください。このブログは事を簡単にするための試みです。K8sを使ううちによく出会うコマンドを見ていきましょう。始める前に和むためにミームを一つどうぞ。

kubectlのミーム

もしKubernetesをまったく知らない場合は、進む前にKubernetes for Beginnersのブログをチェックしてみてください!

クラスター情報と設定


クラスター自体について、アプリケーションではなく情報が必要になることがよくあります。以下のコマンドがその中で役立ちます:

  • kubectl version: クライアントとサーバーのKubernetesのバージョンについての情報を提供します。
  • kubectl cluster-info: Kubernetes管理プレーンのエンドポイントを表示します。
  • kubectl config get-contexts: 現在のkubeconfigにあるすべてのコンテキストをリストアップします。
  • kubectl config use-context <context name>: すべてのkubectlコマンドのデフォルトのコンテキストを設定できます。

ネームスペース


ネームスペースはクラスターではとても重要な役割を果たします。アプリケーションが必要とするさまざまなリソースを整理したり隔離したりする方法として機能します。デフォルトでは、default ネームスペースにいるんです(驚きですよね!)。そしてKubernetesの動作に必要なリソースは kube-system ネームスペースにあります。こちらはネームスペースに関するよく使うコマンドです:

  • kubectl get namespaces: 作成したネームスペースを追跡することができなくなることがあります。このコマンドで、全てをリストアップする手助けができます。
  • kubectl create namespace <namespace name>: 新しいネームスペースを作成するコマンドです。ただし、デフォルトのネームスペースには設定されないのでご注意ください。明示的に --namespace フラグを指定しない限り、作成する全てのリソースは default ネームスペースに作成されます。
  • kubectl config set-context --current --namespace=<namespace name>: 同じコンテキストを保ちながら、すべてのコマンドのデフォルトのネームスペースを変更することができます。もしデフォルトのネームスペースに戻したくなったら、default という名前だってことを覚えておいてくださいね。
  • kubectl delete namespace <namespace name>: 指定したネームスペースとそのネームスペースの下にある全リソースを削除します! リソースの削除は非同期プロセスなので、完全に消える前に「Terminating」状態でネームスペースが表示されていることに驚かないでください。

ポッド、デプロイメント、シークレットなど


Kubernetesのリソースとやりとりする際によく使う特定のコマンド群があります。X の部分にリソース名を入れて使ってみてください:

  • kubectl get X: 現在のネームスペース内でその特定タイプのすべてのリソースをリストアップします。
  • kubectl create X <name> <other properties>: 指定した名前で現在のネームスペースに「X」リソースを作成します。ほとんどの場合、実際にそのリソースを作成するためにいくつかの追加フラグが必要になります。
  • kubectl delete X <name>: 現在のネームスペースで指定した名前の「X」リソースを削除します。
  • kubectl describe X <name>: 物事をデバッグする時には、このコマンドをたくさん使うでしょう。これは指定したリソースに関する詳細とイベントを提供します。
  • kubectl edit X <name>: YAMLを扱うことなく、指定したリソースを直接編集することができるコマンドです。編集内容に満足したら、リソースが削除された後も編集が維持されるわけではないので、YAMLを更新することを忘れないでください!

ノード


ノードはクラスタを構成するものですから、当然よくやりとりすることになります。メモしておく価値のある以下のコマンドがあります:

  • kubectl get nodes: すべてのノードのリストと、彼らの役割(コントロールプレーン、ワーカーなど)と彼らが実行しているK8sのバージョンを表示します。
  • kubectl top node <node name>: 指定されたノードのCPUおよびメモリの利用状況を表示します。
  • kubectl cordon/uncordon node <node name>: ノードをコーディングするというのは、それを利用できなくすることです。つまり、そのノードにはポッドが配置されません。これは、バージョンを更新したり、デバッグのような何かのためにノードを隔離したいときに便利です。
  • kubectl drain node <node name>: クラスターのメンテナンス作業を行う際に、このコマンドを使用することになります。ノードをドレインするというのは、それをコーディングし、そこで実行中のすべてのポッドを削除することを意味します。それらのポッドがデプロイメント、デーモンセットなどによって管理されている場合、残りのノードで再作成されます。

他のよく使うコマンド


これらは特定のカテゴリにはまるというわけではないですが、よく使うコマンドです。

  • kubectl apply -f <filename.yaml>: YAMLファイルを使ってK8sリソースを作成している場合、これがそのYAMLを適用するために使うべきコマンドです。YAML内で指定されたリソースが既に存在する場合、このコマンドは最新の設定でリソースを更新します。
  • kubectl delete -f <filename.yaml>: 特定のYAMLファイル内で指定されたすべてのリソースを削除します。
  • kubectl port-forward <pod name> <local port>:<remote port>: デバッグ時など、サービスを使ってアプリケーションを外部トラフィックに公開することは、いつも便利とは限らないです。port-forward サブコマンドは、ローカルポートを指定されたポッドの特定のポートに転送する簡単な方法を提供してくれます。
  • kubectl logs <pod name>: デプロイされたアプリケーションのデバッグに非常に役立つコマンドです。このコマンドは、指定されたポッドで実行中のコンテナのログを表示します。ポッドが複数のコンテナを実行している場合は、--container フラグを追加して、どのコンテナのログを見たいかを指定することができます。

開発者からKubernetesの複雑さを抽象化する


ここでK8sを使った作業をする際によく使う一般的なコマンドについて話しましたが、開発者がこれらK8s関連のタスクを取り扱うべきではないと信じています。開発プロセス中にインフラやデプロイ面で開発者に取り組ませると、生産性に大きな影響が出るだけでなく、開発者の経験も悪化します。Oktetoを使えば、dev環境を立ち上げるために必要な全てのことをYAMLで定義し、開発者はコードを書くフェーズに直接入れるように、ただ一つのコマンドを実行するだけです。自分でその魔法を見るためにGetting Started Guideを試してみてください!

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/okteto/kubernetes-cheat-sheet-must-know-commands-and-examples-2d1k