Curl を使用して Kubernetes をデバッグする!

Curl を使用して Kubernetes をデバッグする!

[[405740]]

この記事はWeChatのパブリックアカウント「Xintai Cloud Service」から転載したもので、著者はZhu Xiangです。この記事を転載する場合は、Xintai Cloud Service公式アカウントまでご連絡ください。

Kubernetes は、クラウド プラットフォーム内の複数のホスト上のコンテナ化されたアプリケーションを管理するためのオープン ソース システムです。その目標は、コンテナ化されたアプリケーションの展開をシンプルかつ強力にすることです。アプリケーションの展開、計画、更新、保守のためのメカニズムを提供します。

Kubernetes のコア機能は、コンテナを自律的に管理して、クラウド プラットフォーム内のコンテナがユーザーの期待どおりに実行されるようにすることです (たとえば、ユーザーが Apache を常に実行したい場合、その方法について心配する必要はありません。Kubernetes が自動的に監視、再起動、再構築を行い、つまり Apache が常にサービスを提供するようにします)。

管理者はマイクロサービスをロードし、プランナーが適切な場所を見つけられるようにすることができます。同時に、Kubernetes はシステムのツールと人間化も改善し、ユーザーが独自のアプリケーション (カナリア デプロイメントなど) を簡単にデプロイできるようにします。

現在、Kubernetes は中断のないサービス ステータス (Web サーバーやキャッシュ サーバーなど) とネイティブ クラウド プラットフォーム アプリケーション (Nosql) に重点を置いています。近い将来、バッチ、ワークフロー、従来のデータベースなど、さまざまな本番クラウド プラットフォームのさまざまなサービスをサポートする予定です。

一部の人にとって、Kubernetes は非常に複雑なスケジューリング システムです。

…複雑なので、構成が非常に長くなります。

…設定 YAML ファイルが多すぎるため、設定を処理するために他のさまざまなツール ソフトウェアを使用する必要があります。

しかし、この記事では、Kubernetes が複雑だと考えている人は、初期のオペレーティング システムと同様に、Kubernetes を学習して使用する合理的な方法を見つけていないだけだと主張します。

Kubernetes には、構成を管理するためのシンプルでエレガントな方法があり、この記事ではそれについて説明します。

このアプローチはシンプルで一貫性があるため、これまで以上に多くの構成を管理できます。今では、より多くの構成を管理できるだけでなく、複雑なシステムを構築することもできます。

もちろん、構成自体は複雑になる可能性があります。そのため、この投稿では設定を省略します。ここでは、Kubernetes API のメカニズムと、この API の探索方法にのみ焦点を当てます。

このように API を構造化すると、多くのツールにメリットがもたらされます。

方法は何ですか?

このシンプルで効率的なアプローチを説明するために、まず Unix システムの中心的な考え方から始めましょう。

  1. すべてがファイルです

もっと正確に言えば、すべてがテキストです。 Unix プログラムはテキストを読み書きします。ファイル システムは、読み取るテキストを検索するための API です。これらのテキストはすべてファイルではありません。

  • ~/hello-world.txtはテキストファイルです
  • /dev/nullはヌルテキストストリームです
  • /procはプロセスに関する情報を読み取るためのテキストストリームのセットです

次のコミックを使用して /proc を詳しく見てみましょう。

たとえば、次の方法でシステム上で実行されている /proc を表示して理解できます。

  • 実行中のプロセスの数 (ls /proc - プロセスの一覧)
  • どのコマンドラインでプロセス PID を開始したか (cat /proc/PID/cmdline -- プロセスを取得)
  • プロセス PID が使用しているメモリの量 (cat /proc/PID/status - プロセス ステータスを取得)

Kubernetes API とは何ですか?

Kubernetes API はクラスター システムの重要な部分です。 Kubernetes 内のさまざまなリソース (オブジェクト) のデータは、この API インターフェースを通じてバックエンドの永続ストレージ (etcd) に送信されます。 Kubernetes クラスター内のさまざまなコンポーネントは、この API インターフェースを通じて分離されます。同時に、Kubernetes クラスターの重要かつ便利な管理ツールである kubectl も、この API インターフェースにアクセスすることで強力な管理機能を実装します。

Kubernetes API は、HTTP 経由で提供されるリソースベース (RESTful) プログラミング インターフェイスです。 API は、標準の HTTP 動詞 (POST、PUT、PATCH、DELETE、GET) による主要なリソースの表示、作成、更新、削除をサポートし、きめ細かい権限制御 (Pod をノードにバインドするなど) を可能にする多くのオブジェクトのサブリソースを提供し、利便性や効率性のためにこれらのリソースのさまざまな表現をサポートおよび提供します。

Kubernetes API は、「ウォッチ」と一貫性のあるリストを通じて効率的なリソース変更通知もサポートしており、他のコンポーネントがリソースの状態を効率的にキャッシュして同期できるようにします。

Kubernetes API は分散システムの /proc と連携して動作します。

すべては HTTP ベースです。いくつかの HTTP GET コマンドを使用して、各 Kubernetes リソースを探索できます。

