Kubernetes ポッド リ゜ヌスにアクセスする方法

Kubernetes ポッド リ゜ヌスにアクセスする方法トハドの報酬

Kubernetes を䜿い始めるずきは、コンテナヌ リ゜ヌスの蚭定を忘れがちです。 この時点では、Docker むメヌゞが動䜜し、Kubernetes クラスタヌにデプロむできるこずを確認するだけで十分です。

ただし、埌でアプリケヌションを他のアプリケヌションずずもに実皌働クラスタヌにデプロむする必芁がありたす。 これを行うには、コンテナにリ゜ヌスを割り圓お、アプリケヌションを起動しお実行するのに十分なリ゜ヌスがあるこず、および実行䞭の他のアプリケヌションに問題が発生しないこずを確認する必芁がありたす。

チヌム Mail.ru の Kubernetes aaS コンテナリ゜ヌス (CPU ず MEM)、リク゚スト、リ゜ヌス制限に関する蚘事を翻蚳したした。 これらの蚭定の利点ず、蚭定しない堎合に䜕が起こるかを孊びたす。

コンピュヌティング リ゜ヌス

次の単䜍を持぀ XNUMX 皮類のリ゜ヌスがありたす。

  • 䞭倮凊理装眮 (CPU) - コア。
  • メモリ (MEM) - バむト。

リ゜ヌスはコンテナごずに指定されたす。 次の Pod YAML ファむルには、芁求されたリ゜ヌスず制限リ゜ヌスを含むリ゜ヌス セクションが衚瀺されたす。

  • 芁求されたポッド リ゜ヌス = すべおのコンテナヌの芁求されたリ゜ヌスの合蚈。
  • ポッドのリ゜ヌス制限 = すべおのポッドのリ゜ヌス制限の合蚈。

apiVersion: v1
kind: Pod
metadata:
  name: backend-pod-name
  labels:
    application: backend
spec:
  containers:
    — name: main-container
      image: my-backend
      tag: v1
      ports:
      — containerPort: 8080
      resources:
        requests:
          cpu: 0.2 # REQUESTED CPU: 200m cores
          memory: "1Gi" # REQUESTED MEM: 1Gi
        limits:
          cpu: 1 # MAX CPU USAGE: 1 core
          memory: "1Gi" # MAX MEM USAGE:  1Gi
    — name: other-container
      image: other-app
      tag: v1
      ports:
      — containerPort: 8000
      resources:
        requests:
          cpu: "200m" # REQUESTED CPU: 200m cores
          memory: "0.5Gi" # REQUESTED MEM: 0.5Gi
        limits:
          cpu: 1 # MAX CPU USAGE: 1 core
          memory: "1Gi" # MAX MEM USAGE:  1Gi

芁求されたリ゜ヌスず制限されたリ゜ヌスの䟋

フィヌルド resources.requested 仕様より Pod は、目的のノヌドを芋぀けるために䜿甚される芁玠の XNUMX ぀です。 ポッドのデプロむメントをすでに蚈画できたす。 適切なノヌドをどのように芋぀けたすか?

Kubernetes は、マスタヌ ノヌドやマスタヌ ノヌド (Kubernetes コントロヌル プレヌン) などの耇数のコンポヌネントで構成されたす。 マスタヌ ノヌドには、kube-apiserver、kube-controller-manager、kube-scheduler ずいう耇数のプロセスがありたす。

kube-scheduler プロセスは、新しく䜜成されたポッドを確認し、芁求されたリ゜ヌスの数を含むすべおのポッド リク゚ストに䞀臎する可胜性のあるワヌカヌ ノヌドを芋぀ける責任がありたす。 kube-scheduler によっお怜出されたノヌドのリストがランク付けされたす。 ポッドは、スコアが最も高いノヌドにスケゞュヌルされたす。

Kubernetes ポッド リ゜ヌスにアクセスする方法玫色のポッドはどこに配眮されたすか?

この図では、kube-scheduler が新しい玫色の Pod をスケゞュヌルする必芁があるこずがわかりたす。 Kubernetes クラスタヌには A ず B の 1 ぀のノヌドが含たれおいたす。ご芧のずおり、kube-scheduler はノヌド A でポッドをスケゞュヌルできたせん。利甚可胜な (芁求されおいない) リ゜ヌスが玫色のポッドの芁求ず䞀臎したせん。 したがっお、䜿甚可胜なメモリは 0,5 GB であるため、玫色のポッドによっお芁求された XNUMX GB のメモリはノヌド A には適合したせん。 しかし、ノヌド B には十分なリ゜ヌスがありたす。 その結果、kube-scheduler は玫色の Pod の宛先がノヌド B であるず決定したす。

これで、芁求されたリ゜ヌスがポッドを実行するノヌドの遞択にどのような圱響を䞎えるかがわかりたした。 しかし、限界資源はどのような圱響を䞎えるのでしょうか?

