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年のクラウドコンピューティングのトレンド

推薦する

iQiyi はなぜ価格を上げることにしたのでしょうか?

iQiyi の会員価格が上がる時期が来ています。数日前、iQiyi VIP会員のWeiboアカウント...

Baidu 入札コンバージョン率の分析 - Baidu 入札を改善するためのコツ

ウェブサイト運営の核心は「潜在的ユーザーを見つけ出し、効果的に協力的な顧客に変える」ことです。ウェブ...

ゲームが厳しい規制に直面する中、クラウド コンピューティングはテンセントの新たな希望となるのでしょうか?

株価は下落し続け、ゲームは厳しい規制に直面し、トラフィックの伸びは鈍化し、投資収益は減少しています....

競合他社を分析してウェブサイトのランキングを向上させる方法

SEO で成功したいなら、競合相手の分析方法を学ばなければなりません。自分自身と敵を知ることで、あら...

素晴らしいアイデア:これは、降格されたウェブサイトを復元する方法です

SEO 業界が混乱していた 2012 年には、次のようなヘルプ リクエストが多かれ少なかれ見られまし...

電力分野におけるエッジコンピューティングの応用事例

私たちが気候の移行期にあり、是正措置が取られなければその影響が地球に直接影響を及ぼすであろうことは、...

2018年テンセントクラウド+フューチャーサミットが広州で開催され、クラウドを通じてインテリジェントな未来を活性化

5月23日、広東省人民政府の指導の下、広東省経済情報化委員会とテンセントの主催により、2018年テン...

新しいウェブサイトをうまく運営するにはどうすればいいでしょうか?ランキングは必要ですか?

月収10万元の起業の夢を実現するミニプログラム起業支援プラン毎日、大量の新しいウェブサイトが誕生して...

「水は船を運ぶこともできるが、転覆させることもできる。」外部リンクはウェブサイトの存続を左右する

フォーラムやブログの外部リンクを増やすためのチャネルとメソッドは、少なくとも1日の外部リンクがありま...

数百の欧州企業が協力し、クラウドコンピューティングにおけるテクノロジー大手の優位性に挑戦

1月29日のニュース、海外メディアの報道によると、今ではほとんどの人がジェフ・ベゾスの影響から逃れる...

マーケティングにおける「存在感」の重要性を例を通して簡単に分析する

地球上の誰もが知っているチャイナモバイルやチャイナテレコムのような企業は、なぜ莫大な費用を広告に費や...

Bilibili のブランドマーケティングでは、ミームをどのように活用して Z 世代にアプローチしているのでしょうか?

Bilibiliは今でもZ世代と伝統的な言語でコミュニケーションを取っているのでしょうか? Z世代が...