この手順を実行するには、次のツールに精通している必要があります。

  • kind - Dockerコンテナ「ノード」を使用してKubernetesクラスターを実行するためのツール
  • curl - HTTP リクエストを送信するための CLI ツール
  • jq - JSON を解析するための CLI ツール
  • kubectl - Kubernetes クラスターを管理し、curl 認証を支援するコマンド

次に、クラスターを簡単に作成してみましょう。

  1. $ kindクラスターを作成
  2. クラスター「種類」を作成しています...
  3. ✓ ノードイメージの確保 (kindest/node:v1.19.1) 🖼
  4. ✓ ノードを準備中 📦
  5. ✓ 構成の記述 📜
  6. ✓ コントロールプレーンを起動中 🕹️
  7. ✓ CNI のインストール 🔌
  8. ✓ StorageClass のインストール 💾
  9. kubectlコンテキスト設定する  「優しい」  
  10. これで、クラスターを次のように使用できるようになりました
  11.  
  12. kubectl クラスター情報--context の種類 
  13.  
  14. 良い1日! 👋
  15.  
  16. $ kubectl プロキシ &
  17. 127.0.0.1:8001サービス開始

基本的に、kubectl プロキシは、kubernetes apiserver の REST API にアクセスするためのリバース プロキシとして機能します。ここでのリバース プロキシの役割は、アクセス制御、監視、管理のための統一されたエントリの提供、プロキシ内でのバックエンドの管理、プロキシ内での認証の実行など、通常の意味でのリバース プロキシの役割と同じです。

もちろん、kubectl proxy リバースプロキシを経由せずに kubernetes apiserver の REST API に直接アクセスすることもできますが、kubernetes apiserver のアドレスを手動で管理し、トークンを手動で取得し、トークンをリクエスト ヘッダーに手動で追加する必要があり、比較的面倒です。

Kubernetes API には /proc よりも多くの階層があります。バージョン、名前空間、リソース タイプごとにフォルダーに分割されます。 API パスの形式は次のとおりです。

  1. /api/[バージョン]/namespaces/[名前空間]/[リソース]/[名前]

