k8s全体のアーキテクチャ

k8s-全体的な概要とアーキテクチャ

1.Kubernetesとは

Kubernetesは、コンテナ化されたアプリケーションとサービスを管理するための軽量で拡張可能なオープンソースプラットフォームです。アプリケーションの自動デプロイとスケーリングは、Kubernetesを介して実行できます。Kubernetesでは、アプリケーションを構成するコンテナが論理ユニットに結合され、管理と検出が容易になります。Kubernetesは、Googleの本番環境としてワークロードを実行して15年の経験を積み、コミュニティから最高のアイデアと実践を吸収してきました。数年の急速な発展の後、Kubernetesは大きな生態環境を形成しました。Googleは2014年にKubernetesをオープンソースプロジェクトとして採用しました。Kubernetesの主な機能は次のとおりです。

  • 自動ボクシング:可用性を犠牲にすることなく、コンテナーのリソース要件と制約に基づいてコンテナーが自動的にデプロイされます。同時に、使用率を改善し、より多くのリソースを節約するために、重要で最適なワークロードが組み合わされます。
  • 自己回復機能:コンテナに障害が発生すると、コンテナが再起動されます。デプロイされたノードノードに問題がある場合、コンテナは再デプロイされ、再スケジュールされます。コンテナが監視チェックに失敗すると、コンテナはシャットダウンされます。コンテナは正常ですサービスは実行中のみ外部に提供されます。
  • 水平拡張:単純なコマンド、ユーザーインターフェイス、またはCPUベースの使用により、アプリケーションを拡張および縮小できます。
  • サービス検出と負荷分散:開発者は、追加のサービス検出メカニズムを使用せずに、Kubernetesに基づいてサービス検出と負荷分散を実行できます。
  • 自動リリースとロールバック:Kubernetesは、アプリケーションと関連する構成をプログラムでリリースできます。リリースに問題がある場合、Kubernetesは発生した変更に戻ることができます。
  • 機密性と構成管理:イメージを再構築する必要なしに、機密性とアプリケーション構成を展開および更新できます。
  • ストレージオーケストレーション:ストレージシステムを自動的に接続します。これらのストレージシステムは、ローカルのパブリッククラウドプロバイダー(例:GCPとAWS)、ネットワークストレージ(例:NFS、iSCSI、Gluster、Ceph、Cinder、Flokerなど)から提供されます。

2.Kubernetesの全体的なアーキテクチャ

 

Kubernetesはマスタースレーブ分散アーキテクチャであり、主にマスターノードとワーカーノード、およびクライアントコマンドラインツールkubectlとその他の追加アイテムで構成されています。

  • マスターノード:制御ノードとして、クラスターのスケジューリングを管理します。マスターノードは、APIサーバー、スケジューラー、クラスター状態ストア、およびコントローラーマネージャーサーバーで構成されます。
  • ワーカーノード:実際のワーカーノードとして、ビジネスアプリケーションを実行するためのコンテナー。ワーカーノードには、kubelet、kubeプロキシ、およびコンテナーランタイムが含まれます。
  • kubectl:コマンドラインを介してAPIサーバーと対話し、Kubernetesを操作して、クラスター内のさまざまなリソースの追加、削除、変更、およびその他の操作を実現するために使用されます。
  • アドオン:ネットワークやネットワーク戦略機能の追加など、Kubernetesのコア機能の拡張です。
  • レプリカは、レプリカの数をスケーリングするために使用されます
  • エンドポイントはネットワークリクエストの管理に使用されます
  • スケジューラー

1.アプリケーションのデプロイを含むymlファイルを準備し、kubectlクライアントツールを介してApiServerに送信します。

2. ApiServerはクライアントの要求を受信し、リソースコンテンツをデータベース(etcd)に保存します。

3.コントローラーコンポーネント(スケジューラー、レプリケーション、エンドポイントを含む)は、リソースの変更を監視して反応します。

4. ReplicaSetはデータベースの変更をチェックし、必要な数のポッドインスタンスを作成します。

