最初のKubernetesアプリをデプロむする際の5぀のミス

Aris-Dreamerによる倱敗



倚くの人々は、アプリケヌションをKubernetesに移怍するだけでHelmを䜿甚するか手動で十分であり、幞犏があるず考えおいたす。しかし、それはそれほど単玔ではありたせん。Mail.ru Cloud Solutions



チヌムは、DevOps゚ンゞニアのJulianGuindiによる蚘事を翻蚳したした。圌は、あなたが同じレヌキを螏たないように、移行プロセスで圌の䌚瀟が盎面した萜ずし穎に぀いお話したす。



ステップ1ポッドリク゚ストず制限を蚭定する



ポッドが実行されるクリヌンな環境を蚭定するこずから始めたしょう。 Kubernetesは、ポッドのスケゞュヌル蚭定ず障害状態の凊理に優れおいたす。しかし、正垞に機胜するために必芁なリ゜ヌスの量を芋積もるのが難しい堎合、プランナヌがポッドを配眮できないこずがありたす。ここで、リ゜ヌスの芁求ず制限が発生したす。リク゚ストず制限を蚭定するための最良のアプロヌチに぀いおは倚くの論争がありたす。時々、それは本圓に科孊よりも芞術であるように思われたす。これが私たちのアプロヌチです。



ポッドリク゚ストは、最適なポッド配眮のためにスケゞュヌラヌが䜿甚する䞻芁な倀です。



Kubernetes: , . , PodFitsResources , .


アプリケヌションリク゚ストを䜿甚しお、アプリケヌションが実際に適切に機胜するために必芁なリ゜ヌスの数を芋積もるこずができたす。これにより、プランナヌはノヌドを珟実的に配眮できたす。圓初は、ポッドごずに十分なリ゜ヌスがあるこずを確認するために䜙裕を持っおリク゚ストを蚭定したかったのですが、スケゞュヌル時間が倧幅に長くなり、䞀郚のポッドは、リ゜ヌスリク゚ストがないかのように完党にスケゞュヌルされなかったこずがわかりたした。



この堎合、スケゞュヌラヌはポッドを「スクむヌズ」し、スケゞュヌルアルゎリズムの重芁なコンポヌネントであるアプリケヌションに必芁なリ゜ヌスの量が制埡プレヌンにわからないため、ポッドを再スケゞュヌルできたせん。



ポッドの制限ポッドのより明確な制限です。これは、クラスタヌがコンテナヌに割り圓おるリ゜ヌスの最倧量を衚したす。



繰り返しになりたすが、公匏ドキュメントからコンテナに4 GiBのメモリ制限が蚭定されおいる堎合、kubeletおよびコンテナランタむムはそれを匷制したす。ランタむムは、コンテナが指定されたリ゜ヌス制限を超えお䜿甚するこずを防ぎたす。たずえば、コンテナ内のプロセスが蚱可された量を超えるメモリを䜿甚しようずするず、カヌネルは「メモリ䞍足」OOM゚ラヌでプロセスを終了したす。


コンテナは、リ゜ヌス芁求で指定されたよりも倚くのリ゜ヌスを垞に䜿甚できたすが、制限で指定された以䞊を䜿甚するこずはできたせん。この倀を正しく蚭定するこずは困難ですが、非垞に重芁です。



理想的には、ポッドのリ゜ヌス芁件を、システム内の他のプロセスに干枉するこずなく、プロセスのラむフサむクル党䜓で倉曎する必芁がありたす。これが制限を蚭定する目的です。



残念ながら、どの倀を蚭定するかに぀いお具䜓的な指瀺を䞎えるこずはできたせんが、私たちは次のルヌルを順守しおいたす



  1. 負荷テストツヌルを䜿甚しお、ベヌスラむントラフィックをシミュレヌトし、ポッドリ゜ヌスの䜿甚状況メモリずプロセッサを監芖したす。
  2. ( 5 ) . , , Go.


ポッドには十分なリ゜ヌスが利甚可胜なタヌゲットノヌドが必芁なため、リ゜ヌスの制玄が高くなるずスケゞュヌリングが難しくなるこずに泚意しおください。



4GBのメモリのような非垞に高いリ゜ヌス制玄のある軜量のWebサヌバヌがある状況を想像しおみおください。このプロセスは氎平方向にスケヌリングする必芁があり、新しい各モゞュヌルは、少なくずも4GBの䜿甚可胜なメモリがあるノヌドでスケゞュヌルする必芁がありたす。そのようなノヌドが存圚しない堎合、クラスタヌはこのポッドを凊理するために新しいノヌドを導入する必芁がありたす。これには時間がかかる堎合がありたす。高速でスムヌズなスケヌリングを確保するには、リ゜ヌス芁求ず制限の間のマヌゞンをできるだけ小さくするこずが重芁です。



ステップ2掻性テストず準備テストを蚭定したす



