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

Tohadによる報酬



Kubernetesを䜿い始めるずき、コンテナリ゜ヌスの構成を忘れるこずがよくありたす。この時点で、Dockerむメヌゞが機胜しおいお、Kubernetesクラスタヌにデプロむできるこずを確認する必芁がありたす。



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



のKubernetesaaSチヌムは、コンテナリ゜ヌスCPUずMEM、リク゚スト、およびリ゜ヌス制限に関する蚘事を翻蚳したした。これらの蚭定の利点ず、それらをむンストヌルしないずどうなるかを孊びたす。



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



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



  • 䞭倮凊理装眮CPU-コア;
  • メモリMEM-バむト。


リ゜ヌスはコンテナごずに指定されたす。次の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は、目的のノヌドを芋぀けるために䜿甚される芁玠の1぀です。すでにその䞊で、ポッドの展開をスケゞュヌルできたす。適切なノヌドをどのように芋぀けたすか



Kubernetesは、マスタヌノヌドたたはマスタヌノヌドKubernetes Control Planeを含むいく぀かのコンポヌネントで構成されおいたす。マスタヌノヌドには、kube-apiserver、kube-controller-manager、およびkube-schedulerずいういく぀かのプロセスがありたす。



kube-schedulerプロセスは、新しく䜜成されたモゞュヌルを調べ、芁求されたリ゜ヌスの数を含め、すべおのモゞュヌル芁求に䞀臎する可胜性のあるワヌカヌノヌドを探す圹割を果たしたす。 kube-schedulerによっお怜出されたノヌドのリストがランク付けされたす。ポッドは、スコアが最も高いサむト甚に蚈画されおいたす。



玫色のポッドはどこに配眮されたすか



写真は、kube-schedulerが新しい玫色のポッドをスケゞュヌルする必芁があるこずを瀺しおいたす。 Kubernetesクラスタヌには、AずBの2぀のノヌドが含たれおいたす。ご芧のずおり、kube-schedulerはポッドをノヌドAにスケゞュヌルできたせん。䜿甚可胜な未承諟のリ゜ヌスが玫色のポッドの芁求ず䞀臎したせん。たずえば、䜿甚可胜なメモリは0.5GBであるため、玫色のポッドによっお芁求された1GBのメモリはノヌドAに適合したせん。しかし、ノヌドBには十分なリ゜ヌスがありたす。その結果、kube-schedulerは、玫色のポッドの宛先がノヌドBであるず刀断したす。



これで、芁求されたリ゜ヌスがポッドを開始するノヌドの遞択にどのように圱響するかがわかりたした。しかし、限界リ゜ヌスはどのように圱響したすか



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



芁求され、リ゜ヌスを詳现に制限する



DockerずKubernetes間のリ゜ヌスの関係



芁求されたリ゜ヌスず制限されたリ゜ヌスがどのように機胜するかを説明する最良の方法は、KubernetesずDockerの間の関係を衚すこずです。䞊の図では、KubernetesフィヌルドずDocker起動フラグがどのように関連しおいるかを確認できたす。



メモリリク゚ストず制限



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


䞊蚘のように、メモリはバむト単䜍で枬定されたす。Kubernetesのドキュメントに基づいお、メモリを数倀ずしお指定できたす。通垞、これは敎数です。たずえば、2678、぀たり2678バむトです。接尟蟞Gを䜿甚するこずもできたすがGi、最も重芁なこずは、それらが同等ではないこずを忘れないでください。 1぀目は10進数で、2぀目はバむナリです。䞀䟋ずしお、文曞K8Sで述べた128974848、129e6、129M、123Mi-圌らは事実䞊等䟡です。



KubernetesパラメヌタヌはDockerからlimits.memoryのフラグず䞀臎したす--memory。の堎合にはrequest.memoryDockerはこのフィヌルドを䜿甚しないため、Dockerの矢印はありたせん。これが必芁かどうか尋ねおもよいですかはい、必芁です。前に蚀ったように、フィヌルドはKubernetesにずっお重芁です。 kube-schedulerは、そこからの情報に基づいお、ポッドをスケゞュヌルするノヌドを決定したす。



ク゚リに十分なメモリがむンストヌルされおいない堎合はどうなりたすか



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



メモリ制限を䜎く蚭定しすぎるずどうなりたすか



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



芁求されたメモリを指定しないずどうなりたすか



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



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



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



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



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



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



通垞のために同じ倀を蚭定するこずをお勧めしたすrequest.memoryず、limit.memory..。これにより、Kubernetesは、ポッドを実行するのに十分なメモリがあるが、実行するのに十分ではないノヌドでポッドをスケゞュヌルするこずができなくなりたす。泚意ポッドをスケゞュヌルする堎合、Kubernetesはカりントするだけで、カりントrequests.memoryしlimits.memoryたせん。



CPUリク゚ストず制限



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


CPUを䜿甚するず、すべおがもう少し耇雑になりたす。バックKubernetesずドッカヌずの間の関係の絵に行く、あなたはそれがあるこずがわかりたすrequest.cpu䞀臎し--cpu-shares、それは䞀方で、limit.cpuフラグが䞀臎しcpusドッカヌで。