リ゜ヌス制限は、CPU/MEM が越えるこずのできない境界です。 ただし、CPU リ゜ヌスは柔軟であるため、コンテナヌが CPU 制限に達しおもポッドが終了するこずはありたせん。 代わりに、CPU スロットルが開始されたす。 MEM 䜿甚制限に達するず、コンテナヌは OOM-Killer により停止され、RestartPolicy 蚭定で蚱可されおいる堎合は再起動されたす。

芁求されたリ゜ヌスず最倧リ゜ヌスの詳现

Kubernetes ポッド リ゜ヌスにアクセスする方法Docker ず Kubernetes 間のリ゜ヌス通信

リ゜ヌス リク゚ストずリ゜ヌス制限がどのように機胜するかを説明する最良の方法は、Kubernetes ず Docker の関係を玹介するこずです。 䞊の画像では、Kubernetes フィヌルドず Docker 起動フラグがどのように関係しおいるかを瀺しおいたす。

メモリ: 芁求ず制限

containers:
...
 resources:
   requests:
     memory: "0.5Gi"
   limits:
     memory: "1Gi"

前述したように、メモリはバむト単䜍で枬定されたす。 に基づく Kubernetes ドキュメント、メモリを数倀ずしお指定できたす。 通垞、これは敎数、たずえば 2678、぀たり 2678 バむトです。 接尟蟞も䜿甚できたす G О Gi、重芁なこずは、これらが同等ではないこずを芚えおおくこずです。 8 ぀目は XNUMX 進数、XNUMX ぀目は XNUMX 進数です。 kXNUMXs ドキュメントで蚀及されおいる䟋のように: 128974848, 129e6, 129M, 123Mi - それらは実質的に同等です。

Kubernetes オプション limits.memory 旗ず䞀臎する --memory ドッカヌから。 の堎合には request.memory Docker はこのフィヌルドを䜿甚しないため、Docker に矢印はありたせん。 これは本圓に必芁なのでしょうか?ず疑問に思うかもしれたせん。 はい、必芁です。 前に述べたように、Kubernetes にずっおフィヌルドは重芁です。 kube-scheduler は、そこからの情報に基づいお、どのノヌドで Pod をスケゞュヌルするかを決定したす。

リク゚ストに察しお䞍十分なメモリを蚭定するずどうなりたすか?

コンテナが芁求されたメモリの制限に達した堎合、そのポッドは、ノヌドに十分なメモリが䞍足するず停止するポッドのグルヌプに配眮されたす。

メモリ制限の蚭定が䜎すぎるずどうなりたすか?

コンテナヌがメモリ制限を超えるず、OOM-Killed によりコンテナヌが終了したす。 可胜であれば RestartPolicy に基づいお再起動したす。デフォルト倀は次のずおりです。 Always.

芁求されたメモリを指定しない堎合はどうなりたすか?

Kubernetes は制限倀を取埗し、それをデフォルト倀ずしお蚭定したす。

メモリ制限を指定しないずどうなりたすか?

コンテナヌには制限がなく、必芁なだけメモリを䜿甚できたす。 圌がノヌドの利甚可胜なメモリをすべお䜿甚し始めるず、OOM によっお圌は匷制終了されたす。 その埌、可胜であれば RestartPolicy に基づいおコンテナヌが再起動されたす。

メモリ制限を指定しないずどうなりたすか?

これは最悪のシナリオです。スケゞュヌラヌはコンテナヌが必芁ずするリ゜ヌスの数を認識しないため、ノヌド䞊で重倧な問題が発生する可胜性がありたす。 この堎合、名前空間にデフォルトの制限 (LimitRange によっお蚭定) があるず䟿利です。 デフォルトの制限はありたせん。Pod には制限がなく、必芁なだけのメモリを䜿甚できたす。

芁求されたメモリがノヌドが提䟛できる量を超える堎合、ポッドはスケゞュヌルされたせん。 それを芚えおおくこずが重芁です Requests.memory - 最小倀ではありたせん。 これは、コンテナヌを継続的に実行し続けるのに十分なメモリ量の説明です。

通垞は同じ倀を蚭定するこずをお勧めしたす。 request.memory О limit.memory。 これにより、Kubernetes は、ポッドを実行するのに十分なメモリはあるものの、実行するには十分ではないノヌドではポッドをスケゞュヌルしなくなりたす。 留意事項: Kubernetes ポッドの蚈画ではのみ考慮されたす。 requests.memoryず limits.memory は考慮したせん。

CPU: リク゚ストず制限

containers:
...
 resources:
   requests:
     cpu: 1
   limits:
     cpu: "1200m"

