こんにちは、Linodeの開発者であるAndrewです。マネージドKubernetesソリューションを構築する過程で、私はKubernetesでの日々の作業を容易にするためにいくつかのトリックを発見し、作成しました。この5つを皆さんと共有したいと思います。私と同じように、皆さんにも役立つことを願っています。
1. Metal Shellトリック
私は今年のKubeCon EuropeでCKAの準備に関するOlive Power 氏の話でこのトリックを初めて見ました。
kubectl <command> --help | grep kubectl
すべての kubectl コマンドには、ヘルプ出力に幾つかの例が含まれており、これらを簡単に確認するいい方法です。これらの例では、ドキュメントを読むだけではわからない便利な方法でパラメーターとフラグを組み合わせる方法についてのアイデアを得ることができます。
現在、kubectl run コマンドは最も多くの例:18個をレンダリングします。しかし、私が最も頻繁に使用するコマンドはkubectl getです。その一例を見てみましょう。
kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
このコマンドは kubectl get 出力を変換し、このポッドにデプロイされたコンテナバージョンのみを提供します。若干の変更を加えると、出力をより便利にすることができます。最初のコンテナー (containers[0]) の名前とイメージを要求していることに注意してください。kubectl でサポートされている JSONPath 構文を使用すると、すべてのポッド内のすべてのコンテナーのすべてのバージョンを一覧表示できます。
kubectl get pod -o custom-columns=CONTAINER:.spec.containers[*].name,IMAGE:.spec.containers[*].image -A
このトリックは、個々のポッドリソースを探し回って、クラスター内のカナリア画像やバージョンスキューを見つけるのを防ぐことができます。kgi のエイリアス (および名前空間セレクター -A を削除して) を使用すると、クラスターで実行されている kube-apiserver のバージョンを見つけることができます。以下を参照してください。
$ kgi -n kube-system -l component=component=kube-apiserver
CONTAINER IMAGE
kube-apiserver k8s.gcr.io/kube-apiserver:v1.14.5
kube-apiserver k8s.gcr.io/kube-apiserver:v1.14.5
kube-apiserver k8s.gcr.io/kube-apiserver:v1.14.5
次のコマンドは、すべての組み込まれた例の最新の一覧を出力します。見たことがないいくつかのフラグ付きの1つを選択して実験してみましょう!
for c in $(kubectl --help | egrep "^\s+([a-z-]+)" -o); do echo -e "$(kubectl $c --help | egrep '^\s+kubectl')"; done
2. 名前空間ごとのメモリ使用量を取得する
awk は awk { print $1 } 以上のものであることを知っている人もいるでしょう。最近、私はさらに深く掘り下げて、Unix の歴史上の巨人たちからもたらされたこの信じられないほど強力な言語の基本を学びました。ここでは、とても便利なawkプログラムの例を紹介します。このプログラムは、各ネームスペースのすべてのポッドが使用しているメモリのMiB数を合計して表示し、クラスタに長いネームスペース名が含まれている場合でも、awkのprintfを使用してきれいに出力します。kubectl の出力を集約して表示する必要がある場合は awk の使用を検討してください。
kubectl top pod -A --no-headers=true | awk '{a[$1] += $4} END {for (c in a) printf "%-35s %s\n", c, a[c]}'
3. プレーンテキストでシークレットを表示する
シークレットに依存するアプリを開発する場合、kubectl 出力を base64 にパイプ処理する方法を見つけるのは面倒です。シェル パイプラインまたはデコードする小さなスクリプトを記述したかもしれません。複数行出力をサポートしていない、途中で改行を追加または削除する、フィールド名のコンテキストを失うことなど、さまざまな欠点を持ついくつかの異なるオプションを私は見てきました。Ashley Schuettのkubectlのための秘密のデコードプラグインを使用すると、kubectlの出力を取得し、これらの問題のすべてを回避することができ、kubectl内の読み取り可能な形式で秘密を表示することができます。
プロジェクトドキュメントでは、curl を使用して GitHub からバイナリを取得し、パスに追加することを勧めています。取り扱いが難しいデータに触れるので、ソースからコンパイルし、最初にソースを確認することをお勧めします。幸いなことに、このプラグインはきちんと記載された唯一のソースファイルで構成されています。
git clone git@github.com:ashleyschuett/kubernetes-secret-decode.git
cd kubernetes-secret-decode
GO111MODULE=off go build -o $GOPATH/bin/kubectl-ksd
最後のステップに組み込まれたバイナリの名前はプラグインとして認識されるように kubectl- で始まる必要があります。 $GOPATH/ビンが$PATH上にあることを確認し、次のように使用します:
kubectl ksd get secret -n <namespace-name> <secret-name> -o yaml
4. 最近のログと以前のログ
稼働時間が数週間から数か月に達するサービスがある場合、コンテナー ログは、一般的な kubectl ログ コマンドがとんでもないサイズの出力を生成する可能性があります。端末がテキストをペイントする能力の限界テストか、人間が判読できるはずのネットワーク トラフィックの量に驚いているような気がするかもしれません。このような場合、出力を切り詰めて表示させたいメッセージにアクセスする方法は複数あります。
まずは、 --tail=N
最初に
kubectl logs --tail=10 -f -n kube-system -l component=kube-apiserver
もあります。 --since=time
30 秒、1h、5m などの時間間隔を受け入れ、それぞれ秒数、時間数、または分数に相当します。
kubectl logs --since=5m -f -n kube-system -l component=kube-apiserver
私が頼りにするようになったもう一つのログフラグは-pです。これにより、コンテナーの前回の実行のログ、すなわち終了したコンテナーのログを出力します。私はポッドを再起動し、彼らが再びクラッシュする前にいくつかの迅速なマウスとキーボードの操作で、彼らのログを「キャッチ」しようとしたので、これを知っていればKubernetesと私の最初の数日間をはるかに簡単にしたでしょう。
kubectl logs -p -n kube-system -l component=etcd
5. 待機時間の節約
スリープ コマンドを使用してループを記述したいと思うときはいつでも、大体より良い方法があります。どの間隔を選択しても、1 秒以上無駄になる可能性があります。自動化されたプロセスの場合、この累積は効いてくる可能性があります。kubectl wait コマンドとそれに関連する APImachinery パッケージはこのためにあります。このコマンドを使用すると、クラスター内で条件が満たされるのに必要な特定の時間、スクリプトを一時停止できます。また新しいリリースがクラスターにヒットした瞬間に Slack にエアホーンを投稿するためにも使用できます。楽しんでみてください。
いくつかの例を次に示します:
kubectl wait --for=condition=Available deployment/metrics-server
kubectl wait --for=condition=Initialized pod/csi-linode-controller-0
利用可能な条件はリソースの種類によって異なり、kubectl describe を使用して"Condition:" 内で検出できます。特定のリソースは、同時に多くの異なる条件を持つことができます。
ボーナストリック!
時々、出力を見ていくつかの追加のネットワーキングや他の情報が表示されることを望みませんか? コマンドに -owide を追加してみてください。これはほぼすべての種類のリソースに対して機能し、表示される列はカスタム リソース定義 (CRD)用にカスタマイズできます。例:
kubectl get pods -A -owide
kubectl get services -A -owide
最後になりましたが、気づいていなかったかもしれませんがフラグのエイリアスとして -A が追加されました。 --all-namespaces
私はその機能だけでも導入されて以来世界の何百万ものキーストロークを救ったと思います。もう一つの大きな時間節約策は次を追加することです: alias k=kubectl
シェル rc に次を追加します:
この記事は主に組み込みの kubectl 機能に触れました。さらに深く理解するために、オープンソースのkubectlブックがあり、オンラインで読むことができます。Kustomizeの使用に焦点を当てており、Kubernetesリソースを整理して構成することができます。特に脆弱な面積を最小限にしたい Kubernetes プロジェクトフレームワークを探している場合は強くお勧めします。その他の便利なコマンドのコレクションについては、Kubectl プラグインの公式パッケージマネージャーであるKrewを参照してください。
コメント (2)
Great post Andrew, this is actually cool.
#2, getting memory usage based on namespace is a nice hack, on #3, i’d prefer to use rancher to get most of these information.
What do you think, have you tried rancher before?
Thanks : )
I have used Rancher before, in fact Linode has an official Rancher integration which you can read about here: https://www.linode.com/docs/kubernetes/how-to-deploy-kubernetes-on-linode-with-rancher-2-x/
I do like Rancher for managing access to a cluster, the fact that each user gets a ServiceAccount token proxied through the Rancher deployment is very cool.
For viewing secrets, I still use the technique in #3.