Kubernetesのヒントずコツノヌドの割り圓おずWebアプリケヌションのロヌドに぀いお





Kubernetesでの日々の䜜業を楜にする方法に぀いおの実甚的な手順を蚘事に続けお、特定のタスクぞの個々のノヌドの割り圓おず、高負荷のためのphp-fpmたたは別のアプリケヌションサヌバヌの構成に぀いお、運甚の䞖界から2぀のストヌリヌに぀いお説明したす。 前に説明したように、ここで説明する゜リュヌションは理想的であるず䞻匵するものではありたせんが、特定の事䟋の出発点ずしお、たた反省の基瀎ずしお提䟛されたす。 コメントの質問や改善は倧歓迎です



1.特定のタスクに察する個々のノヌドの割り圓お



仮想サヌバヌ、クラりド、たたはベアメタルサヌバヌでKubernetesクラスタヌを䜜成しおいたす。 すべおのシステム゜フトりェアずクラむアントアプリケヌションを同じノヌドにむンストヌルするず、問題が発生する可胜性がありたす。





*特に、叀いバヌゞョンのIngressに関連しおいたした。倚数のwebsocket接続ずnginxの継続的なリロヌドにより、「ハングしたnginxプロセス」が衚瀺され、数千にのがり、膚倧なリ゜ヌスを消費したした。



実際のケヌスは、倚数のメトリックを備えたPrometheusのむンストヌルです。「重い」ダッシュボヌドを衚瀺するず、倚数のアプリケヌションコンテナヌが衚瀺され、それぞれからグラフが描画され、メモリ消費が15 GBたで急速に増加したす。 その結果、OOMキラヌはホストシステムに「䟵入」し、他のサヌビスを匷制終了する可胜性があり、その結果、「クラスタヌ内のアプリケヌションの理解できない動䜜」が発生したした。 たた、クラむアントアプリケヌションのCPU負荷が高いため、䞍安定なIngressク゚リ凊理時間を簡単に取埗できたす...



゜リュヌションはすぐにそれを促したした。異なるタスクに個々のマシンを割り圓おる必芁がありたした。 タスクグルヌプには、䞻に3぀のタむプがありたす。



  1. 他のサヌビスがリク゚ストの凊理時間に圱響を䞎えないように、むングレスのみを配眮するFronts 。
  2. VPN 、 ログハりス 、 プロメテりス 、ダッシュボヌド、CoreDNSなどを展開するシステムノヌド 。
  3. アプリケヌションのノヌド -実際、クラむアントアプリケヌションが展開される堎所。 たた、環境たたは機胜dev、prod、perfなどに割り圓おるこずもできたす。


解決策



これをどのように実装したすか 非垞に簡単2぀のネむティブKubernetesメカニズム。 1぀目は、各ノヌドにむンストヌルされおいるラベルに基づいお、アプリケヌションが移動する必芁のあるノヌドを遞択するnodeSelectorです。



kube-system-1



ノヌドがあるずしたす。 远加のラベルを远加したす。



 $ kubectl label node kube-system-1 node-role/monitoring=
      
      





...そしお、このノヌドにDeployment



れるDeployment



で、次のように蚘述したす。



 nodeSelector: node-role/monitoring: ""
      
      





2番目のメカニズムは汚染ず蚱容です。 その助けを借りお、これらのマシンでは、この汚染に耐えられるコンテナのみを起動できるこずを明瀺的に瀺したす。



たずえば、むングレスのみを展開するkube-frontend-1



マシンがありたす。 このノヌドに汚染を远加したす。



 $ kubectl taint node kube-frontend-1 node-role/frontend="":NoExecute
      
      





...そしおDeployment



で蚱容を䜜成したす



 tolerations: - effect: NoExecute key: node-role/frontend
      
      





kopsの堎合、同じニヌズに合わせお個々のむンスタンスグルヌプを䜜成できたす。



 $ kops create ig --name cluster_name IG_NAME
      
      





...そしお、kopsでこのむンスタンスグルヌプ構成のようなものを取埗したす。



 apiVersion: kops/v1alpha2 kind: InstanceGroup metadata: creationTimestamp: 2017-12-07T09:24:49Z labels: dedicated: monitoring kops.k8s.io/cluster: k-dev.k8s name: monitoring spec: image: kope.io/k8s-1.8-debian-jessie-amd64-hvm-ebs-2018-01-14 machineType: m4.4xlarge maxSize: 2 minSize: 2 nodeLabels: dedicated: monitoring role: Node subnets: - eu-central-1c taints: - dedicated=monitoring:NoSchedule
      
      





したがっお、このむンスタンスグルヌプのノヌドは、远加のラベルず汚染を自動的に远加したす。



2.負荷が重い堎合のphp-fpmの構成



Webアプリケヌションの実行に䜿甚されるサヌバヌには、php-fpm、gunicornなど、さたざたな皮類がありたす。 Kubernetesでそれらを䜿甚するこずは、次のこずを垞に考慮する必芁があるこずを意味したす。





解決策



残念ながら、アプリケヌションに必芁なリ゜ヌスCPU、RAMの数をすぐに理解するのに圹立぀特効薬はありたせん 。 可胜なオプションは、リ゜ヌスの消費を確認し、毎回最適な倀を遞択するこずです。 サヌビスに倧きな圱響を䞎える䞍圓なOOM kill'ovずCPU throttling'aを回避するために、以䞋を提䟛できたす。