これは、Kubernetesコミュニティで頻繁に議論されるもう1぀の埮劙なトピックです。掻性テストず準備テストは、゜フトりェアがスムヌズに実行され、ダりンタむムを最小限に抑えるためのメカニズムを提䟛するため、十分に理解するこずが重芁です。ただし、正しく構成されおいないず、アプリケヌションのパフォヌマンスに深刻な圱響を䞎える可胜性がありたす。以䞋は、䞡方のサンプルの抂芁です。



掻気は、コンテナが実行されおいるかどうかを瀺したす。倱敗した堎合、kubeletはコンテナを匷制終了し、再起動ポリシヌが有効になりたす。コンテナにLivenessプロヌブが装備されおいない堎合、Kubernetesのドキュメントに蚘茉されおいるように、デフォルトの状態は成功です。



掻性プロヌブは、頻繁に実行され、アプリケヌションが実行されおいるこずをKubernetesに通知する必芁があるため、安䟡である必芁がありたす。぀たり、倚くのリ゜ヌスを消費しない必芁がありたす。



毎秒実行するように蚭定するず、毎秒1぀のリク゚ストが远加されるため、このトラフィックを凊理するには远加のリ゜ヌスが必芁になるこずに泚意しおください。



圓瀟では、デヌタリモヌトデヌタベヌスやキャッシュなどが完党に利甚できない堎合でも、Livenessテストでアプリケヌションの䞻芁コンポヌネントを怜蚌したす。



応答コヌド200を返すだけの「ヘルス」゚ンドポむントをアプリケヌションに構成したした。これは、プロセスが皌働䞭であり、芁求を凊理できるこずを瀺しおいたすただし、トラフィックはただ凊理できたせん。準備



テストコンテナがリク゚ストを凊理する準備ができおいるかどうかを瀺したす。準備プロヌブが倱敗した堎合、゚ンドポむントコントロヌラは、ポッドに䞀臎するすべおのサヌビスの゚ンドポむントからポッドIPアドレスを削陀したす。これは、Kubernetesのドキュメントにも蚘茉されおいたす。



準備プロヌブは、アプリケヌションが芁求を受け入れる準備ができおいるこずを瀺すような方法でバック゚ンドに移動する必芁があるため、より倚くのリ゜ヌスを消費したす。



デヌタベヌスに盎接アクセスするかどうかに぀いおは、コミュニティで倚くの論争がありたす。オヌバヌヘッドチェックは頻繁に実行されたすが、調敎可胜を考慮しお、䞀郚のアプリケヌションでは、レコヌドがデヌタベヌスから返されるこずを確認した埌にのみ、トラフィックを凊理できるかどうかをカりントするこずにしたした。適切に蚭蚈された可甚性プロヌブは、より高い可甚性を保蚌し、展開䞭のダりンタむムを排陀したした。



デヌタベヌスにク゚リを実行しおアプリケヌションの準備ができおいるこずを確認する堎合は、できるだけ安䟡であるこずを確認しおください。次のようなク゚リを実行しおみたしょう。



SELECT small_item FROM table LIMIT 1


Kubernetesでこれら2぀の倀を構成する方法の䟋を次に瀺したす。



livenessProbe: 
 httpGet:   
   path: /api/liveness    
   port: http 
readinessProbe:  
 httpGet:    
   path: /api/readiness    
   port: http  periodSeconds: 2


いく぀かの远加の構成オプションを远加できたす。



  • initialDelaySeconds -コンテナの開始からサンプルの開始たでに䜕秒が経過するか。
  • periodSeconds — .
  • timeoutSeconds — , . -.
  • failureThreshold — , .
  • successThreshold — , ( , ).


:



Kubernetesには「フラットな」ネットワヌクトポグラフィがあり、デフォルトでは、すべおのポッドが互いに盎接盞互䜜甚したす。堎合によっおは、これは望たしくありたせん。



朜圚的なセキュリティ問題は、攻撃者が単䞀の脆匱なアプリケヌションを䜿甚しお、ネットワヌク䞊のすべおのポッドにトラフィックを送信する可胜性があるこずです。セキュリティの倚くの領域ず同様に、最小特暩の原則が適甚されたす。理想的には、ネットワヌクポリシヌは、ポッド間の接続が蚱可されおいるものず蚱可されおいないものを明瀺的に瀺す必芁がありたす。



たずえば、以䞋は、特定の名前名のすべおのむンバりンドトラフィックを拒吊する単玔なポリシヌです。



---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:  
 name: default-deny-ingress
spec:  
 podSelector: {}  
 policyTypes:  
   - Ingress


この構成の芖芚化





https://miro.medium.com/max/875/1*-eiVw43azgzYzyN1th7cZg.gif

詳现はこちら。



ステップ4フックず初期化コンテナを䜿甚したカスタム動䜜



私たちの䞻な目暙の1぀は、開発者にダりンタむムなしでKubernetesぞの展開を提䟛するこずでした。アプリケヌションをシャットダりンし、䜿甚枈みのリ゜ヌスを解攟するための倚くのオプションがあるため、これは困難です。Nginxでは



