この記事では、Kubernetes 上で安全でスケーラブルかつ回復力のあるサービスをデプロイするための実行可能なベスト プラクティスのみを紹介します。参考用です。 本番環境へのリリースを支援するために設計された、厳選されたベスト プラクティスのリストです。 アプリケーション開発健康チェック
アプリケーションの独立した展開準備調査は独立している準備プローブには、次のようなサービスへの依存関係は含まれません。
参考リンク: https://blog.colinbreck.com/kubernetes-liveness-and-readiness-probes-how-to-avoid-shooting-yourself-in-the-foot/#shootingyourselfinthefootwithreadinessprobes. アプリケーションの再接続メカニズムアプリケーションの起動時には、データベースなどの依存関係がまだ準備ができていないため、クラッシュすることはありません。 代わりに、アプリケーションは成功するまでデータベースへの接続を継続的に再試行する必要があります。 Kubernetes では、アプリケーション コンポーネントを任意の順序で起動できることが想定されています。 アプリケーションが依存関係 (データベースなど) に再接続できることが保証されると、より堅牢で回復力のあるサービスを提供できることがわかります。 アプリケーションを正常にシャットダウンするアプリケーションは、SIGTERM を受信してもすぐに終了せず、しばらく待ってから接続を正常に終了します。終了信号を受信した後でも、すべての kube-proxy が iptables ルールまたは ipvs ルールの更新を完了するまで、ポッドは接続を受け入れ続ける必要がある場合があります。 おそらく、ingress-controller と Loadblance も接続を POD に転送するでしょう。 どのクライアントでも切断が発生しないようにするには、すべてのクライアントがポッドへの接続を転送しないことを何らかの方法で通知するまで待つ必要があります。 しかし、明らかに、これらすべてのコンポーネントが多数の異なるコンピューターに分散されているため、これは不可能です。いずれかが応答の書き込みに失敗した場合、アプリケーションを閉じることができなくなります。 一般的には、事前停止フックを設定します。 ライフサイクル: SIGTERMシグナルをプロセスに転送するポッドが終了する直前に、アプリケーションで SIGTERM シグナルをキャッチできます。 tini を使用できます。 tini プロジェクト アドレス: https://github.com/krallin/tini。 アイドル状態のkaap-aliveソケットをすべて閉じますポッドが削除されたときに呼び出し元のアプリケーションが TCP 接続を閉じない場合、理想的にはリクエストを別のポッドに送信する必要があります。ただし、呼び出し元のアプリケーションは、終了しようとしているポッドへの長時間の接続を保持しており、引き続き使用します。長時間の接続は突然終了しないでください。アプリケーションをシャットダウンする前にそれらを終了する必要があります。 フォールトトレランスデプロイされたポッドの複数のレプリカを実行する単一の Pod を単独で実行しないでください。 代わりに、Deployment、DaemonSet、ReplicaSet、または StatefulSet の一部として Pod をデプロイすることを検討してください。 複数の Pod インスタンスを実行すると、1 つの Pod を削除してもダウンタイムが発生しなくなります。 ポッドを単一のノードに配置しないようにする次のシナリオを考えてみましょう。単一のクラスター ノードに 11 個のレプリカがあります。 ノードが使用できなくなると、11 個のレプリカが失われ、ダウンタイムが発生します。 ポッドがクラスター内のすべてのノードに分散されるように、デプロイメントにアンチアフィニティ ルールを適用する必要があります。 ポッド間アフィニティと反アフィニティのドキュメントでは、ポッドを同じノードに配置する (または配置しない) ように変更する方法について説明しています。 ポッド中断予算を設定します。 ポッド中断予算を設定する翻訳すると、POD 干渉バジェットを構成することを意味します。通常状態のアプリケーション ポッドの最小数またはパーセンテージを設定することにより、ポッドがアクティブに破棄されるときに、破棄されるポッドが多すぎて異常な業務中断が発生することがなくなり、ビジネスの可用性が向上します。 参考リンク: https://zhuanlan.zhihu.com/p/367827614. Pod 中断予算を理解するための公式ドキュメントはhttps://kubernetes.io/docs/concepts/workloads/pods/disruptions/ です。 リソースの利用すべてのコンテナのメモリ制限とリクエストを設定するリソース制限は、コンテナが使用できる CPU とメモリの量を制限するために使用され、 containerSpecフィールドを使用して構成されます。 スケジューラはこれらをメトリックの 1 つとして使用し、現在の Pod に最適なノードを決定します。 リソース制限のないコンテナのスケジューリング優先度は 0 です。つまり、OOM が発生すると、そのようなコンテナが最初に停止されます。 CPU は圧縮可能なリソースであるため、コンテナーが制限を超えると、プロセスが調整されます。 適切なCPU またはメモリの制限がわからない場合は、Kubernetes の Vertical Pod Autoscaler を使用して推奨モードをオンにすることができます。オートスケーラーはアプリを分析し、アプリの制限を推奨します。 CPU要求を1CPU以下に設定する計算負荷の高いジョブがない限り、リクエストを 1 CPU 以下に設定することをお勧めします。 CPUスロットリングを無効にするアプリケーションに最適な設定がわからない場合は、CPU 制限を設定しないことをお勧めします。 さらに詳しく知りたい場合は、この記事で CPU 要求と制限について詳しく説明します。 https://medium.com/@ 名前空間の LimitRange を設定するメモリと CPU の制限を設定するのを忘れた可能性がある場合は、LimitRange オブジェクトを使用して、現在の名前空間にデプロイされているコンテナーの標準サイズを定義することを検討してください。 LimitRange の公式ドキュメントは https://kubernetes.io/docs/concepts/policy/limit-range/ です。 ポッドに適切なQoS(サービス品質)を設定するノードのリソース使用量が高すぎる場合、Kubernetes はノードから一部のポッドを削除しようとします。 Kubernetes は、定義された優先順位と QoS に基づいてポッドをランク付けして排除します。 Qos の設定方法については、公式ドキュメント ( https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/) を参照してください。 リソースタグテクノロジー関連のタグを定義する関連技術の公式推奨タグは次のとおりです。 公式ドキュメント: https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/。
例: apiバージョン: アプリ/ v1 ビジネスタグの定義Pod には次のラベルをタグ付けできます。
例: apiバージョン: アプリ/ v1 セキュリティラベルの定義Pod には次のラベルをタグ付けできます。
例: apiバージョン: アプリ/ v1 ログ記録アプリケーションログをstdoutとstderrに出力ログ記録戦略には、パッシブとアクティブの 2 つがあります。 パッシブ戦略を使用するアプリケーションは、メッセージを標準出力に記録します。 このベストプラクティスは、12 要素アプリの一部です。 アクティブ ログでは、アプリケーションは中間アグリゲータへのネットワーク接続を確立し、サードパーティのログ サービスにデータを送信するか、データベースまたはインデックスに直接書き込みます。 アクティブ ログはアンチパターンと見なされるため、回避する必要があります。 ログ記録にサイドカーを使用しない(可能な場合)非標準のログ イベント モデルを持つアプリケーションにログ変換を適用する場合は、サイドカー コンテナーを使用することをお勧めします。 サイドカー コンテナーを使用すると、ログ エントリを他の場所に送信する前に正規化できます。 たとえば、Apache ログをログ インフラストラクチャに送信する前に、Logstash JSON 形式に変換する必要がある場合があります。 ただし、アプリケーションを制御できる場合は、最初から正しい形式で出力できます。 クラスター内の各ポッドに対して追加のコンテナを実行する手間を省くことができます。 ズームコンテナはローカル ファイル システムに状態を保存しません。コンテナには、永続的なデータに使用できるローカル ファイル システムがあります。 ただし、コンテナのローカル ファイル システムに永続データを保存すると、コンテナに含まれる Pod を水平方向にスケーリングできなくなります (つまり、Pod のレプリカを追加または削除することができません)。 これは、ローカルファイルシステムを使用すると、各コンテナが独自の「状態」を維持するため、Pod レプリカの状態が時間の経過とともに変化する可能性があるためです。これにより、ユーザーの観点からは動作に一貫性がなくなる可能性があります (たとえば、リクエストが 1 つの Pod に到達したときには特定のユーザー情報が利用可能になりますが、リクエストが別の Pod に到達したときには利用できません)。 代わりに、永続的な情報は Pod の外部の中央の場所に保管する必要があります。たとえば、クラスター内の PersistentVolume 内、またはさらに良い方法としては、クラスター外のストレージ サービス内です。 使用パターンが変化するアプリケーションに水平ポッドオートスケーラーを使用するHorizontal Pod Autoscaler (HPA) は、アプリケーションを監視し、現在の使用状況に基づいて Pod レプリカを自動的に追加または削除する組み込みの Kubernetes 機能です。 HPA を構成すると、予期しない急増を含むあらゆるトラフィック状況でもアプリケーションの可用性と応答性が維持されます。 アプリケーションを自動的にスケーリングするように HPA を構成するには、アプリケーションを監視するメトリックを定義する HorizontalPodAutoscaler リソースを作成する必要があります。 HPA は、組み込みのリソース メトリック (Pod の CPU とメモリの使用量) またはカスタム メトリックを監視できます。カスタム メトリックの場合は、これらのメトリックを収集して公開する責任も負います。たとえば、Prometheus と Prometheus アダプターを使用してこれを実行できます。 ベータ版のVertical Pod Autoscalerは使用しないでください水平ポッドオートスケーラー (HPA) と同様に、垂直ポッドオートスケーラー (VPA) も存在します。 VPA は、ポッドのリソース要求と制限に自動的に適応できるため、ポッドがさらに多くのリソースを必要とするときに、それらを取得できます (単一のポッドのリソースを増減することを垂直スケーリングと呼び、ポッドのレプリカの数を増減することを意味する水平スケーリングとは対照的です)。 これは、水平方向にスケーリングできないアプリケーションをスケーリングする場合に便利です。 ただし、VPA は現在ベータ版であり、いくつかの既知の制限があります (たとえば、リソース要件を変更してポッドをスケーリングするには、ポッドを強制終了して再起動する必要があります)。 これらの制限と、Kubernetes 上のほとんどのアプリケーションがいずれにしても水平方向にスケーリングされるという事実を考慮すると、VPA を本番環境で使用することはお勧めしません (少なくとも安定したバージョンが利用可能になるまでは)。 ワークロードが大きく変動する場合は、Cluster Autoscalerを使用してください。クラスター オートスケーラーは、別のタイプの「オートスケーラー」です (水平ポッド オートスケーラーと垂直ポッド オートスケーラーに加えて)。 Cluster Autoscaler は、ワーカー ノードを追加または削除することで、クラスターのサイズを自動的にスケーリングできます。 既存のワーカーノードのリソースが不足しているためにポッドをスケジュールできない場合にスケーリングが発生します。この場合、Cluster Autoscaler は、ポッドをスケジュールできるように新しいワーカーノードを作成します。同様に、既存のワーカーノードの使用率が低い場合、クラスター オートスケーラーはワーカーノードからすべてのワークロードを排除して削除することでスケールダウンできます。 Cluster Autoscaler の使用は、たとえば、ポッドの数が短期間に増加し、その後以前の値に戻る可能性がある場合など、変動の大きいワークロードに適しています。この場合、Cluster Autoscaler を使用すると、リソースを無駄にすることなくワーカーノードをオーバープロビジョニングすることで、需要の急増に対応できます。 ただし、ワークロードがそれほど変化しない場合は、クラスター オートスケーラーがトリガーされない可能性があるため、設定する価値がない可能性があります。ワークロードがゆっくりと単調に増加する場合は、既存のワーカー ノードの使用率を監視し、臨界値に達したときに手動でワーカー ノードを追加するだけで十分な場合があります。 構成とシークレットすべての構成を外部化する構成はアプリケーション コードの外部で維持する必要があります。 これにはいくつかの利点があります。まず、構成を変更してもアプリケーションを再コンパイルする必要はありません。 2 番目に、アプリケーションの実行中に構成を更新できます。 3 番目に、同じコードをさまざまな環境で使用できます。 Kubernetes では、構成を ConfigMap に保存し、環境変数として渡されるボリュームとしてコンテナにマウントできます。 ConfigMaps には機密性のない構成のみを保存します。資格情報などの機密情報については、Secret リソースを使用します。 環境変数ではなくボリュームとしてシークレットをマウントするSecret リソースの内容は、環境変数として渡すのではなく、ボリュームとしてコンテナーにマウントする必要があります。 これは、コンテナを起動するために使用されるコマンドに秘密の値が表示されないようにするためです。秘密の値にアクセスするべきでない個人が、秘密の値を表示してしまう可能性があります。 ガバナンス名前空間の制限名前空間構成の制限範囲制限のないコンテナでは、他のコンテナとのリソース競合が発生し、コンピューティング リソースの消費が最適化されない可能性があります。 Kubernetes には、リソース使用量を制限するための ResourceQuota と LimitRange という 2 つの機能があります。 LimitRange オブジェクトを使用すると、名前空間内の個々のコンテナのリソース要求と制限のデフォルト値を定義できます。 名前空間内に作成され、リクエスト値と制限値を明示的に指定していないコンテナには、デフォルト値が割り当てられます。 リソースクォータについては、公式ドキュメントを確認してください。 https://kubernetes.io/docs/concepts/policy/resource-quotas/。 名前空間構成リソースクォータResourceQuotas を使用すると、名前空間内のすべてのコンテナの合計リソース消費量を制限できます。 名前空間のリソース クォータを定義すると、その名前空間に属するすべてのコンテナーが使用できる CPU、メモリ、またはストレージ リソースの合計量が制限されます。 現在の名前空間内の Pod の数など、他の Kubernetes オブジェクトのクォータを設定することもできます。 誰かがクラスターを悪用して 20,000 個の ConfigMap を作成する可能性があると思われる場合は、LimitRange を使用すると、そのような事態を防ぐことができます。 ポッドセキュリティポリシーポッドセキュリティポリシーを有効にするKubernetes Pod セキュリティ ポリシーを使用して、次のものを制限できます。
Kubernetes Pod セキュリティ ポリシーのベスト プラクティス(https://www.mend.io/resources/blog/kubernetes-pod-security-policy/) を参照してください。 特権コンテナを無効にするPod 内では、コンテナは「特権」モードで実行でき、ホスト システム上のリソースにほぼ無制限にアクセスできます。 このレベルのアクセスが必要な特定のユースケースもありますが、一般的に、コンテナにこれを許可するとセキュリティ上のリスクが生じます。 特権ポッドの有効な使用例としては、ノード上の GPU などのハードウェアの使用が挙げられます。 セキュリティ コンテキストと権限コンテナーの詳細については、次の記事を参照してください: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/。 コンテナ内での読み取り専用ファイルシステムの使用コンテナ内で読み取り専用ファイル システムを実行すると、コンテナは不変になります。 これにより、ホットパッチなどの古い(リスクの高い)手法が軽減されるだけでなく、悪意のあるプロセスがコンテナ内でデータを保存または操作するリスクを防ぐこともできます。 読み取り専用ファイルシステムでコンテナを実行するのは単純に思えるかもしれませんが、いくつかの複雑な問題が発生する可能性があります。 ログを書き込んだり、一時フォルダーにファイルを保存したりする必要がある場合はどうすればよいでしょうか? 本番環境でコンテナを安全に実行することのトレードオフについては、こちらの記事で学べます: https://medium.com/@ コンテナがルートとして実行されないようにするコンテナ内で実行されているプロセスは、コンテナ内にあることを示す小さなメタデータを持っていることを除いて、ホスト上の他のプロセスと何ら変わりはありません。 したがって、コンテナ内の root はホスト上の root (uid 0) と同じになります。 ユーザーがコンテナ内で root として実行されているアプリケーションから抜け出すことができた場合、同じ root ユーザーでホスト マシンにアクセスできる可能性があります。 権限のないユーザーを使用するようにコンテナを構成することが、権限昇格攻撃を防ぐ最善の方法です。 さらに詳しく知りたい場合は、次の記事で、コンテナをルートとして実行した場合に何が起こるかについての詳細な例をいくつか紹介します: ttps://medium.com/@ Linuxの一部の機能を制限するLinux の機能により、デフォルトでは root ユーザーのみが実行できる多くの特権操作をプロセスで実行できるようになります。 たとえば、 CAP_CHOWN を使用すると、プロセスは「ファイルの UID と GID に任意の変更を加える」ことができます。 プロセスがrootとして実行されていない場合でも、権限を昇格することでプロセスがこれらの root のような機能を使用することは可能です。 つまり、危険にさらされたくない場合は、必要な機能のみを有効にする必要があります。 しかし、どの機能を有効にすべきでしょうか、またその理由は何でしょうか? 次の 2 つの記事では、Linux カーネルの機能に関する詳細な理論と実践のベスト プラクティスについて説明します。
Linux の権限昇格を防ぐsetuidまたはsetgidバイナリを使用した権限の昇格を防ぐには、権限の昇格をオフにしてコンテナを実行する必要があります。 ネットワークポリシー
クラスター内の悪意のあるユーザーはクラスターにアクセスし、クラスター全体にリクエストを送信できるようになります。 これを解決するには、ネットワーク ポリシーを使用して、現在の名前空間内および名前空間間で Pod が通信できる方法を定義できます。 ネットワークポリシーを有効にするKubernetes ネットワーク ポリシーは、クラウド内のセキュリティ グループが VM インスタンスへのアクセスを制御するために使用されるのと同じように、Pod のグループに対するアクセス権限を指定します。 つまり、Kubernetes クラスター上で実行されている Pod 間にファイアウォールを作成します。 Kubernetes クラスター ネットワーク: https://ahmet.im/blog/kubernetes-network-policy/。 各名前空間には、デフォルトで保守的な NetworkPolicy が必要です。Kubernetes 上で実行されているアプリケーションのトラフィックをドロップ/スロットルする方法について詳しく知りたい場合は、このドキュメントをご覧ください。 https://github.com/ahmetb/kubernetes-network-policy-recipes。 ロールベースのアクセス制御 (RBAC) ポリシーデフォルトのServiceAccountの自動マウントを無効にするデフォルトの ServiceAccount はすべての Pod のファイルシステムに自動的にマウントされることに注意してください。 これを無効にして、より詳細なポリシーを提供することもできます。 RBACポリシーは、必要な最小限の権限に設定されますRBAC ルールを設定する方法に関する適切なアドバイスを見つけるのは困難です。 Kubernetes RBAC への 3 つの実践的なアプローチでは、3 つの実際のシナリオと、開始方法に関する実践的なアドバイスを見つけることができます。 実際のシナリオについては、次のドキュメントを参照してください: https://thenewstack.io/three-realistic-approaches-to-kubernetes-rbac/。 RBACポリシーは細かく設定されており、共有されないロールと ServiceAccounts を定義するための簡潔な戦略があります。 まず、彼らは自分たちの要件を説明しました。
これら 4 つの要件は、次の 5 つの個別の役割に変換されます。
この定義については、次のリンクで読むことができます: https://kubernetes-on-aws.readthedocs.io/en/latest/dev-guide/arch/access-control/adr-004-roles-and-service-accounts.html。 カスタムポリシー
クラスタ構成推奨されるKubernetes構成クラスターはCISベンチマークテストに合格しましたインターネット セキュリティ センターでは、コードを保護するためのベスト プラクティスに関するガイダンスとベンチマークを提供しています。 また、Kubernetes のベンチマークも維持しています。公式ウェブサイトのアドレスはhttps://www.cisecurity.org/benchmark/kubernetes です。 長いガイドを読んでクラスターのコンプライアンスを手動で確認することもできますが、より簡単な方法はkube-bench をダウンロードして実行することです。 ダウンロードアドレス: https://github.com/aquasecurity/kube-bench。 kube-bench は、 CIS Kubernetes ベンチマークを自動化し、クラスター内の誤った構成を報告するように設計されたツールです。 サンプル出力: [ 情報] 1 マスターノードのセキュリティ構成 マスターがクラウド プロバイダーによってホストされている場合、 kube-bench は使用できません。 アルファまたはベータ API 機能へのアクセスを制限するKubernetes のアルファ版およびベータ版の機能は現在開発中であり、セキュリティの脆弱性につながる可能性のある制限やバグがある可能性があります。 アルファ機能またはベータ機能が提供する価値と、セキュリティ体制への潜在的なリスクを常に評価してください。 確認するユーザー認証戦略として OpenID (OIDC) トークンを使用するKubernetes は、OpenID Connect (OIDC) を含むさまざまな認証方法をサポートしています。 OpenID Connect を使用すると、シングル サインオン (SSO) (Google ID など) を使用して Kubernetes クラスタやその他の開発ツールに接続できます。 資格情報を別途覚えたり管理したりする必要はありません。 複数のクラスターを同じ OpenID プロバイダーに接続できます。 Kubernetes の OpenID Connect に関する詳細情報。こちらにアクセスしてください: https://thenewstack.io/kubernetes-single-sign-one-less-identity/ ロールベースのアクセス制御 (RBAC)ServiceAccountトークンはアプリケーションとコントローラーでのみ使用可能ですサービス アカウント トークンは、Kubernetes クラスターと対話しようとするエンド ユーザーには使用できませんが、Kubernetes 上で実行されるアプリケーションやワークロードには推奨される認証戦略です。 ログ設定ログの保持とアーカイブ戦略30 ~ 45 日間の履歴ログを保存する必要があります。 ノード、コントロールプレーン、監査からログを収集するログが収集される側面:
収集すべきもの:
サイドカーの代わりに各ノードでデーモンを使用してログを収集することを優先するアプリケーションはファイルではなく標準出力にログを記録する必要があります。 各ノード上のデーモンは、コンテナ ランタイムからログを収集できます (ファイルにログを記録する場合は、ポッドごとにサイドカー コンテナが必要になる場合があります)。 参照アドレス: https://rclayton.silvrback.com/container-services-logging-with-docker#effective-logging-infrastructure。 ログ集約ツールの設定EFK スタック (Elasticsearch、Fluentd、Kibana)、DataDog、Sumo Logic、Sysdig、GCP Stackdriver、Azure Monitor、AWS CloudWatch などのログ集約ツールを使用します。 |
<<: Kubernetes ネットワーク プラグインの詳細な説明 - Calico - ネットワークの基礎
>>: VMware は高度な自動化を使用してハイブリッド ワークスペースを簡素化します
weloveservers、1Gメモリ特別版の説明:サーバーはIntel Xeon Quad-Cor...
私は小さなウェブサイトからこの業界に入ったため、「SEOチャンネル」という言葉を初めて聞いたときはよ...
私が勤務する会社は、業界情報技術およびソリューション サービスのプロバイダーであり、その垂直分野にお...
誰もがローカル Web サイトをよく知っていますが、草の根の Web マスターはどのようにして優れた...
ウェブマスターの間では、「コンテンツは王、外部リンクは皇帝、内部リンクは側室、コードは将軍、キーワー...
このツイートは、普及について話すことから始まります。このツイートを読んだ後、ブランド コミュニケーシ...
[51CTO.com オリジナル記事] 2016年にファーウェイはエコシステムの概念を提唱した。 2...
国家観光局は1月5日、AutoNavi Mapsと共同で「全国全域観光ホログラフィック情報サービスシ...
どのマーケティングの時代にも独自の個性があり、先見の明のある経営者は、それぞれのマーケティングの時代...
locvpsは今月、日本の大阪データセンターにVPSを追加しました。ソフトバンク回線に接続され、日本...
広い意味では、ハイブリッド クラウドは、同種クラウド コンピューティング、異種クラウド コンピューテ...
ユーザー エクスペリエンスは、間違いなく昨今のホットな言葉です。最近の A5 の記事を例に挙げると、...
SEO 最適化におけるウェブサイトの外部リンクの役割はよく知られていますが、検索エンジンがウェブサイ...
月収10万元の起業の夢を実現するミニプログラム起業支援プランダブルイレブンが近づくにつれ、さまざまな...
クラウドコンピューティングは、インターネットインフラと伝統的な経済の統合により、地域経済の急速な発展...