Kubectl Foreach 複数のクラスターで Kubectl コマンドを実行します

Kubectl Foreach 複数のクラスターで Kubectl コマンドを実行します

先週、K8s マルチクラスター トラフィック スケジューリングのデモ部分を書いていたとき、複数のクラスターでコンポーネントを継続的にインストールしたり、アプリケーションをデプロイしたり、さまざまなコマンドを実行したりする必要がありました。当時、クラスターは Linux シェル スクリプトとツール kubectx を使用して次のように切り替えられていました。

または、次のようになります。

手術は面倒で、非常に痛いです。

今日、私は偶然、複数のクラスター (コンテキスト) で kubectl コマンドを実行できる kubectl プラグイン kubectl foreach​ を発見しました。たとえば、 kubectl foreach cluster-1 cluster-2 -- get po -n kube-system です。

プラグインはインストールも使用も簡単です。 krew 経由でインストールします:

 kubectl krew をインストール foreach

使い方も非常に簡単です:

 kubectl foreach -h
使用法
kubectl foreach [オプション] [パターン] ... -- [KUBECTL_ARGS...]

パターンを使用して、kubeconfigからのコンテキスト名を一致させることができます
() :すべてのコンテキストに一致
NAME :正確な名前と一致するコンテキスト
/ PATTERN / :コンテキストを正規表現と一致させる
^ NAME :一致した結果から正確な名前のコンテキストを削除します
^/ PATTERN / :結果から正規表現に一致するコンテキストを削除します

オプション:
- c = NUM​​ 並列実行の制限デフォルト 0 無制限
- I = VAL KUBECTL_ARGS出現するVALをコンテキスト名に置き換えます
- q 確認プロンプトを無効にし受け入れる( $KUBECTL_FOREACH_DISABLE_PROMPTS )
-h /-- help ヘルプを表示する

:
# abc という名前のコンテキスト上のノードを取得します
kubectl foreach abc -- ノードを取得する

# c1 を除く c0.. 9という名前のすべてのコンテキストノードを取得します(エスケープに注意してください)
kubectl foreach '/^c[0-9]/' ^ c1 -- ノードを取得する

# 「prod」はあっても「foo」は含まれないすべてのコンテキストノードを取得します
kubectl foreach / prod / ^/ foo / -- ノードを取得する

# 'kubectl tail'プラグインを使用して、 * test *という名前のコンテキスト内のポッドのログを追跡します。
kubectl foreach - I _ / test / --tail --cnotallow=_ -l app=foo

次に、k3d を使用して 3 つのクラスターをテストして作成します (k3d は複数のクラスターの同時作成をサポートしていないようですので、操作するには for スクリプトが必要です)。

クラスター- 1クラスター- 2クラスター- 3の CLUSTER_NAME について
する
k3d クラスター作成$ { CLUSTER_NAME } \
--image docker.io/rancher/k3s:v1.23.8-k3s2 \
--サーバメモリ 4g \
--k3s-arg "--disable=traefik@server:0" \
--no-lb \
--timeout 120秒 \
- 待って
終わり

クラスターのインストールが完了しました:

 k3d クラスター リスト
ネームサーバー エージェント ロードバランサー
クラスター- 1 1 / 1 0 / 0
クラスター- 2 1 / 1 0 / 0誤り
クラスター- 3 1 / 1 0 / 0誤り

k3d によってインストールされたクラスターのコンテキストには、 k3d-​ というプレフィックスが付くことに注意してください。 kubectl foreach を使用する場合は、次の点に注意してください。

 kubectx
k3d -クラスター- 1
k3d -クラスター- 2
k3d -クラスター- 3

たとえば、各クラスターの kube-sysmte の下のポッドを表示するには、次のようにします。

 kubectl foreach -q k3d -クラスター- 1 k3d -クラスター- 2 k3d -クラスター- 3 -- po -n kube-system を取得します

または、デプロイメントを作成してみてください。今回は、完全なコンテキスト名をリストする代わりに、正規表現 /cluster/ を使用します。

 kubectl foreach -q /クラスター/ --create deploy pipy --image flomesh/pipy -n default
コンテキスト内でコマンド実行します:
- k3d -クラスター- 1
- k3d -クラスター- 2
- k3d -クラスター- 3
k3d -クラスター- 1 |デプロイメント.apps / pipy が作成されました
k3d -クラスター- 3 |デプロイメント.apps / pipy が作成されました
k3d -クラスター- 2 |デプロイメント.apps / pipy が作成されました

次にポッドを確認します。

 kubectl foreach -q /クラスター/ -- ポッドを取得 -n デフォルト
コンテキスト内でコマンド実行します:
- k3d -クラスター- 1
- k3d -クラスター- 2
- k3d -クラスター- 3
k3d -クラスター- 1 |名前 準備完了 ステータス 再起動 年齢
k3d -クラスター- 1 | pipy - df659b55f - bnr27 1 / 1実行中0 25
k3d -クラスター- 3 |名前 準備完了 ステータス 再起動 年齢
k3d -クラスター- 3 | pipy - df659b55f - p9j49 1 / 1実行中0 25
k3d -クラスター- 2 |名前 準備完了 ステータス 再起動 年齢
k3d -クラスター- 2 | pipy - df659b55f - 9 bjgf 1 / 1実行中0 25