新しい種類のクラスターでは、いくつかの Pod がすでに名前空間 kube-system で実行されていることがわかります。クラスター内のすべてのシステム プロセスを一覧表示してみましょう。

  1. $ curl -s http://localhost:8001/api/v1/namespaces/kube-system/pods |ヘッド-n 20
  2. {
  3. 「種類」 : 「PodList」
  4. 「apiバージョン」 : 「v1」
  5. 「メタデータ」 : {
  6. "selfLink" : "/api/v1/namespaces/kube-system/pods" ,
  7. "リソースバージョン" : "1233"  
  8. },
  9. 「アイテム」 : [
  10. {
  11. 「メタデータ」 : {
  12. 「名前」 : 「coredns-f9fd979d6-5zxtx」
  13. "generateName" : "coredns-f9fd979d6-"
  14. 「名前空間」 : 「kube-system」
  15. 「selfLink」 : 「/api/v1/namespaces/kube-system/pods/coredns-f9fd979d6-5zxtx」
  16. 「uid」 : 「a30e70cc-2b53-4511-a5de-57c80e5b68ad」
  17. "リソースバージョン" : "549"
  18. 「作成タイムスタンプ」 : 「2021-03-04T15:51:21Z」
  19. 「ラベル」 : {
  20. 「k8s-app」 : 「kube-dns」
  21. "ポッドテンプレートハッシュ" : "f9fd979d6"  

上記のコマンドは大量のコンテンツを返します。 jq を使用してオブジェクトの名前を抽出できます。

  1. $ curl -s http://localhost:8001/api/v1/namespaces/kube-system/pods | jq '.items[].metadata.name'  
  2. 「コアdns-f9fd979d6-5zxtx」  
  3. 「コアdns-f9fd979d6-bn6jz」  
  4. 「etcd-kind-コントロールプレーン」  
  5. 「kindnet-fcjkd」  
  6. 「kube-apiserver-kind-コントロールプレーン」  
  7. 「kube-コントローラー-マネージャー-種類-コントロールプレーン」  
  8. 「kube-proxy-sn64n」  
  9. 「kube-scheduler-kind-control-plane」  

/pods は、ls /proc と同様に、すべてのプロセスを一覧表示します。特定のプロセスを確認したい場合は、/pods/POD_NAME をクエリできます。

  1. kube-apiserver-kind をコントロールプレーンに追加します。ヘッド-n 10
  2. {
  3. 「種類」 : 「ポッド」
  4. 「apiバージョン」 : 「v1」
  5. 「メタデータ」 : {
  6. 「名前」 : 「kube-apiserver-kind-control-plane」
  7. 「名前空間」 : 「kube-system」
  8. 「selfLink」 : 「/api/v1/namespaces/kube-system/pods/kube-apiserver-kind-control-plane」
  9. 「uid」 : 「a8f893b7-1cdb-48fd-9505-87d71c81adcb」
  10. "リソースバージョン" : "458"
  11. 「作成タイムスタンプ」 : 「2021-03-04T15:51:17Z」

その後、再度 jq を使用して特定のフィールドを取得できます。

  1. kube-apiserver-kind をコントロールプレーンに追加します。 jq '.status.phase'  
  2. 「ランニング」  

kubectl はどのようにそれを実行しますか?

上記のすべての操作は、基本的に kubectl を使用して完了できます。 Kubectl はより使いやすいインターフェースを提供します。ただし、kubectl がどの API を呼び出しているかを知りたい場合は、次のコマンドに -v 6 を付けて実行できます。

  1. $ kubectl get -v 6 -n kube-system ポッド kube-apiserver-kind-control-plane
  2. I0304 12:47:59.687088 3573879 loader.go:375] ファイルから設定がロードされました: /home/nick/.kube/config
  3. I0304 12:47:59.697325 3573879 round_trippers.go:443] GET https://127.0.0.1:44291/api/v1/namespaces/kube-system/pods/kube-apiserver-kind-control-plane 200 5ミリ秒以内にOK
  4. 名前準備完了 ステータス 再起動 年齢
  5. kube-apiserver-kind-control-plane 1/1 実行中 0 116 分

より高いレベルのデバッグを行うには、-v 8 を使用して完全な応答結果を表示します。

やっと:

この記事のポイントは、kubectl を放棄して curl を使用して Kubernetes と対話することではありません。 ps を捨てて ls /proc だけを使うべきではないのと同じです。

しかし、Kubernetes をこのように分析すると、システムをより深く理解するのに大いに役立つことがわかりました。

  • すべては HTTP ベースです。
  • 各オブジェクトは同じ方法で読み書きされます。
  • すべてのオブジェクトの状態は読み取り可能です。

Unix ツールをパイプで接続できるのと同じように (例: jq)、新しい Kubernetes オブジェクトを定義して、既存のオブジェクトと組み合わせることができます。

これらの方法は少し単純で馬鹿げているように思えるかもしれませんが、最も効果的であることが多いです。

原文: https://blog.tilt.dev/2021/03/18/kubernetes-is-so-simple.html

朱翔

シニアクラウドコンピューティングアーキテクト

OpenStack 公式ゲスト講師

数万のクラウドホストと数十PBの分散ストレージの構築と管理の経験

<<:  テンセントクラウド、中国海外グループ、如英知能が戦略的提携を結び、未来のスマートライフの新しい体験を共同で創造する

>>:  この記事を読んだ後、JVMクラスローディングの仕組みが分からないなんて言わないでくださいね〜

推薦する

ecovm-$3.5/KVM/512m メモリ/5g SSD/500g トラフィック/G ポート

ecovm は設立されてまだ日が浅い VPS ビジネスです。しかし、iwebserver.ca (1...

ウェブサイト広告の設定方法

インターネット上では、ウェブサイト広告、つまりウェブサイトを広告主として立ち上げることによって、数多...

あなただけのブランドロゴを持つ時が来ました!

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています多くのロゴ...

新しいドメイン名の検索エンジンへの登録を高速化する最も包括的な方法

先週、私はa5で「史上最も完全な外部リンクリソース検索方法」という記事を公開し、多くの賞賛を受けまし...

「Baidu 2012 Doomsday」から見る成功したイベントマーケティング

どの業界にもある程度の飽和度があります。業界の飽和度を超えると、現在の SEO のように業界は非常に...

信頼できるオランダのVPSの推奨事項とオランダのサーバーの推奨事項

オランダはヨーロッパのデータセンターの中心地に位置しており、ヨーロッパ全体と非常に友好的な関係を築い...

検索エンジンのランキングに影響を与える要因は何ですか?

検索エンジンにおけるウェブサイトのランキングは、多くの要因によって決まります。すべてをまとめることは...

小紅書ブランドマーケティングの発展を1つの記事で理解する

私たちがよく知っている「リトル・レッド・ブック」が変化しつつあることに気づいているかどうかはわかりま...

マット・カッツ:PRに重点を置かない

Googleはインターネット業界で広まっているリンク取引を懸念し、ページランクの更新を中止したのでし...

クラウドコンピューティングの主なセキュリティリスク

クラウド コンピューティングは新しいものではありません。スケーラビリティ、アクセス性、信頼性などの明...

ヤフー、27億ドルの損害賠償を控訴へ

新浪科技報、北京時間12月4日朝のニュース、ロイター通信は事情に詳しい関係者の話として、ヤフーはメキ...

Google AdSense で収益につながらない無効なクリックの 10 種類について簡単に説明します。

1. 広告をクリックするために特別に設計された自動クリック プログラムまたはアプリケーションを使用す...

インターネットの拡張によく使われる Chrome 拡張機能

Chrome は非常に使いやすいブラウザで、ネットユーザーのさまざまなニーズを満たすことができる拡張...

「IELTSの女王」劉偉はTudou Educationを設立し、英語研修などにも事業を拡大した。

「IELTSの女王」として知られる有名教師の劉偉氏は、自身の教育ブランド「Tudou Educati...

2013年にインターネット業界を揺るがすトップ10のトレンド:クラウドコンピューティングとO2Oがリストに

新たなインターネットの爆発的な普及が起こるたびに、その成功の理由が何度も分析され、成功体験から学ぼう...