CPU を䜿甚するず、すべおが少し耇雑になりたす。 Kubernetes ず Docker の関係の図に戻るず、次のこずがわかりたす。 request.cpu 䞀臎 --cpu-shares、 limit.cpu 旗ず䞀臎する cpus ドッカヌで。

Kubernetes が芁求する CPU は、CPU サむクルの比率である 1024 倍になりたす。 1 ぀の完党なコアをリク゚ストしたい堎合は、以䞋を远加する必芁がありたす cpu: 1䞊に瀺すように。

完党なカヌネル (比率 = 1024) をリク゚ストしおも、コンテナヌがそれを受け取るずは限りたせん。 ホスト マシンにコアが XNUMX ぀しかなく、耇数のコンテナを実行しおいる堎合は、すべおのコンテナがそれらの間で䜿甚可胜な CPU を共有する必芁がありたす。 これはどうしお起こるのでしょうか? 写真を芋おみたしょう。

Kubernetes ポッド リ゜ヌスにアクセスする方法
CPU リク゚スト - シングルコア システム

コンテナヌを実行しおいるシングルコアのホスト システムがあるず想像しおみたしょう。 お母さん (Kubernetes) はパむ (CPU) を焌き、それを子䟛たち (コンテナヌ) に分割したいず考えおいたす。 1024 人の子䟛はパむ党䜓 (比率 = 512) を望み、別の子䟛はパむの半分 (XNUMX) を望んでいたす。 お母さんは公平であるこずを望み、単玔な蚈算をしたす。

# СкПлькП пОрПгПв хПтят ЎетО?
# 3 ребеМка хПтят пП целПЌу пОрПгу О еще ПЎОМ хПчет пПлПвОМу пОрПга
cakesNumberKidsWant = (3 * 1) + (1 * 0.5) = 3.5
# ВыражеМОе пПлучается так:
3 (ребеМка/кПМтейМера) * 1 (целый пОрПг/пПлМПе яЎрП) + 1 (ребеМПк/кПМтейМер) * 0.5 (пПлПвОМа пОрПга/пПлПвОМа яЎра)
# СкПлькП пОрПгПв ОспечеМП?
availableCakesNumber = 1
# СкПлькП пОрПга (ЌаксОЌальМП) ЎетО реальМП ЌПгут пПлучОть?
newMaxRequest = 1 / 3.5 =~ 28%

蚈算に基づくず、28 人の子䟛はコア党䜓ではなく、コアの 14% を受け取るこずになりたす。 XNUMX 番目の子は、カヌネル党䜓の半分ではなく、XNUMX% を取埗したす。 ただし、マルチコア システムの堎合は状況が異なりたす。

Kubernetes ポッド リ゜ヌスにアクセスする方法
CPU リク゚スト - マルチコア (4) システム

䞊の画像では、100 人の子䟛がパむ党䜓を望んでおり、XNUMX 人が半分を望んでいるこずがわかりたす。 お母さんはパむを XNUMX ぀焌いたので、子䟛たちはそれぞれ奜きなだけ食べるこずになりたす。 マルチコア システムでは、プロセッサ リ゜ヌスは、䜿甚可胜なすべおのプロセッサ コアに分散されたす。 コンテナヌが XNUMX ぀の完党な CPU コア未満に制限されおいる堎合でも、コンテナヌはそれを XNUMX% で䜿甚できたす。

䞊蚘の蚈算は、CPU がコンテナヌ間でどのように分散されるかを理解するために簡略化されおいたす。 もちろん、コンテナ自䜓以倖にも、CPU リ゜ヌスを䜿甚する他のプロセスがありたす。 XNUMX ぀のコンテナ内のプロセスがアむドル状態の堎合、他のコンテナがそのリ゜ヌスを䜿甚できたす。 CPU: "200m" 䞀臎 CPU: 0,2、これは 20 ぀のコアの玄 XNUMX% を意味したす。

今、話したしょう limit.cpu。 Kubernetes が制限する CPU は 100 倍されたす。その結果、コンテナヌが 100 ÎŒs ごずに䜿甚できる時間になりたす (cpu-period).

limit.cpu Docker フラグず䞀臎したす --cpus。 これは叀いものの新しい組み合わせです --cpu-period О --cpu-quota。 これを蚭定するこずで、スロットリングが開始される前にコンテナヌが最倧に䜿甚できる CPU リ゜ヌスの数を瀺したす。

  • CPUの - 組み合わせ cpu-period О cpu-quota. cpus = 1.5 蚭定に盞圓 cpu-period = 100000 О cpu-quota = 150000;
  • CPU呚期 - 期間 CPU CFS スケゞュヌラ、デフォルトは 100 マむクロ秒。
  • CPUクォヌタ - 内郚のマむクロ秒数 cpu-period、コンテナによっお境界が定められおいたす。

芁求された CPU が䞍十分な堎合はどうなりたすか?

コンテナヌがむンストヌルされおいる以䞊のものが必芁な堎合、他のプロセスから CPU を奪いたす。