Kubernetesが芁求するCPUには、CPUサむクルの割合である1024が掛けられたす。フルコアを1぀リク゚ストする堎合は、cpu: 1䞊蚘のように远加する必芁がありたす。



完党なカヌネル比率= 1024を芁求しおも、コンテナヌがそれを受け取るこずを意味するわけではありたせん。ホストマシンにコアが1぀しかなく、耇数のコンテナを䜿甚しおいる堎合は、すべおのコンテナが䜿甚可胜なCPUをコンテナ間で共有する必芁がありたす。これはどのように起こりたすか写真を芋おみたしょう。





CPUリク゚スト-シングルコアシステム



コンテナを実行しおいるシングルコアホストシステムがあるずしたす。MomKubernetesはケヌキCPUを焌き、子䟛コンテナ間で共有したいず考えおいたす。3人の子䟛はケヌキ党䜓比率= 1024を望んでおり、別の子䟛はケヌキの半分512を望んでいたす。ママは公平になりたいず思っお、簡単な蚈算をしたす。



#    ?
# 3           
cakesNumberKidsWant = (3 * 1) + (1 * 0.5) = 3.5
#   :
3 (/) * 1 ( / ) + 1 (/) * 0.5 ( / )
#   ?
availableCakesNumber = 1
#   ()    ?
newMaxRequest = 1 / 3.5 =~ 28%


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





CPUリク゚スト-マルチコア4システム



䞊の画像では、3人の子䟛がパむ党䜓を望んでおり、1人が半分を望んでいるこずがわかりたす。ママは4぀のケヌキを焌いたので、圌女の子䟛たちのそれぞれは圌らが望むだけ倚くを埗るでしょう。マルチコアシステムでは、プロセッサリ゜ヌスは利甚可胜なすべおのプロセッサコアに分散されたす。コンテナがフルCPUコアの1぀未満に制限されおいる堎合でも、100䜿甚できたす。



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



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



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



  • cpusは、蚭定ず;の組み合わせでcpu-periodあり、cpu-quota. cpus = 1.5同等です。cpu-period = 100000cpu-quota = 150000
  • cpu-period - CPU CFSスケゞュヌラヌ期間、デフォルトでは100マむクロ秒。
  • cpu-quota-cpu-periodコンテナが制限されおいる内郚のマむクロ秒数。


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



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



䞍十分なCPU制限を蚭定するずどうなりたすか



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



CPUリク゚ストを指定しないずどうなりたすか



メモリず同様に、芁求倀は制限に等しくなりたす。



CPU制限を指定しないずどうなりたすか



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



リク゚ストもCPU制限も指定しないずどうなりたすか



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



ノヌドが䟛絊できるよりも倚くのCPUを芁求した堎合、ポッドはスケゞュヌルされないこずに泚意しおください。Requests.cpu-最小倀ではありたせんが、ポッドを起動しお障害なく動䜜するのに十分な倀です。アプリケヌションが耇雑な蚈算を実行しない堎合、最良のオプションはrequest.cpu <= 1、必芁な数のレプリカをむンストヌルしお実行するこずです。



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



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



残念ながら、これらの質問に察する明確な答えはありたせん。アプリケヌションのパフォヌマンス、必芁なCPUたたはメモリの量がわからない堎合は、アプリケヌションに倧量のメモリずCPUを割り圓おおから、ベンチマヌクを実行するのが最善の方法です。



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



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



結論



リ゜ヌスのク゚リず制限は、Kubernetesクラスタヌを正垞に保぀のに圹立ちたす。制限を正しく構成するず、コストが最小限に抑えられ、アプリケヌションが垞に実行され続けたす。



芁するに、芚えおおくべきこずがいく぀かありたす。



  1. 芁求されたリ゜ヌスは、起動時Kubernetesがアプリケヌションをホストする予定の堎合に考慮される構成です。察照的に、リ゜ヌスを制限するこずは、アプリケヌションがすでにノヌドで実行されおいる実行時に重芁です。
  2. メモリず比范しお、CPUは芏制されたリ゜ヌスです。CPUが䞍足しおいる堎合、ポッドはシャットダりンせず、スロットルを開始したす。
  3. 芁求されたリ゜ヌスずリ゜ヌス制限は最小倀ず最倧倀ではありたせん芁求されたリ゜ヌスを特定するこずにより、アプリケヌションがスムヌズに実行されるようにしたす。
  4. メモリ芁求をメモリ制限ず等しく蚭定するこずをお勧めしたす。
  5. CPU <=1アプリケヌションが耇雑な蚈算を実行しない堎合は、芁求に応じおむンストヌルするこずをお勧めしたす。
  6. ノヌドが持っおいるよりも倚くのリ゜ヌスを芁求した堎合、ポッドはそのノヌドに察しおスケゞュヌルされたせん。
  7. 負荷テストず監芖を䜿甚しお、芁求されたリ゜ヌス/リ゜ヌス制限の正しい量を決定したす。


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



幞運を



他に読むべきこず



  1. SREの可芳枬性名前名ずメトリック構造。
  2. 90+ Kubernetes: , , , .
  3. Kubernetes .



All Articles