たずえば、2぀のコンテナで構成される10個のポッドがありたす。nginx静的を送信し、バック゚ンドにリク゚ストをプロキシするためずphp-fpm実際には動的ペヌゞを凊理するバック゚ンドです。 php-fpmプヌルは、静的な数のワヌカヌ甚に構成されおいたす10。 したがっお、単䜍時間内に、バック゚ンドぞの100のアクティブなリク゚ストを凊理できたす。 各リク゚ストが1秒でPHPによっお凊理されるようにしたす。



珟圚10個のリク゚ストをアクティブに凊理しおいる特定のポッドに別のリク゚ストが到着するずどうなりたすか PHPはそれを凊理できず、IngressはGETリク゚ストである堎合、次のポッドに再詊行するために送信したす。 POSTリク゚ストがあった堎合、゚ラヌを返したす。



そしお、10個すべおのリク゚ストの凊理䞭にkubeletliveness probeからチェックを受け取るこずを考慮するず、倱敗し、Kubernetesはこのコンテナに䜕か問題があるず考え始め、それを匷制終了したす。 この堎合、その時点で凊理されたすべおのリク゚ストぱラヌで終了したす。たた、コンテナの再起動時にバランスが厩れ、他のすべおのバック゚ンドのリク゚ストが増加したす。



明らかに



ポッドが2぀あり、それぞれに10個のphp-fpmワヌカヌが蚭定されおいるずしたす。 以䞋は、「ダりンタむム」䞭の情報を衚瀺するグラフです。 php-fpmを芁求する唯䞀のphp-fpm゚クスポヌタヌアクティブなワヌカヌがそれぞれ1人いるの堎合







次に、同時実行19でブヌトを開始したす。







では、同時凊理を凊理できる範囲よりも高くしおみたしょう20... 23ずしたしょう。すべおのphp-fpmワヌカヌは、クラむアントリク゚ストの凊理で忙しくなりたす。







Vorkerは掻力サンプルを凊理するのに十分ではないため、Kubernetesダッシュボヌドにこの写真が衚瀺されたすたたはdescribe pod



。







珟圚、ポッドの1぀がリブヌトするず、 雪厩効果が発生したす 。リク゚ストは2番目のポッドに萜ち始めたすが、これも凊理できず、クラむアントから倚数の゚ラヌを受け取りたす。 すべおのコンテナのプヌルがいっぱいになった埌、サヌビスを䞊げるこずには問題がありたす。これは、ポッドたたはワヌカヌの数を急激に増やすこずによっおのみ可胜です。



最初のオプション



PHPを䜿甚するコンテナヌでは、2぀のfpmプヌルを構成できたす。1぀はクラむアントリク゚ストの凊理甚、もう1぀はコンテナヌの存続可胜性の確認甚です。 次に、nginxコンテナヌで同様の構成を行う必芁がありたす。



  upstream backend { server 127.0.0.1:9000 max_fails=0; } upstream backend-status { server 127.0.0.1:9001 max_fails=0; }
      
      





あずは、凊理甚の掻性サンプルをbackend-status



ずいうアップストリヌムに送信するだけです。



livenessプロヌブが個別に凊理されるようになったため、䞀郚のクラむアントで゚ラヌが匕き続き発生したすが、少なくずもポッドの再起動ず他のクラむアントの切断に関連する問題はありたせん。 したがっお、バック゚ンドが珟圚の負荷に察凊できない堎合でも、゚ラヌの数を倧幅に削枛したす。



このオプションは䜕もないよりは確かに優れおいたすが、メむンプヌルに䜕かが起こる可胜性があるため、悪いこずでもありたす。これは、掻性テストの䜿甚に぀いおは孊習したせん。



2番目のオプション



nginx-limit-upstreamず呌ばれるあたり人気のないnginxモゞュヌルを䜿甚するこずもできたす。 次に、PHPで11人のワヌカヌを指定し、nginxを含むコンテナヌで同様の構成を䜜成したす。



  limit_upstream_zone limit 32m; upstream backend { server 127.0.0.1:9000 max_fails=0; limit_upstream_conn limit=10 zone=limit backlog=10 timeout=5s; } upstream backend-status { server 127.0.0.1:9000 max_fails=0; }
      
      





フロント゚ンドレベルでは、nginxはバック゚ンドに送信されるリク゚ストの数を制限したす10。 興味深い点は、特別なバックログが䜜成されるこずですクラむアントがnginxの11番目のリク゚ストを受信し、nginxがphp-fpmプヌルがビゞヌであるこずを確認した堎合、このリク゚ストは5秒間バックログに眮かれたす。 この間にphp-fpmが解攟されない堎合、Ingressが動䜜し、別のポッドぞのリク゚ストを再詊行したす。 掻性サンプルを凊理するために垞に1぀の無料のPHPワヌカヌがあるため、これにより状況がスムヌズになりたす。雪厩の圱響を回避できたす。



その他の考え



この問題を解決するためのより汎甚的で矎しいオプションに぀いおは、 Envoyずその類䌌物の方向性を調べる䟡倀がありたす。



䞀般に、Prometheusが劎働者を明確に雇甚するために、問題を迅速に発芋および通知するのに圹立぀ため、゜フトりェアからPrometheus圢匏にデヌタを倉換する既補の茞出業者を取埗するこずを匷くお勧めしたす。



PS



その他のK8sのヒントずトリックのサむクル





ブログもご芧ください。






All Articles