特定の問題が発生したした。これらのポッドが順番に展開されるず、正垞に完了する前にアクティブな接続が切断されるこずに気付きたした。 むンタヌネットで培底的に調査した結果、Kubernetesはポッドをシャットダりンする前にNginx接続がなくなるのを埅たないこずが刀明したした。プレストップフックの助けを借りお、次の機胜を実装し、ダりンタむムを完党に取り陀きたした。







lifecycle: 
 preStop:
   exec:
     command: ["/usr/local/bin/nginx-killer.sh"]


そしおここにnginx-killer.sh



#!/bin/bash
sleep 3
PID=$(cat /run/nginx.pid)
nginx -s quit
while [ -d /proc/$PID ]; do
   echo "Waiting while shutting down nginx..."
   sleep 10
done


もう1぀の非垞に䟿利なパラダむムは、特定のアプリケヌションの起動を凊理するためのinitコンテナヌの䜿甚です。これは、アプリケヌションを実行する前に開始する必芁がある、リ゜ヌスを倧量に消費するデヌタベヌス移行プロセスがある堎合に特に圹立ちたす。メむンアプリケヌションにそのような制限を蚭定せずに、このプロセスに高いリ゜ヌス制限を指定するこずもできたす。



もう1぀の䞀般的なスキヌムは、initコンテナ内のシヌクレットにアクセスするこずです。これにより、これらの資栌情報がメむンモゞュヌルに提䟛され、メむンアプリケヌションモゞュヌル自䜓からのシヌクレットぞの䞍正アクセスが防止されたす。



, : init- , . , .


:



最埌に、より高床なテクニックに぀いお話したしょう。



Kubernetesは非垞に柔軟なプラットフォヌムであり、適切ず思われる方法でワヌクロヌドを実行できたす。非垞に効率的でリ゜ヌスを倧量に消費するアプリケヌションが倚数ありたす。広範な負荷テストを通じお、Kubernetesのデフォルトが有効な堎合、アプリケヌションの1぀が予想されるトラフィック負荷の凊理に苊劎しおいるこずがわかりたした。



ただし、Kubernetesでは、特定のポッドのカヌネルパラメヌタのみを倉曎する特暩コンテナを実行できたす。開いおいる接続の最倧数を倉曎するために䜿甚したものは次のずおりです。



initContainers:
  - name: sysctl
     image: alpine:3.10
     securityContext:
         privileged: true
      command: ['sh', '-c', "sysctl -w net.core.somaxconn=32768"]


これはより高床な手法であり、倚くの堎合䞍芁です。ただし、アプリケヌションが重い負荷に察凊するのに苊劎しおいる堎合は、これらのパラメヌタヌのいく぀かを調敎しおみおください。このプロセスずさたざたな倀の蚭定に関する詳现-い぀ものように公匏ドキュメントにありたす。



最埌に



Kubernetesはすぐに䜿甚できる゜リュヌションのように芋えるかもしれたせんが、アプリケヌションをスムヌズに実行し続けるために実行する重芁な手順がいく぀かありたす。



Kubernetesぞの移行䞭は、「負荷テストサむクル」に埓うこずが重芁です。アプリケヌションを実行し、負荷テストを行い、メトリックずスケヌリング動䜜を芳察し、そのデヌタに基づいお構成を埮調敎しおから、このサむクルを繰り返したす。



予想されるトラフィックを珟実的に芋積もり、それを超えお、どのコンポヌネントが最初に砎損するかを確認したす。この反埩的なアプロヌチでは、成功を収めるには、これらの掚奚事項のほんの䞀郚で十分な堎合がありたす。たたは、より詳现なカスタマむズが必芁になる堎合がありたす。



垞に次の質問を自問しおください。



  1. ?
  2. ? ? ?
  3. ? , ?
  4. ? ? ?
  5. ? - , ?


Kubernetesは、クラスタヌ党䜓に数千のサヌビスを展開するためのベストプラクティスを可胜にする玠晎らしいプラットフォヌムを提䟛したす。ただし、すべおのアプリケヌションが異なりたす。実装にはもう少し䜜業が必芁な堎合がありたす。



幞い、Kubernetesは、すべおの技術的目暙を達成するために必芁なカスタマむズを提䟛したす。リ゜ヌスの芁求ず制限、掻性ず準備のプロヌブ、初期化コンテナ、ネットワヌクポリシヌ、およびカスタムカヌネルの調敎を組み合わせお䜿甚​​するず、障害耐性ず高速なスケヌラビリティずずもに、高いパフォヌマンスを実珟できたす。



他に読むべきこず



  1. 実皌働環境でコンテナずKubernetesを実行するためのベストプラクティスずガむドラむン。
  2. 90+ Kubernetes: , , , .
  3. Kubernetes .



All Articles