5.スケジューラーはデータベースの変更を再度チェックし、ポッドが特定の実行ノード(ノード)に割り当てられていないことを検出し、一連の関連ルールに従ってポッドを実行できるノードにポッドを割り当て、ポッドの割り当てを記録するデータベース。

6. Kubeleteは、データベースの変更を監視し、後続のポッドのライフサイクルを管理し、それが配置されているノードで実行するように割り当てられているポッドを検出します。新しいポッドが見つかった場合、新しいポッドはそのノードで実行されます。

7. kuberproxyは、クラスター内の各ホストで実行され、サービス検出や負荷分散などのネットワーク通信を管理します。たとえば、データがホストに送信されると、正しいポッドまたはコンテナにルーティングされます。ホストから送信されたデータについては、要求されたアドレスに基づいてリモートサーバーを検出し、データを正しくルーティングできます。場合によっては、ラウンドロビンアルゴリズムを使用して、クラスター内の複数のインスタンスに要求を送信します。

 

 

Kubernetesとコンテナエコシステム

 

 

典型的なプロセス

ポッドを作成するプロセス全体、シーケンス図は次のとおりです。


1.ユーザーは、APIサーバーのREST APIまたはJson形式とYaml形式の両方をサポートするKubectlコマンドラインツールを使用して、ポッドを作成するリクエストを送信します。

2. APIサーバーはユーザーリクエストを処理し、ポッドデータをEtcdに保存します。

3.スケジュールは、APIサーバーの監視メカニズムを介して新しいポッドをチェックし、ノードをポッドにバインドしようとします。

4.ホストのフィルター処理:スケジューラーは一連のルールを使用して、要件を満たさないホストをフィルターで除外します。たとえば、ポッドが必要なリソースを指定する場合、リソースが不十分なホストをフィルターで除外する必要があります。

5.ホストスコアリング:最初のステップで選択した要件を満たすホストをスコアリングします。ホストスコアリング段階で、スケジューラーは、最小の負荷を使用して、レプリケーションコントローラーのコピーを別のホストに配布するなど、いくつかの全体的な最適化戦略を検討します。ホストなど;

6.ホストを選択します。スコアが最も高いホストを選択し、バインド操作を実行して、結果をEtcdに保存します。

7. kubeletは、スケジューリング結果に従ってポッド作成操作を実行します。バインドが成功すると、コンテナーが開始され、Dockerが実行され、スケジューラーがAPI Server APIを呼び出して、etcdにバインドされたポッドオブジェクトを作成します。ワーカーノードのポッド情報をバインドして実行します。各ワーカーノードで実行されているkubeletは、バインドされたポッド情報をetcdと定期的に同期します。ワーカーノードで実行されているはずのバインドされたポッドオブジェクトが更新されていないことが判明すると、DockerAPIを呼び出して作成して開始します。ポッド内のコンテナ。

2マスターノード

2.1 APIサーバー(APIサーバー)

API Serverは主に、REST操作の処理、それらの有効化の確認、関連するビジネスロジックの実行、およびetcd(または他のストレージ)内の関連オブジェクトの更新に使用されます。APIサーバーはすべてのRESTコマンドのエントリポイントであり、関連する結果ステータスはetcd(または他のストレージ)に保存されます。APIサーバーの基本機能は次のとおりです。

  • RESTセマンティクス、監視、永続性と一貫性の保証、APIバージョン管理、放棄と検証
  • 組み込みのアドミッション制御セマンティクス、同期アドミッション制御フック、および非同期リソース初期化
  • APIの登録と検出

さらに、APIサーバーはクラスターへのゲートウェイとしても機能します。デフォルトでは、クライアントはAPIサーバーを介してクラスターにアクセスします。クライアントは認証に合格し、ノードとポッド(およびサービス)にアクセスするための要塞およびプロキシ/チャネルとしてAPIサーバーを使用する必要があります。

2.2クラスター状態ストア(クラスター状態ストア)

