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

推薦する

Kafka の 3 階層アーキテクチャ設計の分析

[[432602]]この記事はWeChatの公開アカウント「Hua Zai Chats about ...

Amapと中国気象局が共同でAI版洪水マップを開発し、道路の洪水をリアルタイムで予測

5月31日、AutoNavi Mapは中国気象庁公衆気象サービスセンターと戦略的提携を締結したと発表...

提案書作成のためのウェブサイト運営

ウェブマスターの道を歩み続けるなら、遅かれ早かれ、ウェブサイト関連の他の職業に転向する必要があります...

クラウドコンピューティング戦争はまだ終わっていない

都市に住む人々は、いくつかの共通のビジョンを持っています。「例えば、道路をもっとスムーズにできないか...

cloudsigma: フィリピン VPS、月額 12 ドル、1G メモリ/1 コア/50g SSD/5T トラフィック

Cloudsigma は、1Gbps の帯域幅と少なくとも 1 か月あたり 5T のトラフィックを備...

CRUD プログラマーしか知らない友人の皆さん、クラウド コンピューティング テクノロジーを採用し始めましたか?

序文クラウド コンピューティング テクノロジーは、実のところ特に新しいテクノロジーではありません。そ...

DigitalOcean、不正教育パックから100ドルを取り戻す

10月13日午後8時頃、友人から、デジタルオーシャンが不正行為で得た100ドルの整理を開始し、さらに...

小売業界がエッジコンピューティングの力を活用する必要がある理由

小売業者はエッジ コンピューティングを使用して顧客エクスペリエンスを向上できます。したがって、これは...

「なぜウェブサイトが禁止されたり、格下げされたり、キーワードランキングが消えたりするのか?」と疑問に思っている方へ。

マオルー兄弟が SEO と関わりを持つようになってから、最初は寄生的なフォーラムから、後にはフォーラ...

電子商取引の背後にある価格戦争:今年20人以上の業界幹部が辞任

前回の急成長の後、2012年の電子商取引業界は「大魚が小魚を食べ、速い魚が遅い魚を蹴る」という統合の...

クラウド ネイティブのヒント: OrbStack — ローカル K8s 環境向けのドメイン名マッピング最適化、開発者の新たなお気に入り

今日は、新しいパートナーであるOrbStack[2]を紹介したいと思います。OrbStackのスロー...

サイトの内外両方に焦点を当ててSEOの二重の保険を作りましょう

ウェブサイトのランキングは、オンサイトとオフサイトの 2 つの側面によって決まります。多くの人は、S...

解決済みdos-6.75USD/512MB RAM/25GB HDD/500GB フロー/アンチDDoS

このプロモーションのホストはロサンゼルスにあり、デフォルトで 1Gbps の DDoS 保護を提供し...

リバースホスト - 128MB RAM/10GB SSD/500GB 帯域幅/サンディエゴ/年間 18 ドル

Reversehosts は年末に設立されました。Hostcat は今年 3 月からこの VPS を...