Kubernetes入門#5 The pod resource and QoS / Kubernetes Getting Started#5

167bb6000c69456d1875607adb1660f3?s=47 hi-rose
August 29, 2020
32

Kubernetes入門#5 The pod resource and QoS / Kubernetes Getting Started#5

167bb6000c69456d1875607adb1660f3?s=128

hi-rose

August 29, 2020
Tweet

Transcript

  1. Kubernetes Sapporo for Beginners Kubernetes 入門 #5 ~ Podのリソース設定とQoS ~

  2. Kubernetes Sapporo for Beginners 2 自己紹介 廣瀬 亮輔(Ryosuke Hirose) •

    Twitter:@hi_rose39 • アーキテクト部署でバックエンド系基盤機能やインフラ構築等を担当 ◦ 普段GCPメインのため、GKE実装ベースでの理解が中心 • 最近の開発事 ◦ JavaやPythonでREST APIを作ったり ◦ ゴリゴリbash CIを書いたり ◦ TerraformでGCP上に環境構築したり
  3. Kubernetes Sapporo for Beginners このスライドのデモ・動作確認について このスライド内で実施するデモや動作確認は、全て以下に格納されたマニフェストを使用します。 https://github.com/kubernetes-sapporo-for-beginners/hands-on/tree/master/Step6-Pod-Resources 動作確認については、以下の環境で行っております。  GKEVersion: 1.15系

     ノードスペック: e2-highcpu-4(CPU->4Core, MEM->4GB) 注意  resources要素にフォーカスするため、上記マニフェストでは livenessprobe要素など、  運用するにあたってほかに必要となる要素は省略しています。 3
  4. Kubernetes Sapporo for Beginners 本日のテーマ • コンテナのリソース設定の基礎についておさらい ◦ CPU、メモリのRequest、Limit設定 ◦

    設定の有無でのKubernetes上の動き • QoS(Quolity of Service) ◦ QoSのクラス分け ◦ これによるKubernetes上の動きへの影響 これらを把握して運用することで、システム全体の安定度を高めることができます。 4
  5. Kubernetes Sapporo for Beginners コンテナのリソース設定の基礎についておさらい 5 ノード上でPodとして動作する際に、 "コンテナ単位"でCPU,メモリのリソース制御を行うことができます。 ~1/3~ apiVersion:

    apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx ~3/3~ resources: requests: memory: "100Mi" cpu: "200m" limits: memory: "100Mi" cpu: "200m" ~2/3~ template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 CPU: 1=1000m MEM: 1Gi=1000Mi ※CPUはmillicore単位
  6. Kubernetes Sapporo for Beginners コンテナのリソース設定の基礎についておさらい 6 Requests要素では、コンテナがノード上に最低限確保するリソース量を定義します。 Limit要素では、使用可能なリソースの上限を定義します。 Requestsだけ定義することも、 Limitだけ定義することも、まったく定義しないこともできます。

    当然ながら、RequestがLimitをオーバーすることはできません。 @demo#1 両方定義 request cpu:100m memory:100Mi limit cpu:100m memory:200Mi requestのみ定義 request cpu:100m memory:100m limit Limitのみ定義 request limit cpu:200m memory:200m CPUのみ定義 request cpu:100m limit cpu:200m limitをオーバー request cpu:200m memory:200m limit cpu:100m memory:100m
  7. Kubernetes Sapporo for Beginners コンテナのリソース設定の基礎についておさらい 7 Kubernetes上に配置できるノードが存在した場合はそこで起動します。 存在しなかった場合、以下のように Pending状態となり、起動せずに待ち状態となります。 $

    kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-546884bd9b-j8s7g 0/1 Pending 0 14s $ kubectl describe pod nginx-deployment-546884bd9b-j8s7g ~略~ Warning FailedScheduling 53s (x2 over 53s) default-scheduler 0/1 nodes are available: 1 Insufficient memory. @demo#2
  8. Kubernetes Sapporo for Beginners 現在のリソース使用状況の確認方法 8 kubectl describe nodeを実行したり、GKE等のマネージドなクラスタであれば、管理コンソール WEB画面でも参照が

    可能です。 $ kubectl describe node ~略~ Non-terminated Pods: (12 in total) Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE --------- ---- ------------ ---------- --------------- ------------- --- default nginx-deployment-698c64b949-2v9nt 100m (10%) 0 (0%) 0 (0%) 0 (0%) 39m kube-system event-exporter-v0.3.0-5cd6ccb7f7-tjgxt 0 (0%) 0 (0%) 0 (0%) 0 (0%) 62m ~略~ Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 795m (84%) 1312m (139%) memory 830240Ki (28%) 1462048Ki (50%) ephemeral-storage 0 (0%) 0 (0%) attachable-volumes-gce-pd 0 0 ~略~
  9. Kubernetes Sapporo for Beginners もし何も設定していないと・・・? 9 元気にのびのびと育っていきます。 @demo#3

  10. Kubernetes Sapporo for Beginners 設定内容について 10 複数のPodが動作する場面において、リソース指定が未設定だったりアバウトな場合、 所属するノードのスペック上限を超えると PodのEvicted(立ち退き)と再配置が発生するため、 システムが不安定となる要因となります。

    ノード CPU:1000m MEM:2000Mi BBBとCCCのPodが高負荷にな ると再配置が発生し、ほかの ノードへ移動される。 空きノードがなければ、 Pendingとなる。 *Pod-AAA request cpu:300m memory:600Mi limit cpu:300m memory:600Mi *Pod-BBB request cpu:100m memory:200Mi limit cpu:600m memory:1000Mi *Pod-CCC request cpu:100m memory:200Mi limit cpu:600m memory:1000Mi
  11. Kubernetes Sapporo for Beginners QoS Class 11 Request,Limitの内容に応じて、KubernetesがQoS(Quolity of Class)という値をステータスとして設定します。

    ノードリソースが不足し OOMKillerによりPodを停止し、Podの再配置が発生する順位は、 QoSの値によって変わり ます。 したがって停止して欲しくない、安定性が求められる要素については、可能な限り Guaranteedで動作するように 設定したほうがいいです。 QoS Class 設定内容 再配置順位 BestEffort Request,Limitが共に未指定 1 Burstable Request,Limitが何かしら設定され ,ほかの条件に当てはまらない 2 Guaranteed Request,Limitが全て同じ値で設定されている ※CPUとMemory両方にLimitのみが設定されている場合も含(参考:備考) 3
  12. Kubernetes Sapporo for Beginners QoS Class別の設定例 12 resources: resources: requests:

    cpu: "100m" memory: "100Mi" limits: cpu: "200m" memory: "200Mi" resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi" BestEffort Burstable Guaranteed resources: requests: memory: "100Mi" limits: resources: limits: cpu: "100m" memory: "100Mi"
  13. Kubernetes Sapporo for Beginners QoS Classデモ 13 実際にどのように動作するのかを見ていきたいと思います。 • BestEffort,

    Burstable, Guaranteedとなるように設定した deploymentをapplyしてstatusを確認 ◦ 実行前にLimitRangeを削除すること ▪ kubectl delete limitranges --all • ノードのリソース不足時の再配置順序を確認 ◦ 再配置される場合には、もともと起動していた PodはEvicted状態として履歴として残る ◦ 勉強会後追記→このデモは失敗・・・。 @demo#4
  14. Kubernetes Sapporo for Beginners 補足 14 • CPU,メモリ以外の制御項目について ◦ Device

    Plugins を利用することで、GPUやNIC等の他要素を制御することもできます。 • Limit Rangeにより ◦ Podまたはコンテナごとに Request,Limitのデフォルト値を設定可能 ◦ 名前空間ごとに設定が必要 ◦ https://kubernetes.io/ja/docs/concepts/policy/limit-range/ • Resource Quotaにより ◦ Podまたはコンテナごとに Request,Limitの上限値を設定可能 ◦ 名前空間ごとに設定が必要 ◦ https://kubernetes.io/ja/docs/concepts/policy/resource-quotas/