k8s (kubernetes) の概要

1. Kubernetes とは何ですか?

Kubernetes は、コンテナ テクノロジーに基づいたまったく新しい分散アーキテクチャ ソリューションであり、Google によってオープンソース化されたコンテナ クラスタ管理システムです。Kubernetes は K8S と呼ばれます。

Kubernetes は、ワンストップの完全な分散システム開発およびサポート プラットフォームであり、オープン プラットフォームでもあるため、既存のプログラミング言語、プログラミング フレームワーク、ミドルウェアに影響を与えません。

Kubernetes は、開発、展開テスト、運用および保守の監視のあらゆる側面をカバーする包括的な管理ツールを提供します。

Kubernetes には、マルチレベルのセキュリティ保護とアクセス メカニズム、マルチテナント アプリケーションのサポート機能、透過的なサービス登録とサービス検出メカニズム、組み込みのインテリジェント ロード バランサ、強力な障害検出と自己修復機能、サービス ローリングなどの完全なクラスタ管理機能があります。アップグレードおよびオンライン拡張機能、スケーラブルな自動リソース スケジューリング メカニズム、および複数粒度のリソース クォータ管理機能。

Kubernetes 公式ドキュメント: Kubernetes

2. Kubernetesの機能

① 自己修復
ノードに障害が発生した場合、障害が発生したコンテナを再起動し、予想されるコピー数を確保するために置き換えと再デプロイを行い、ヘルスチェックに失敗したコンテナを強制終了し、オンライン サービスを保証する準備が整うまでユーザー要求を処理しません。

自動スケーリングは
、コマンド、UI を使用するか、CPU 使用率に基づいてアプリケーション インスタンスを自動的かつ迅速に拡張および縮小し、アプリケーション ビジネスのピークが同時に発生するときに高可用性を確保します。ビジネスのピークが低いときにリソースがリサイクルされ、最小限のコストでサービスを実行します。

自動デプロイメントとロールバック
K8S はローリングアップデート戦略を使用してアプリケーションを更新し、すべての Pod を同時に削除するのではなく、一度に 1 つの Pod を更新します。更新プロセス中に問題が発生した場合、変更は確実にロールバックされます。アップグレードはビジネスには影響しません。

サービス検出と負荷分散
K8S は、複数のコンテナに統合されたアクセス入口 (内部 IP アドレスと DNS 名) を提供し、関連するすべてのコンテナの負荷を分散するため、ユーザーはコンテナ IP の問題を考慮する必要がありません。

機密および構成管理は、
機密データをミラーに公開することなく機密データとアプリケーション構成を管理し、機密データのセキュリティを向上させます。また、一般的に使用される構成の一部を K8S に保存して、アプリケーションの使用を容易にすることができます。

ストレージ オーケストレーションは
、ローカル ストレージ、パブリック クラウド、ネットワーク ストレージのいずれからでも外部ストレージ システムをクラスター リソースの一部としてマウントし、ストレージ使用の柔軟性を大幅に向上させます。

バッチ処理では、
ワンタイムタスクとスケジュールされたタスクが提供され、バッチデータの処理と分析のシナリオに対応します。

3. インフラ図

コアコンポーネント:
• etcd はクラスター全体のステータスとアプリケーションデプロイ情報を保存します;
• Kube-apiserver はリソース操作への唯一の入り口を提供し、認証、認可、アクセス制御、API 登録と検出などのメカニズムを提供します; •
Kube-Controller - マネージャーは、障害検出、自動拡張、ローリング アップデートなど、クラスターのステータスを維持する責任を負います;
• Kube スケジューラーは、リソース スケジューリングを担当し、所定のスケジューリング ポリシーに従って、対応するマシンに Pod をスケジュールします。

kubelet はノードの登録とハートビート送信、アプリケーションのライフサイクル管理、アプリケーションの健全性チェック、CSI ストレージ インターフェイスのドッキング ストレージを担当します;
• コンテナ ランタイムはイメージ管理とポッドとコンテナの実際の操作 (CRI) を担当します;
• kube-proxyサービス公開の実装を担当します。           

: kubelet、コンテナー ランタイム、kube-proxy コンポーネントはマスター ノードにもあります。マスターノードはクラスターを形成することもできます。特定の機能は自分で検索できます。

ノードとポッドは異なる概念であり、ノードは物理マシンまたは仮想マシンであり、ポッドは 1 つ以上のコンテナの集合です。ポッドはノード上で実行でき、1 つのノードで複数のポッドを実行でき、1 つのポッドが複数のノードにわたって実行することもできます。

4. クォータ制限

(1) 資源配分

2 つを設定するには:

request -- リソース要求、limit -- 最大制限。

实例:
 spec:
      containers:
      - name: hostnames
        image: mirrorgooglecontainers/serve_hostname
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 100m
            memory: 100Mi
            
100 millicpu,也就是 0.1 个 CPU 的意思。也可以写成 cpu:0.1;
memory100Mi:1Mi=1024*1024;1M=1000*1000,所以这里就是100MB内存的意思。

質問: 上記の docker-compose の設定と同様に、最大リソース制限の設定で十分であることは当然のことですが、k8s がリクエスト リソースのリクエスト パラメーターを設定する必要があるのはなぜですか?
回答
: 「resources.requests」フィールドでは、ポッドに必要な CPU リソースとメモリ リソースの量を指定できます。Kubernetes スケジューラは、このパラメータに基づいて適切なノードを選択し、ノード上のリソースがポッドのニーズを満たすことができるようにします。このパラメータが設定されていない場合、Kubernetes スケジューラはデフォルトでポッドのリソース要件を 0 に設定します。これにより、リソースが不十分なノードでポッドがスケジュールされる可能性があり、その結果、ポッドのパフォーマンスと安定性に影響を与える可能性があります。
resource.requests フィールドは推奨値にすぎず、Kubernetes スケジューラーはノードにこれらのリソースの提供を強制しないことに注意してください。ノード上のリソースが不十分な場合でも、ポッドのリソースが不足する可能性があります。したがって、resources.requests フィールドを設定する場合は、Pod が正常に実行できるように、実際の状況に応じて適切に設定する必要があります。

(2) リソースのプリエンプション

メモリなどの非圧縮リソースの場合、リソースのプリエンプションが発生すると、優先度に従って Pod がエビクト (クローズ) されます。エビクション戦略は次のとおりです。最初に Request=Limit=0 (BestEffort レベル) の Pod をエビクトし、次に Request !=Limit (バースト可能) をエビクトします。0<Request==Limit を持つポッドは保持されます。

リクエスト設定は CPU スケジューリング タイム スライスを比例的に共有するため、逆にリクエスト値が大きいほど、リソースのプリエンプションが発生したときに各ポッドにより多くの CPU タイム スライスが割り当てられることを意味します。

おすすめ

転載: blog.csdn.net/Mr_wilson_liu/article/details/132567209
おすすめ