Kubernetesは、デフォルトでクラスターの全体的なストレージとしてetcdを使用します。もちろん、他のテクノロジーも使用できます。etcdは、シンプルで分散された一貫性のあるKey-Valueストアであり、主に共有構成とサービス検出に使用されます。etcdは、CRUD操作用のREST APIと、指定されたノードを監視するための登録済みインターフェースを提供します。クラスターのすべてのステータスはetcdインスタンスに保存され、監視する機能があるため、etcdの情報が変更された場合、クラスター内の関連するコンポーネントにすばやく通知できます。

2.3コントローラー-マネージャーサーバー(制御管理サーバー)

Controller-Manager Serveは、クラスターレベルの機能のほとんどを実行するために使用されます。ライフサイクル機能(名前空間の作成とライフサイクル、イベントガベージコレクション、終了したガベージコレクション、カスケード削除ガベージコレクション、ノードガベージコレクションなど)も実行します。 APIビジネスロジックを実行します(例:ポッドのエラスティック拡張)。制御管理は、自己修復機能、容量拡張、アプリケーションライフサイクル管理、サービスディスカバリ、ルーティング、サービスバインディング、およびプロビジョニングを提供します。Kubernetesは、レプリケーションコントローラー、ノードコントローラー、名前空間コントローラー、サービスコントローラー、エンドポイントコントローラー、永続コントローラー、デーモンセットコントローラー、およびその他のコントローラーをデフォルトで提供します。

2.4スケジューラー(スケジューラー)

スケジューラコンポーネントは、コンテナが実行されているホストを自動的に選択します。要求されたリソースの可用性やサービス要求の品質などの制約に従って、スケジューラーはバインドされていないポッドを監視し、それらを特定のノードノードにバインドします。Kubernetesは、ユーザーが提供するスケジューラもサポートします。スケジューラは、スケジューリング戦略に従って、ポッドを適切なノードに自動的にデプロイする責任があります。スケジューリング戦略は、事前に選択された戦略と優先戦略に分けられます。ポッドのスケジューリングプロセス全体2つのステップに分かれています:

1)ノードの事前選択:クラスター内のすべてのノードをトラバースし、特定の事前選択戦略に従って要件を満たすノードのリストをフィルターで除外します。事前に選択されたポリシールールを満たすノードがない場合、要件を満たすノードがクラスターに表示されるまでポッドは一時停止されます。

2)優先ノード:事前に選択されたノードリストに基づいて、最適なノードを取得するための優先戦略に従って、選択されるノードをスコアリングおよびソートします。

3.ワーカーノード(スレーブノード)

3.1クベレット

KubeletはKubernetesで最も重要なコントローラーであり、ポッドおよびノー​​ドAPIのメイン実装者です。Kubeletはコンテナー実行レイヤーの駆動を担当します。Kubernetesでは、アプリケーションコンテナは相互に、およびそれらを実行するホストから分離されています。これは、アプリケーションの独立したデカップリング管理の重要なポイントです。

Kubernetsでは、ポッドが基本的な実行ユニットです。ポッドは複数のコンテナとストレージデータボリュームを持つことができます。各コンテナに単一のアプリケーションを便利にパッケージ化できるため、アプリケーションの構築とデプロイの際の懸念を解消できます。、移行を容易にすることができました。物理マシン/仮想マシン間。APIアドミッションコントロールは、ポッドを拒否またはポッドするか、ポッドにスケジュール制約を追加できますが、Kubeletは、ポッドがスケジューラやDaemonSetではなく、特定のノードで実行できるかどうかの最終的な決定者です。デフォルトでは、kubeletはリソースの監視にcAdvisorを使用します。ポッド、コンテナ、イメージ、データボリュームなどを管理して、ノードのクラスタ管理を実現し、コンテナの実行ステータスをKubernetesAPIサーバーに報告します。

3.2コンテナランタイム(コンテナランタイム)

各ノードはコンテナランタイムを実行します。コンテナランタイムは、イメージのダウンロードとコンテナの実行を担当します。Kubernetes自体はコンテナランタイム環境を停止しませんが、選択したコンテナランタイム環境に挿入できるインターフェースを提供します。kubeletは、Unixソケット上のgRPCフレームワークを使用して、コンテナーランタイム、クライアントとしてkubelet、サーバーとしてCRIShimと通信します。