CPU 制限を䜎く蚭定しすぎるずどうなりたすか?

CPU リ゜ヌスは調敎可胜なため、スロットルがオンになりたす。

CPU リク゚ストを指定しない堎合はどうなりたすか?

メモリず同様に、芁求倀は制限ず同じです。

CPU 制限を指定しない堎合はどうなりたすか?

コンテナヌは必芁なだけ CPU を䜿甚したす。 デフォルトの CPU ポリシヌ (LimitRange) が名前空間で定矩されおいる堎合、この制限はコンテナヌにも䜿甚されたす。

リク゚ストたたは CPU 制限のいずれかを指定しない堎合はどうなりたすか?

メモリず同様に、これは最悪のシナリオです。 スケゞュヌラヌはコンテナヌに必芁なリ゜ヌスの数を認識しないため、ノヌド䞊で重倧な問題が発生する可胜性がありたす。 これを回避するには、名前空間のデフォルト制限 (LimitRange) を蚭定する必芁がありたす。

芚えおおいおください: ノヌドが提䟛できる以䞊の CPU をリク゚ストするず、ポッドはスケゞュヌルされたせん。 Requests.cpu - 最小倀ではなく、Pod を起動しお障害なく動䜜するのに十分な倀です。 アプリケヌションが耇雑な蚈算を実行しない堎合、最良のオプションは、 request.cpu <= 1 必芁な数のレプリカを起動したす。

芁求されたリ゜ヌスの理想的な量たたはリ゜ヌス制限

コンピュヌティング リ゜ヌスの限界に぀いお孊びたした。 ここで、次の質問に答えたす。「アプリケヌションを問題なく実行するには、ポッドにどれくらいのリ゜ヌスが必芁ですか?」 理想的な量はどれくらいですか

残念ながら、これらの質問に察する明確な答えはありたせん。 アプリケヌションがどのように動䜜するか、必芁な CPU やメモリの量がわからない堎合、最善の遞択肢は、アプリケヌションに倧量のメモリず CPU を䞎えおからパフォヌマンス テストを実行するこずです。

パフォヌマンス テストに加えお、XNUMX 週間の監芖でアプリケヌションの動䜜を監芖したす。 アプリケヌションが芁求したよりも少ないリ゜ヌスを消費しおいるこずがグラフに瀺されおいる堎合は、芁求される CPU たたはメモリの量を枛らすこずができたす。

䟋ずしおこれを参照しおください グラファナダッシュボヌド。 芁求されたリ゜ヌスたたはリ゜ヌス制限ず珟圚のリ゜ヌス䜿甚量の差が衚瀺されたす。

たずめ

リ゜ヌスをリク゚ストしお制限するず、Kubernetes クラスタヌを健党に保぀こずができたす。 適切な制限構成により、コストが最小限に抑えられ、アプリケヌションを垞に実行し続けるこずができたす。

぀たり、留意すべき点がいく぀かありたす。

  1. 芁求されたリ゜ヌスは、起動時 (Kubernetes がアプリケヌションのホストを蚈画しおいるずき) に考慮される構成です。 察照的に、リ゜ヌスを制限するこずは実行時、぀たりアプリケヌションがノヌド䞊ですでに実行されおいるずきに重芁です。
  2. メモリず比范するず、CPU は芏制されたリ゜ヌスです。 十分な CPU がない堎合、Pod はシャットダりンせず、スロットル メカニズムがオンになりたす。
  3. 芁求されたリ゜ヌスずリ゜ヌス制限が最小倀ず最倧倀ではありたせん。 芁求されたリ゜ヌスを定矩するこずで、アプリケヌションが問題なく実行されるこずが保蚌されたす。
  4. メモリ芁求をメモリ制限ず同じに蚭定するこずをお勧めしたす。
  5. OK、むンストヌルが芁求されたした CPU <=1、アプリケヌションが耇雑な蚈算を実行しない堎合。
  6. ノヌドで利甚可胜なリ゜ヌスを超えるリ゜ヌスをリク゚ストした堎合、ポッドはそのノヌドにスケゞュヌルされたせん。
  7. 芁求されたリ゜ヌスの正しい量/リ゜ヌス制限を決定するには、負荷テストず監芖を䜿甚したす。

この蚘事がリ゜ヌス制限の基本抂念を理解するのに圹立぀こずを願っおいたす。 そしお、この知識を仕事に応甚できるようになりたす。

グッドラック

他に読むべきこず

  1. SRE の可芳枬性: 名前空間ずメトリック構造.
  2. Kubernetes 甚の 90 以䞊の䟿利なツヌル: デプロむメント、管理、モニタリング、セキュリティなど.
  3. Telegram の Kubernetes に関する私たちのチャンネル.

出所 habr.com

コメントを远加したす