Kubernetes は、最も人気のあるコンテナ オーケストレーションおよびデプロイメント プラットフォームです。その強力な機能により、コンテナ化されたアプリケーションを本番環境で確実に実行できるようになります。 ただし、柔軟性には複雑さが伴います。この記事では、多くのチームが遭遇する Kubernetes の一般的な落とし穴を 10 個取り上げます。これらの課題を特定して回避できれば、アプリケーションのスケーラビリティ、信頼性、セキュリティが向上すると同時に、クラスターとそのデプロイメントをより細かく制御できるようになります。 1. 最新のタグを使用してコンテナをデプロイするKubernetes で最も頻繁に違反されるベストプラクティスの 1 つは、コンテナをデプロイするときに最新のタグを使用することです。これにより、システムの安定性に影響を与える可能性のある重大な変更を誤って受け入れてしまうリスクが生じます。 最新タグの使い方は人それぞれですが、ほとんどの人は latest をプロジェクトの最新バージョンに指定します。たとえば、今日 helm:latest を使用すると Helm v3 が提供されますが、v4 がリリースされた後に再起動すると v4 に更新されますが、システムはまだ v3 を実行していると認識され、予期しないリスクが発生する可能性があります。 2. 生存性および準備性プローブを使用していないプローブを使用すると、アプリケーションの回復力を高めることができます。これらは、Kubernetes に Pod の健全性を通知します。 コンテナ内でメモリ オーバーフローや Liveness プローブ要求のタイムアウトなどの問題が発生すると、Liveness プローブは Kubernetes に通知してコンテナを再起動させます。 アプリケーションが一時的にリクエストに応答できなくなる場合があります。たとえば、アプリケーションの起動時に大量のデータや構成ファイルを読み込む必要がある場合や、起動後に外部サービスを待機する必要がある場合があります。この場合、アプリを強制終了したくはありませんが、アプリにリクエストを送信したくもありません。 Kubernetes は、このような状況を検出して軽減するための準備プローブを提供します。コンテナが配置されているポッドは、準備ができていないことを報告し、Kubernetes サービス経由のトラフィックを受け入れません。 以下は、有効性と準備状況のプローブを備えたシンプルな Pod です。 3. ノードセレクタが不足しているため、スケジューリング効率が低下するクラスターの全体的なパフォーマンスは、ポッドが適切なノードに正しくスケジュールされているかどうかによって決まります。多くのクラスターには、標準アプリケーション用の小さな 2 CPU/4 GB ノードや、集中的なバックエンド サービス用の大きな 8 CPU/16 GB ノードなど、複数のタイプのノードが含まれています。 ポッドを必要なノード プールに確実にスケジュールできない場合、クラスターの使用率は低くなります。たとえば、十分に活用されていない小さなノードがある場合でも、不要な新しい大きなノードが強制的に作成され、クラスターのコストが増加する可能性があります。この問題を回避するには、ノードにラベルを設定し、ノード セレクターを使用して各 Pod を互換性のあるノードに割り当てます。 このポッドは、ラベル node-class: 2c4g を持つノードにのみスケジュールされます。 一致するノードにラベルを設定するには、次のコマンドを使用します: kubectl label 適切なスケジューリング ルールを設定すると、ノードの使用率が最大化され、安定したクラスター パフォーマンスが維持されます。 4. ポッドのアフィニティ/アンチアフィニティルールの違反ポッド アフィニティ ルールとアンチ アフィニティ ルールを使用すると、ポッドのデプロイに最適なノードを Kubernetes に指示できます。ルールは、ノード レベルの特性 (ラベルなど) またはノード上ですでに実行されている他のポッドの特性に基づいて条件付けできます。 アフィニティ ルールはポッドをノードに引き寄せ、ポッドが特定のノードにスケジュールされる可能性を高めますが、反アフィニティは反発効果があり、スケジュールされる可能性を減らします。 Kubernetes は、スケジュール可能な各ノードの Pod アフィニティ ルールを評価し、最も適切なルールを選択します。 アフィニティ システムは複雑なスケジューリング動作をサポートできますが、アフィニティ ルールを誤って構成し、ポッドが誤って間違ったノードにスケジュールされたり、スケジュールを拒否されたりすることもよくあります。 たとえば、サービスの 2 つのコピーを 2 つのノードにスケジュールしておくと、1 つのノードに障害が発生した場合でも、サービスのもう 1 つのコピーが確実に利用可能になります。ルールが正しく設定されておらず、両方が 1 つのノードにスケジュールされている場合、サービスは利用できなくなります。 5. 監視・録音なしKubernetes でアプリケーションをスケーリングする場合、クラスター リソースの使用率、アプリケーション エラー、リアルタイムのパフォーマンス データを理解することが重要です。メモリ消費の急増、Pod の削除、コンテナのクラッシュはすべて注意すべき問題ですが、標準の Kubernetes には障害が発生したときに警告する監視機能がありません。 クラスターの監視を有効にするには、Prometheus、Nightingale などの可観測性プラットフォームをデプロイする必要があります。これにより、Kubernetes からメトリックが収集され、Grafana で関連するデータ メトリックが表示されます。アラーム機構も付いています。 6. ラベルセレクタが一致しませんデプロイメントやサービスなどのオブジェクトは、管理するポッドやその他のオブジェクトを識別するために正しいラベルセレクターに依存します。セレクターとオブジェクトに実際に割り当てられたラベルが一致しないと、デプロイメントが失敗します。 例: 上記のファイルのデプロイメントでは、セレクターがテンプレート ラベルと一致しない spec.selector.matchLabelsspec.template.metadata.labels がスローされます。この問題を解決するには、マニフェストの および フィールドを調整して、同じキーと値のペアを持つようにします。 7. サービスポートの不一致同様に、サービスがトラフィックをポッド上の正しいポートにルーティングするようにすることも重要です。ポート定義が正しくないと、実際にはトラフィックがそのポッドにまったく到達していないにもかかわらず、ポッドに障害が発生したように見えることがあります。 次のリストにはこの問題の例が含まれています。サービスはポート 9000 でリッスンし、トラフィックをポッドのポート 8080 に転送しますが、コンテナは実際にはポート 80 にあるため、トラフィックはコンテナに到達できません。 8. 誤って間違った名前空間にデプロイするKubernetes 名前空間は、一連のサービスを論理的にグループ化し、クラスター内での分離レベルを提供します。各チーム、アプリケーション、環境ごとに名前空間を作成すると、名前の競合を防ぎ、管理エクスペリエンスを簡素化できます。 名前空間を使用する場合は、各サービスと Kubectl コマンドのターゲット名前空間を指定することを忘れないでください。それ以外の場合は、デフォルトの名前空間 default が使用されます。サービスが適切な名前空間にデプロイされていない場合、関連するサーバー要求に到達できなくなります。 次のリストは、Istio Ingress 転送構成です。このファイルはセグメント スペースにデプロイされ、/dp-manager 要求に基づいてセグメント スペース内の dp-manager-backend サービスに転送されます。 dp-manager-backend がセグメント空間内にない場合、リクエストは異常になります。 9. リソース要求や制限のないポッドクラスターの安定性を維持するには、適切なリソース管理が重要です。ポッドには、設定しない限り、デフォルトではリソース制限がないため、ノードの CPU とメモリが枯渇する可能性があります。 リソースの競合を減らすために、すべてのポッドに適切なリソース要求と制限を設定します。十分な容量を提供できないノードにポッドがスケジュールされないように、Kubernetes にポッド用に特定の量のリソースを予約するように要求します。制限は、ポッドが使用できるリソースの最大量を設定します。 CPU 制限を超えるポッドは調整され、メモリ制限に達するとメモリ不足 (OOM) エラーが発生し、ポッドが終了します。 リクエストと制限はPodマニフェストフィールドspec.container.resourcesで定義されます。 上記の Pod は、100m (1000m は 1 コアに相当) の CPU 時間と 1Gi のメモリを要求します。十分なリソースを提供できるノードにのみスケジュールされます。 Pod はメモリ制限も設定しており、適用できる最大メモリは 2Gi です。ポッドのメモリ制限をそのリクエストと同じに設定するのがベストプラクティスです。 Kubernetes はリクエストを超過した Pod を比例的に制限するため、通常、CPU 制限は必要ありません。 10. クラスタ自動拡張エラーKubernetes を選択する理由の 1 つは、その柔軟な拡張性です。適切な構成により、 Kubernetes は需要がピークに達したときに新しいポッドとノードを自動的に追加し、水平方向および垂直方向に動的にスケーリングできるようになります。残念ながら、多くのチームにとって、自動スケーリングは予測不可能です。 したがって、クラスターの使用率を定期的にチェックして、それがまだワークロードに適しているかどうかを確認してください。 Locust などの負荷テスト ツールを使用して、自動スケーリング ルールをテストし、余分なトラフィックをクラスターに誘導します。これにより、問題を早期に検出し、実際のトラフィックが到着したときにポッドをシームレスにスケールアップできるようになります。 |
<<: すべての IT リーダーが答えなければならないクラウド戦略に関する 9 つの質問
>>: Ideal Auto の K8s 上の Flink に基づくデータ統合の実践
観測対象の概要みなさんこんにちは。私は曹源兄弟です。今日はCool Grassrootsが第03回大...
SEO 業界におけるこれら 8 つの嘘を信じますか? あなたは SEO の同僚であり、顧客を騙すため...
5月19日、筆者は「社内SEO研修についてお話しましょう」というタイトルの記事を書きました。この記事...
エッジコンピューティングは、エッジデバイスにインテリジェンスを統合する分散型テクノロジーとして、クラ...
vpsyc のロサンゼルス cn2 gia vps は 618 イベントを開催しています。VPS を...
リモートワーク ポリシーにより、従業員がどこで働いていても、一貫した高品質のエクスペリエンスを提供す...
2021年6月25日、中国システムはInnovent Digital BrainとFanxing C...
10月14日、海外メディアの報道によると、Google Cloudは最近、クラウドコンピューティング...
IT 部門は、仮想デスクトップ インフラストラクチャ (VDI) の計画プロセス中にさまざまな要素を...
最近、Tencent Cloud WAF は、国際的に有名な調査機関である Gartner が発表し...
ramnodeはどうですか? ramnode オランダ クラウド サーバーはどうですか? Ramno...
UK2 グループの子会社である VPS.NET は、XEN ベースの仮想 VPS を 50% 割引で...
長い間書いていませんでした。SEOと入札の両方をやっているので、少し前までは頻繁に書いていましたが、...
組織は、データが最大の価値を生み出した後、できるだけ早くそのデータを取得してそれに基づいて行動するこ...
[[216237]] FTT は、可用性を犠牲にすることなく vSAN クラスタで発生できる障害の数...