K8S サービス品質 QoS —— 夢を実現する道

K8S のアプリケーションのサービス品質 (QoS) の概要

Quality of Service (QoS) クラスは、Pod のスケジューリングとエビクションの優先順位を決定する Kubernetes の概念です。

Kubelet はこれを使用して、ポッドが削除される順序を管理するだけでなく、高度な CPU 管理戦略を使用してより複雑なポッドのスケジューリング決定を可能にします。

QoS は Kubernetes 自体によって Pod に割り当てられます。ただし、DevOps は、ポッド内の個々のコンテナに対するリソースのリクエストと制限を処理することで、コンテナに割り当てられた QoS クラスを制御できます。

QoSクラスの分類

  • 保証: POD 内のすべてのコンテナー (初期化コンテナーを含む) には制限が均一に設定されている必要があり、設定パラメーターは一貫しています。

  • バースタブル: POD 内にメモリまたは CPU リクエストが設定されたコンテナがあります。

  • BestEffort: POD 内のすべてのコンテナーでは、CPU とメモリのリクエストと制限が指定されていません。

Guaranteed
对于 QoS 类为 Guaranteed 的 Pod:

Pod 中的每个容器,包含初始化容器,必须指定内存 请求和 内存 限制,并且两者要相等。

Pod 中的每个容器,包含初始化容器,必须指定 CPU 请求和 CPU 限制,并且两者要相等。

举例:
apiVersion: v1
kind: Pod
metadata:
name: qos-demo
spec:
containers:
- name: qos-demo
  image: nginx
  resources:
    limits:
      memory: "500Mi"
      cpu: "700m"
    requests:
      memory: "500Mi"
      cpu: "700m"

注意点:

如果容器指定了自己的内存limits,但没有指定内存requests,Kubernetes 会自动为它指定与内存limits匹配的内存requests。 同样,如果容器指定了自己的 CPU limits,但没有指定 CPU requests,Kubernetes 会自动为它指定与 CPU limits匹配的 CPU requests;

------------------------------------------------------------------------------

Burstable
如果满足下面条件,将会指定 Pod 的 QoS 类为 Burstable:

Pod 不符合 Guaranteed QoS 类的标准;

Pod 中至少一个容器具有内存 或 CPU requests;

举例:

apiVersion: v1
kind: Pod
metadata:
name: qos-demo2
spec:
containers:
- name: qos-demo2
  image: nginx
  resources:
    limits:
      memory: "500Mi"
    requests:
      memory: "200Mi"


--------------------------------------------------------------------------

BestEffort
对于 QoS 类为 BestEffort 的 Pod,Pod 中的容器必须没有设置内存和 CPU 限制或请求。

举例:

apiVersion: v1
kind: Pod
metadata:
name: qos-demo3
spec:
containers:
- name: qos-demo3
  image: nginx

如何查看Qos

kubectl describe po qos-demo

QoS優先度

3 つの QoS 優先順位 (左から右):

BestEffort ポッド -> バースト可能なポッド -> 保証されたポッド

追放の原則

圧縮可能なリソース: CPU

圧縮リソースのセクションで説明したように、CPU は圧縮可能なリソースであり、ポッドの使用率が設定された制限値を超えると、ポッド内のプロセスの CPU 使用率は制限されますが、強制終了されることはありません。

非圧縮リソース:メモリ

ノードが OOM の場合、保証型ポッド、バースタブル ポッド、ベストエフォート ポッドに対処するにはどうすればよいですか? 

Kubelet がリサイクルできる前にノードのメモリが不足した場合、つまりノード oom が発生した場合、oom_killer はその oom_score に従ってコンテナを終了します。

「保証された」ポッド内のコンテナの oom_score_adj は「-998」です。

「BestEffort」ポッド内のコンテナーの場合、これは「1000」です。

「min(max(2, 1000-(1000*memoryRequestBytes)/machineMemoryCapacityBytes), 999」) の値を持つ Burstable Pod 内のコンテナー。

oom_killer はまず、QoS レベルが最も低く、最も要求されたリソースを超えるコンテナを終了します。これは、あまりにも多くのリソース リクエストを占有するコンテナが、エビクションのために最初に Burstable から選択されることを意味します。

ベストプラクティス

  • 1. アプリケーションの種類による分類: コアアプリケーション (core) / 従来アプリケーション (nomarl) / 追加アプリケーション (extral)

  • 2. コアアプリケーション: 保証型 / 通常アプリケーション: Burstable / 追加アプリケーション: BestEffort

  • 3. クラスタ ノードは、コア アプリケーション ノード/通常のアプリケーション ノード/追加アプリケーション ノードに分割されます。

  • 4. スケジュール戦略:

    • コア アプリケーション:nodeAffinity の優先スケジューリング戦略を採用することで、コア ノードにスケジュールできます。

    • 通常のアプリケーション:nodeAffinity のハード アフィニティ スケジューリング戦略を使用して、通常のノードにスケジュールできます。

    • 追加のアプリケーション:nodeAffinity のハード アフィニティ スケジューリング戦略を使用して、追加のノードにスケジュールできます。

おすすめ

転載: blog.csdn.net/qq_34777982/article/details/130949805