ログを表示します:

 kubectl foreach -q /クラスター/ -- ログ -l app=pipy -n デフォルト --tail 3
コンテキスト内でコマンド実行します:
- k3d -クラスター- 1
- k3d -クラスター- 2
- k3d -クラスター- 3
k3d -クラスター- 2 | 2022-11-30 10 : 40 : 56.520 [ INF ] [ listener ] 0.0.0.0TCPポート8080リッスンます
k3d -クラスター- 2 | 2022-11-30 10 : 40 : 56.520 [ INF ] [ listener ] 0.0 .0 .0TCPポート8081リッスンしています
k3d -クラスター- 2 | 2022-11-30 10 : 40 : 56.520 [ INF ] [ listener ] 0.0 .0 .0TCPポート8082リッスンしています
k3d -クラスター- 1 | 2022-11-30 10 : 40 : 56.551 [ INF ] [ listener ] 0.0.0.0TCPポート8080リッスンます
k3d -クラスター- 1 | 2022-11-30 10 : 40 : 56.551 [ INF ] [ listener ] 0.0.0.0TCPポート8081リッスンます
k3d -クラスター- 1 | 2022-11-30 10 : 40 : 56.551 [ INF ] [ listener ] 0.0.0.0TCPポート8082リッスンます
k3d -クラスター- 3 | 2022-11-30 10 : 40 : 55.813 [ INF ] [ listener ] 0.0 .0 .0TCPポート8080リッスンしています
k3d -クラスター- 3 | 2022-11-30 10 : 40 : 55.813 [ INF ] [ listener ] 0.0 .0 .0TCPポート8081リッスンしています
k3d -クラスター- 3 | 2022-11-30 10 : 40 : 55.813 [ INF ] [ listener ] 0.0 .0 .0TCPポート8082リッスンしています

複数のクラスターを操作する場合、特にコンテキスト名を一致させるために正規表現を使用する場合は注意が必要です。また、-q パラメータを使用すると、操作対象のクラスターリマインダーをスキップし、コマンドを直接実行できます。​

<<:  ヤフー、広告技術事業の優先パブリッククラウドプロバイダーとしてアマゾン ウェブ サービスを選択

>>:  2023年のクラウドコンピューティングのトレンド

推薦する

ウェブサイトの重みはランキングに直接関係しますか?

権威の高いウェブサイトを追い求める人は多く、外部リンクを貼るにしても、友好的なリンクを他者と交換する...

簡単な分析: ロングテールキーワードを一括でマイニングする方法

ほぼすべての SEO 担当者は、Web サイトの検索トラフィックのほとんどが、単一検索の少ないロング...

VMware は、4 大テクノロジー大国を擁するデジタル インフラストラクチャを強化するフルスタック ソフトウェア企業を設立

[51CTO.com からのオリジナル記事] VMware は、その強力なサーバー仮想化テクノロジー...

ハイブリッド vs. マルチクラウド: Kafka アーキテクチャの 5 つの重要な比較

ハイブリッドおよびマルチクラウド インフラストラクチャは、Apache Kafka を使用するユーザ...

WeChat広告プロモーション手法を1枚の写真で理解しましょう!

コンテンツの多様化が進むにつれ、ユーザー拡大の環境も変化しています。パブリックアカウントのファンの増...

安定した効率的なフレンドリーリンクを作成するための4つのステップ

2012年の4分の1が過ぎました。この間、SEOは高品質の外部リンクを最も重視してきました。品質は量...

GG最適化1——GG検索エンジン最適化の考え方

私はGG最適化を2年半しか行っていないため、それほど長い期間ではないため、当時見ることができる最適化...

コンテンツトピックを操作し、プロモーションチャネルを確認するにはどうすればいいですか?

小さなコンテンツトピックには基本的に次の手順があります。 1.テーマと表現方法を決める1. トピック...

Pinduoduo はなぜ成功しているのでしょうか?

数日前、 Pinduoduo は2019 年通期業績報告書を発表しました。報告書によると、Pindu...

常に変化する状況の中で、Baiduをあなたのウェブサイトのようにする方法

トラフィックとユーザーは、ウェブサイトの 2 つの重要な生命線です。この 2 つは互いに補完し合って...

分散クラウドの仕組みとそのユースケース

分散クラウドにより、パフォーマンス、コンプライアンス、エッジ コンピューティングに最適化されたパブリ...

ローカルマイクロブログを構築するための5つの重要な要素

ローカルWeiboもWeiboであり、Sina WeiboやTencent Weiboからの圧力にも...

Q: Kafka のアプリケーション シナリオは何ですか?いくつか挙げていただけますか?

Kafka のいくつかのアプリケーション シナリオをまとめてみましょう。 1. ログ処理と分析(最も...