|
kubectl をより効率的に使用する方法を学習する前に、kubectl の基本的な動作を理解しておく必要があります。kubectl は、Kubernetes クラスターの制御ツールであり、Kubernetes のすべての可能な操作を実行できます。 技術的な観点から見ると、kubectl は HTTP REST API である Kubernetes API のクライアントです。この API は Kubernetes の実際のユーザーインターフェースであり、Kubernetes はこの API によって完全に制御されます。つまり、Kubernetes のすべての操作は API エンドポイントとして公開され、このエンドポイントへの HTTP リクエストによって実行できます。したがって、kubectl の主な役割は、Kubernetes API への HTTP リクエストを実行することです。 Kubernetesは完全にリソース中心のシステムです。Kubernetesはリソースの内部状態を維持し、Kubernetesのすべての操作はこれらのリソースに対するCRUD(作成、読み取り、更新、削除)操作です。これらのリソースを操作することで、Kubernetesを完全に制御できます。 たとえば、ReplicaSet リソースを作成する場合は、replicaset.yaml というファイルで ReplicaSet リソース オブジェクトを定義し、次のコマンドを実行します。
Kubernetesには「レプリカセットの作成」という操作があり、他のKubernetes操作と同様にAPIエンドポイントとして公開されています。ここで説明する操作の場合、このAPIエンドポイントは以下のとおりです。
上記のコマンドを実行すると、kubectl は上記の API エンドポイントに HTTP POST リクエストを送信します。リクエストボディには、ReplicaSet のリソースマニフェストの内容が渡されます。これは、kubectl のすべてのコマンドが Kubernetes クラスターとやり取りする最も基本的な方法です。kubectl は、対応する Kubernetes API エンドポイントに HTTP リクエストを送信するだけです。 したがって、curlやpostmanなどのツールを使用してKubernetesを制御することは可能です。Kubectlは、Kubernetes APIへのアクセスを容易にするツールです。 上記のリソース作成コマンドを実行すると、APIサーバーはetcdにReplicaSetリソース定義を保存します。これにより、コントローラーマネージャー内のReplicaSetコントローラーがトリガーされ、ReplicaSetリソースの作成、更新、削除を継続的に監視します。ReplicaSetコントローラーは、ReplicaSet定義内のPodテンプレートに基づいて、各ReplicaSetレプリカのPod定義を作成し、ストレージバックエンドに保存します。Podが作成されると、スケジューラーがトリガーされ、ワーカーノードにまだ割り当てられていないPodを継続的に監視します。 スケジューラは各ポッドに適したワーカーノードを選択し、その情報をストレージバックエンドのポッド定義に追加します。これにより、ポッドがスケジュールされているワーカーノード上のkubeletがトリガーされ、そのワーカーノードにスケジュールされているポッドが監視されます。kubeletはストレージバックエンドからポッド定義を読み取り、コンテナランタイムにワーカーノード上のコンテナを実行するよう指示します。このようにして、ReplicaSetアプリケーションが起動します。 これらのプロセスの概念を理解することは、kubectl をより深く理解し、活用する上で非常に役立ちます。次に、kubectl の生産性を向上させるための具体的なテクニックを見ていきましょう。 コマンド補完コマンド補完は、kubectlの生産性を向上させる最も便利なテクニックの一つですが、見落とされがちです。Tabキーを使ってkubectlコマンドの一部を自動化できます。これは、サブコマンド、オプション、引数、そしてリソース名のような入力しにくいものにも適用されます。コマンド補完は、BashシェルとZshシェルの両方で利用できます。 https://kubernetes.io/docs/tasks/tools/#enabling-shell-autocompletion の公式ドキュメントには、実際にコマンド補完に関する説明が含まれています。 コマンド補完は、補完スクリプトを介して動作するシェル機能です。補完スクリプトとは、基本的に特定のコマンドの補完動作を定義するシェルスクリプトです。補完スクリプトを入力することで、対応するコマンドが補完されます。Kubectlは、以下のコマンドを使用して、BashおよびZshの補完スクリプトを自動的に生成し、出力することができます。
理論上は、このコマンドの出力を適切なシェル(BashまたはZsh)で入力すると、kubectlのコマンド補完が有効になります。BashとZshの間には微妙な違いがあります(LinuxとmacOSの違いも含みます)。 バッシュリナックスBash の補完スクリプトは主に bash-completion プロジェクトに依存しているため、まずこれをインストールする必要があります。bash-completion は、以下のような様々なパッケージマネージャーを使用してインストールできます。
次のコマンドを使用して、bash-completion が正しくインストールされているかどうかをテストできます。
出力がシェルコードであれば、bash-completion は正しくインストールされています。コマンドが「not found」エラーを出力する場合は、以下のコマンドラインを ~/.bashrc ファイルに追加する必要があります。
この行を ~/.bashrc ファイルに追加する必要があるかどうかは、bash-completion のインストールに使用したパッケージマネージャーによって異なります。APT の場合は必須ですが、yum の場合は不要です。 bash-completion をインストールしたら、すべてのシェルセッションで kubectl スクリプトの補完が提供されるように設定する必要があります。これを行う方法の一つは、~/.bashrc ファイルに以下のコマンドラインを追加することです。
もう 1 つのオプションは、kubectl 補完スクリプトを /etc/bash_completion.d ディレクトリに追加することです (存在しない場合は、最初に作成する必要があります)。
/etc/bash_completion.d ディレクトリ内のすべての補完スクリプトは、bash-completion によって自動的に提供されます。 どちらの方法でも同じ結果が得られます。シェルをリロードすると、kubectlコマンドの補完が正しく機能し、Tabキーを使って情報を補完できるようになります。 マックmacOS での使用は少し複雑です。デフォルトの Bash バージョンは 3.2 ですが、kubectl 補完スクリプトには少なくとも Bash 4.1 が必要です。Apple は macOS では依然として古いバージョンの Bash をデフォルトで使用しています。これは、Bash の新しいバージョンが GPLv3 ライセンスを使用しているためです。これは Apple がサポートしていません。 そのため、macOSでkubectlコマンド補完を使用するには、Bashの新しいバージョンをインストールする必要があります。Homebrewを使ってインストール/アップグレードできます。
シェルをリロードし、必要なバージョンが動作していることを確認します。
残りの手順に進む前に、現在 Bash 4.1 以降のバージョンを使用していることを確認してください (バージョンは `bash --version` を使用して確認できます)。 前のセクションと同様に、Bashの補完スクリプトは主にbash-completionプロジェクトに依存しているため、まずインストールする必要があります。Homebrewを使ってbash-completionをインストールできます。
@2 は bash-completion v2 を表します。kubectl のスクリプト補完には bash-completion v2 が必要であり、そのためには少なくとも Bash 4.1 が必要です。そのため、kubectl のスクリプト補完は Bash バージョン 4.1 未満では使用できません。 `brew install` コマンドの出力には注意セクションが含まれており、その説明は `~/.bash_profile` ファイルに追加されます。
この手順はbash-completionのインストールを完了するために必要です。理想的には、上記の内容を~/.bashrcファイルに追加してください。シェルをリロードした後、次のコマンドを使用してbash-completionが正しくインストールされているかどうかをテストできます。
出力がシェル関数コードであれば、すべてが正しく設定されていることを意味します。次に、すべてのシェルセッションでkubectl補完スクリプトを取得するための設定を行う必要があります。1つの方法は、以下のコマンドラインを~/.bashrcファイルに追加することです。
別の方法としては、kubectl 補完スクリプトを /usr/local/etc/bash_completion.d ディレクトリに追加します。
この方法は、Homebrewを使用してbash-completionをインストールした場合にのみ機能します。この場合、bash-completionはこのディレクトリにすべての補完スクリプトを提供します。Homebrewを使用してkubectlもインストールした場合は、上記の手順を実行する必要はありません。補完スクリプトはkubectl Homebrewによって既に`/usr/local/etc/bash_completion.d`ディレクトリに配置されているはずです。この場合、bash-completionのインストール後にkubectlの補完が有効になるはずです。 シェルをリロードすると、kubectl の自動補完が有効になります。 ズッシュZshの補完スクリプトは依存関係がないため、設定が非常にシンプルです。以下のコマンドを~/.zshrcファイルに追加することで、この効果を実現できます。
シェルをリロードした後に「command not found: compdef」というエラーが表示される場合は、組み込みのcompdefを有効にする必要があります。これを行うには、~/.zshrcファイルに次の行を追加します。
さらに、kubectl のエイリアス (k など) を定義することもできます。
エイリアスが定義されている場合、拡張シェル補完によってそのエイリアスとの互換性を実現できます。
さらに、zsh で zsh-autosuggestions、zsh-syntax-highlighting、kubectl プラグインを設定することをお勧めします。これらのプラグインは、以前使用したコマンドを自動的に提案できます。プラグインの設定を ~/.zshrc に追加します。
リソース仕様を表示YAML リソース定義を作成するときは、これらのリソースのフィールドと意味を知っておく必要があります。kubectl は、ターミナルですべてのリソース仕様を正しく入力できる kubectl explain コマンドを提供します。 kubectl explain の使用方法は次のとおりです。
このコマンドは、要求されたリソースまたはフィールドの仕様を出力します。デフォルトでは、`kubectl explain` は単一レベルのフィールドのみを表示します。`--recursive` フラグを使用すると、すべてのレベルのフィールドを表示できます。
`kubectl explain` で使用できるリソース名がわからない場合は、次のコマンドを使用して確認できます。
このコマンドは、リソース名を複数形(例:deployments)と省略形(例:deploy)の両方で表示します。これらの名前はkubectlでは同等であり、どちらでも使用できます。例えば、以下のコマンドは同じ効果を持ちます。
カスタム列出力形式kubectl get コマンドのデフォルトの出力は次のとおりです (このコマンドはリソースの読み取りに使用されます)。
デフォルトの出力形式には限られた情報しか含まれておらず、各リソースには完全なリソース定義ではなく、いくつかのフィールドしか表示されません。ここで、カスタム列出力形式が非常に役立ちます。列とそこに表示するデータを自由に定義できます。リソースから任意のフィールドを選択し、出力で別の列として表示できます。カスタム列出力オプションの使用方法は次のとおりです。
各出力列を `<header>:<jsonpath>` として定義する必要があります。
簡単な例を見てみましょう。 ここでの出力には、すべてのPod名を表示する列が含まれています。Pod名を選択するための式はmeta.nameです。これは、Pod名がPodリソースのmetadataプロパティのnameフィールドで定義されているためです(kubectl explain pod.metadata.nameで確認できます)。 ここで、各ポッドが実行中のノードを表示するなど、出力に列を追加したいとします。その場合は、カスタム列オプションに適切な列指定を追加するだけです。 ノード名を選択するための式は `spec.nodeName` です。これは、Pod によってスケジュールされるノードが既に Pod の `spec.nodeName` フィールドに格納されているためです。ただし、Kubernetes リソースフィールドは大文字と小文字が区別されることに注意してください。 このように、リソースの任意のフィールドを出力列として設定できます。リソース仕様を参照し、任意のフィールドを使用してみてください。もちろん、フィールド選択のためのJSONPath式についてある程度の理解が必要です。 リソースフィールドの選択に使用される式はJSONPathに基づいています。JSONPathはJSONドキュメントからデータを抽出するための言語です(XMLのXPathに似ています)。単一のフィールドを選択することはJSONPathの最も基本的な使用法ですが、リストセレクターやフィルターなど、他にも多くの機能があります。 ただし、`kubectl explain` は JSONPath 機能のサブセットのみをサポートしています。以下に、いくつかの例を通してこれらの使用ルールをまとめます。 リストの特定の要素を選択する フィルタ式に一致するリスト要素を選択します。 指定した場所の下にあるすべてのフィールドを選択します 位置に関係なく、指定された名前を持つすべてのフィールドを選択します。 [ ] 演算子は特に重要です。Kubernetes リソースの多くのフィールドはリストであり、この演算子はこれらのリスト内の特定の要素を選択するために使用できます。ワイルドカード [*] と組み合わせて使用されることが多く、リスト内のすべての項目を選択できます。 カスタム列出力形式の可能性は無限大です。リソースの任意のフィールド、またはフィールドの組み合わせを出力に表示できます。以下にいくつかの例を示しますが、ご自身で探してニーズに合ったものを見つけてください。 ヒント: これらのコマンドを頻繁に使用する場合は、それらのシェル エイリアスを作成できます。 このコマンドは、各ポッドのすべてのコンテナイメージの名前を表示します。ポッドには複数のコンテナが含まれる場合があるため、1つのポッドのコンテナイメージは同じ列にカンマ区切りのリストとして表示されます。 このコマンドは、Kubernetes クラスターがパブリッククラウド上にデプロイされている場合に、各ノードのアベイラビリティゾーンを表示するため便利です。各ノードのアベイラビリティゾーンは、特別なラベル「failure-domain.beta.kubernetes.io/zone」を通じて取得されます。このラベルは、クラスターがパブリッククラウド インフラストラクチャ上で実行されている場合に自動的に作成され、その値がノードのアベイラビリティゾーン名に設定されます。 タグは Kubernetes リソース仕様の一部ではありませんが、ノードを YAML または JSON として出力すると、タグに関する情報を確認できます。 kubectl が Kubernetes API にリクエストを送信する際、kubeconfig ファイルを読み取って必要な接続パラメータを取得し、APIServer にリクエストを送信します。デフォルトの kubeconfig ファイルは ~/.kube/config です。複数のクラスターを使用する場合、kubeconfig ファイルは複数のクラスターの接続パラメータを設定するため、kubectl にどのクラスターに接続するかを伝える手段が必要です。クラスター内には複数の名前空間を設定できます。また、kubectl は kubeconfig ファイルでリクエストに使用する名前空間を特定できるため、kubectl にどの名前空間を使用するかを伝える手段も必要です。 さらに、KUBECONFIG 環境変数で設定したり、--kubeconfig オプションを使用して各 kubectl コマンドのデフォルトの kubeconfig ファイルを上書きしたりすることもできます。 kubeconfig ファイルは一連のコンテキストで構成され、各コンテキストには次の 3 つの要素が含まれています。 ほとんどのユーザーは、kubeconfig ファイルで各クラスターに単一のコンテキストを使用するのが一般的です。ただし、各クラスターが異なるユーザーまたは名前空間を持つ複数のコンテキストを持つことはまれであるため、通常、クラスターとコンテキストは1対1でマッピングされます。 いつでも、次のいずれかのコンテキストを現在のコンテキストとして設定できます。 kubectl は kubeconfig ファイルを読み取る際に、常に現在のコンテキストの情報を使用します。したがって、上記の例では、kubectl は Hare クラスターに接続します。別のクラスターに切り替えるには、kubeconfig ファイルで現在のコンテキストを変更するだけです。 これにより、kubectl は Fox クラスターに接続し、同じクラスター内の別の名前空間に切り替えることができるようになり、現在のコンテキスト内の名前空間要素を変更できるようになります。 上記の例では、kubectl は Fox クラスター内で、以前設定された Test 名前空間ではなく Prod 名前空間を使用するようになりました。理論的には、kubeconfig ファイルを手動で編集することでこれらの変更を行うことができます。kubectl config コマンドには、kubeconfig ファイルを編集するためのサブコマンドも用意されています。 たとえば、それぞれ異なるクラスターに接続する 2 つの kubeconfig ファイルがある場合、次のコマンドを使用して 2 つの kubeconfig ファイルをマージできます。 上記のコマンドは、2つのkubeconfigファイルをマージします。2つのクラスターと2つのコンテキストがあることがわかります。リソースオブジェクトを操作する際には、`--context`パラメータを使用して操作対象のクラスターを指定できます。 ご覧の通り、このプロセスは非常に面倒です。以下では、これらの変更を自動化するために他のツールを使用します。 Kubectxは、クラスターと名前空間を切り替えるための強力なツールです。`kubectx`コマンドと`kubens`コマンドが提供されており、現在のコンテキストと名前空間を個別に変更できます。各クラスターにコンテキストが1つしかない場合、現在のコンテキストを変更するとクラスター自体も変更されます。 kubectl プラグイン管理ツール Krew がすでにインストールされている場合は、次のコマンドを使用して Kubectx プラグインを直接インストールできます。 インストール後、`kubectl ctx` コマンドと `kubectl ns` コマンドを使って操作できます。ただし、この方法ではシェルの自動補完スクリプトはインストールされないことに注意してください。必要であれば、macOS の Homebrew など、別の方法でインストールできます。 このインストールコマンドは、bash/zsh/fishの自動補完スクリプトを自動的に設定します。異なるクラスター間を切り替える必要がある場合が多いため、誤ってクラスターを操作してしまう可能性が高くなります。このような場合、プロンプトが表示されるのは非常に便利です。kube-ps1ツールを使用してPS1を変更できます。 ただし、ローカルでoh-my-zshを使用しているため、インストールする必要はありません。~/.zshrcのプラグインにkube-ps1を追加し、カスタマイズして、ソースを再設定するだけで済みます。 これで、kubectx コマンドを入力するだけでクラスターを切り替えることができます。 kube-ps1 を設定しているため、現在動作しているクラスターもターミナルの前面に直接表示され、クラスター上で操作する際のエラーを防止します。 kubectx のもう一つの非常に便利な機能は、インタラクティブモードです。このモードでは fzf ツールが必要です(fzf をインストールすると、kubectx のインタラクティブモードが自動的に有効になります)。インタラクティブモードでは、インタラクティブなあいまい検索インターフェースを使用して、ターゲットコンテキストまたは名前空間を選択できます。 バージョン1.12以降、kubectlはカスタムコマンドでkubectlを拡張できるプラグインメカニズムを提供しています。kubectlプラグインは、kubectl-xという形式の名前を持つシンプルな実行ファイルとして配布されます。kubectl-xには、プラグインを呼び出すための新しいkubectlサブコマンドがプレフィックスとして付加されます。 プラグインをインストールするには、kubectl-x ファイルをPATH内の任意のディレクトリにコピーし、実行可能にするだけです。その後は、kubectl x でプラグインを起動できます。システムに現在インストールされているすべてのプラグインを一覧表示するには、以下のコマンドを使用します。 Kubectlプラグインはソフトウェアパッケージのように共有・再利用できます。しかし、他のユーザーが共有したプラグインはどこで見つけられるのでしょうか?Krewプロジェクトは、kubectlプラグインの共有、検索、インストール、管理のための統合ソリューションを提供することを目指しています。Krewはkubectlプラグインをインデックス化し、ユーザーはそこからプラグインを選択してインストールできます。もちろん、krew自体もkubectlプラグインであるため、krewのインストールは他のkubectlプラグインのインストールと基本的に同じです。krewの詳細なインストール手順は、GitHubページ(https://github.com/kubernetes-sigs/krew)でご覧いただけます。 重要な krew コマンドをいくつか紹介します。 `kubectl krew list` コマンドは krew でインストールされたプラグインのみを一覧表示しますが、`kubectl plugin list` コマンドは krew でインストールされたプラグインと他の方法でインストールされたプラグインを含むすべてのプラグインを一覧表示することに注意してください。 独自のkubectlプラグインも簡単に作成できます。必要な操作を実行する実行ファイルを作成し、kubectl-xという名前を付けて、上記のようにインストールするだけです。実行ファイルは、Bashスクリプト、コンパイルされたGoプログラム、Pythonスクリプトなど、どのような形式でも構いません。種類は特に問いません。必要なのは、オペレーティングシステムから直接実行できることだけです。 サンプルプラグインを作成しましょう。これまでは、各ポッドのコンテナイメージを一覧表示するために「kubectl」コマンドを使用していました。このコマンドは、「kubectl img」で呼び出せるプラグインに簡単に変換できます。以下の内容を含む「kubectl-img」というファイルを作成するだけです。 次に、`chmod +x kubectl-img` を使ってファイルを実行可能にし、PATH 内の任意のディレクトリに移動します。これで、`kubectl img` でプラグインをすぐに使用できるようになります。 Kubectlプラグインは、あらゆるプログラミング言語またはスクリプト言語で記述できます。シェルスクリプトを使用する場合、プラグインからkubectlを簡単に呼び出せるという利点があります。また、Kubernetesクライアントライブラリなどの本格的なプログラミング言語を使用すれば、より複雑なプラグインを作成することもできます。Goを使用する場合は、kubectlプラグインの作成用に特別に設計されたcli-runtimeライブラリを使用することもできます。 |