プロトコルバッファAPIは、ImageServiceとRuntimeServiceの2つのgRPCサービスを提供します。ImageServiceは、画像をプル、表示、および削除するためのRPCを提供します。RuntimeSerivceは、ポッドとコンテナーのライフサイクル管理を管理し、コンテナーと対話するためのRPCを提供します(exec / attach / port-forward)。コンテナーランタイムは、イメージとコンテナー(DockerとRktなど)を同時に管理でき、同じソケットを介してこれら2つのサービスを提供できます。Kubeletでは、このソケットは–container -runtime -endpointフィールド–image-service-endpointフィールドを介して設定されます。Kubernetes CRIでサポートされているコンテナランタイムには、docker、rkt、cri-o、frankti、kata-containers、clear-containersが含まれます。

3.3kubeプロキシ

パブリックアクセス戦略(例:負荷分散)に基づいて、サービスはポッドのグループにアクセスする方法を提供します。この方法は、仮想IPを作成することで実現され、クライアントはこのIPにアクセスでき、サービスをポッドに透過的にプロキシできます。各ノードはkube-proxyを実行します。kubeproxyはiptablesルールを介してサービスIPへのアクセスをガイドし、正しいバックエンドアプリケーションにリダイレクトします。このようにして、kube-proxyは高可用性の負荷分散ソリューションを提供します。サービスディスカバリは、主にDNSを介して実現されます。

Kubernetesでは、kubeプロキシは、ポッドのプロキシサービスの作成、サービスへのアクセスの誘導、サービスからポッドへのルーティングと転送の実装、アプリケーションを介した負荷分散を担当します。

3、kubectl

kubectlは、Kubernetesクラスターのコマンドラインインターフェースです。kubectlコマンドを実行するための構文は次のとおりです。

$ kubectl [コマンド] [タイプ] [名前] [フラグ]

ここでのコマンド、TYPE、NAME、およびフラグは次のとおりです。

  • comand:作成、取得、説明、削除など、リソースに対して実行する操作を指定します
  • TYPE:リソースタイプを指定します。リソースタイプはサイズに依存します。開発者は、単数形、複数形、および省略形を使用できます。例えば:
$ kubectl get pod pod1 
$ kubectl get pods pod1  
$ kubectl get po pod1
  • NAME:リソースの名前を指定します。名前でも大文字と小文字が区別されます。名前を省略すると、次のようにすべてのリソースが表示されます。
 $ kubectlはポッドを取得します
  • フラグ:オプションのパラメーターを指定します。たとえば、-sまたは-serverパラメータを使用して、KubernetesAPIサーバーのアドレスとポートを指定できます。

さらに、kubectl helpコマンドを実行すると、より多くの情報を取得できます。

4追加のアイテムとその他の依存関係

Kunbernetesでは、Kubernetesの機能を追加アイテムの形で拡張できます。現在、追加アイテムには、ネットワーク、サービスディスカバリ、視覚化の3つの主要なタイプがあります。利用可能な追加アイテムの一部を次に示します。

4.4.1ネットワークとネットワーク戦略

  • ACIは、CiscoACIと統合されたコンテナネットワーキングとネットワークセキュリティを使用します。
  • Calicoは、安全な3層ネットワークおよびネットワークポリシープロバイダーです。
  • Canalは、ネットワークとネットワーク側を介してFannelとCalicoを統合します。
  • Ciliumは、3層ネットワークおよびネットワーク側プラグインであり、HTTP / API / L7戦略を透過的に強化できます。ルーティングとオーバーレイ/カプセル化モードをサポートします。
  • Flannelはオーバーレイネットワークプロバイダーです。

4.4.2サービスディスカバリ

  • CoreDNSは、柔軟で拡張可能なDNSサーバーであり、ポッドクラスターにDNSとしてインストールできます。
  • Ingressは、Httpプロトコルに基づくルーティングおよび転送メカニズムを提供します。

4.4.3視覚化と制御

  • ダッシュボードは、Kubernetesのウェブユーザーインターフェースです。

おすすめ

転載: blog.csdn.net/qq_42533216/article/details/114115630
おすすめ