1. Kubernetes イントロダクション
Kubernetes(k8sとも呼ばれる)は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースのコンテナオーケストレーションプラットフォームです。Kubernetesは、基盤となるインフラストラクチャを抽象化し、大規模なアプリケーションを管理する方法を提供し、柔軟性、移植性、豊富な機能セットを提供します。Kubernetesは、その広範な採用、活発なコミュニティ、複雑な多層アプリケーションを処理する能力により、コンテナオーケストレーションのデファクトスタンダードとなっています。
◇Kubernetes 概要
Kubernetesは、コンテナ化されたワークロードとサービスを管理するためのポータブルで拡張可能なオープンソースプラットフォームであり、宣言型の設定と自動化を容易にします。Kubernetesは、大規模で急速に成長しているエコシステムを持っています。Kubernetesのサービス、サポート、ツールは広く利用可能です。
Kubernetesという名前はギリシャ語に由来し、「舵取り」または「パイロット」を意味します。K8sという略称は、「K」と「s」の間の8文字を数えた結果です。Googleは2014年にKubernetesプロジェクトをオープンソース化しました。Kubernetesは、Googleが大規模な本番ワークロードを実行する15年以上の経験と、コミュニティからの最高のアイデアとプラクティスを組み合わせています。
- 公式 Kubernetes の概要
- 記事 Kubernetes とは?
- 記事 Kubernetes 概要と必読資料
- 動画 チュートリアル - Kubernetes
- フィード Kubernetes に関するトップ投稿を探索
◇Kubernetes が必要な理由
Kubernetes(k8s)は、大規模なコンテナ化アプリケーションのデプロイと管理のための強力で柔軟なプラットフォームを提供するため必要とされています。Kubernetesは、簡単なスケーラビリティ、高い回復力、アプリケーションの移植性、多くのタスクの自動化、コンテナプラットフォームの標準化を可能にします。k8sはまた、運用チームの複雑さと作業負荷を軽減し、より戦略的な取り組みに集中できるようにします。
- 公式 Kubernetes が必要な理由とその機能
- 記事 なぜKubernetesを使うべきか?
- 記事 Kubernetes の成り立ち、その意義、そしてなぜ気にするべきか
- フィード Kubernetes に関するトップ投稿を探索
◇主要な概念と用語
Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースのコンテナオーケストレーションプラットフォームです。以下に、Kubernetesの重要な概念と用語をいくつか紹介します。
-
クラスターアーキテクチャ: Kubernetesの背後にあるアーキテクチャの概念。
-
コンテナ: アプリケーションとそのランタイム依存関係をパッケージ化する技術。
-
ワークロード: Kubernetesで最小のデプロイ可能なコンピュートオブジェクトであるPodと、それらを実行するための高レベルの抽象化を理解します。
-
サービス、ロードバランシング、ネットワーキング: Kubernetesのネットワーキングの背後にある概念とリソース。
-
ストレージ: クラスター内のPodに長期的および一時的なストレージを提供する方法。
-
設定: Kubernetesが提供するPodの設定リソース。
-
クラスター管理: Kubernetesクラスターの作成または管理に関連する低レベルの詳細。
◇Kubernetes の代替手段
Kubernetesは、コンテナ化されたアプリケーションを管理およびデプロイするために広く使用されている人気のあるオープンソースのコンテナオーケストレーションツールです。Docker Swarm、Mesos、Nomadなどの他のコンテナオーケストレーションツールもありますが、Kubernetesとこれらのツールの間にはいくつかの重要な違いがあります。以下にその一部を紹介します。
-
アーキテクチャ: Kubernetesは、Kubernetes APIサーバー、kubelet、kube-proxy、etcdなど、コンテナオーケストレーションを提供するために連携する多くのコンポーネントを持つモジュールシステムとして設計されています。
-
スケーラビリティ: Kubernetesは大規模なデプロイメントを処理するように設計されており、需要に基づいてアプリケーションをスケールアップまたはダウンできます。
-
柔軟性: Kubernetesは高度に設定可能で、特定の要件を満たすようにカスタマイズできますが、他のコンテナオーケストレーションツールは設定オプションが限られている場合があります。
-
移植性: Kubernetesはクラウドに依存しないように設計されており、パブリックまたはプライベートのクラウドプラットフォーム、およびオンプレミスで実行できます。
-
コミュニティ: Kubernetesには、開発とサポートを提供する大規模で活発な開発者とユーザーのコミュニティがあります。
2. コンテナ
Kubernetesはコンテナ上に構築されているため、Kubernetesを学ぶ前に、コンテナをゼロから実行および構築することに慣れている必要があります。
- 記事 公式 Docker チュートリアル
- 記事 Docker カリキュラム
- 動画 100秒でわかるDocker
- 動画 初心者向け Docker 3時間無料ビデオコース
- フィード コンテナに関するトップ投稿を探索
3. Kubernetes のセットアップ
Kubernetesクラスターをセットアップするには、デプロイ環境を選択し、各ノードにKubernetesコンポーネントをインストールし、プラグインを使用してネットワーキングを設定し、kubeadm initでマスターノードを初期化し、kubeadm joinを使用してワーカーノードを結合し、マニフェストを使用してアプリケーションをデプロイし、kubectlまたは管理ツールを使用してクラスターを管理する必要があります。
◇ローカルクラスターのインストール
CentOS 7またはUbuntuにKubernetesクラスターをインストールおよび設定するには、Kubernetesクラスターをセットアップするための前提条件と要件を設定し、Kubeadm、Kubelet、Kubectlを含むKubernetesコンポーネントをインストールし、マスターノードとワーカーノードを接続する必要があります。接続が確立されたら、クラスターにアプリケーションをデプロイして確認できます。
- 記事 CentOS 7にKubernetesクラスターをインストールする方法
- 記事 UbuntuでKubernetesクラスターを作成する方法
- 記事 Ubuntu ServerにMicrok8sでKubernetesクラスターをデプロイする
◇マネージドプロバイダーの選択
マネージドプロバイダーは、マネージドKubernetes環境を提供するクラウドベースのサービスです。これは、プロバイダーがサーバー、ストレージ、ネットワーキングなどの基盤となるインフラストラクチャ、およびKubernetesクラスターのインストール、設定、メンテナンスを処理することを意味します。
マネージドKubernetesプロバイダーを選択する際には、使用しているクラウドプロバイダー、機能と能力、価格と請求、サポート、セキュリティとコンプライアンス、プロバイダーの評判とレビューを考慮してください。これらの要素を考慮することで、ニーズを満たし、組織にとって最良の価値を提供するプロバイダーを選択できます。
- 記事 マネージドKubernetesプロバイダーの選択
- 記事 Amazon Web Services、Elastic Kubernetes Serviceをバッチジョブ向けに強化
- 記事 Kubernetesのための適切なプラットフォームを構築する方法
◇最初のアプリケーションのデプロイ
Kubernetesで最初のアプリケーションをデプロイするには、YAMLファイルでデプロイメントとサービスマニフェストを作成し、kubectl applyコマンドを使用してマニフェストをKubernetesクラスターに適用し、kubectl get podsを使用してアプリケーションのPodが実行されていることを確認し、kubectl get servicesを使用してサービスをテストし、WebブラウザまたはcURLなどのツールを使用してサービスにアクセスします。HelmチャートやKubernetesオペレーターなど、Kubernetesでのアプリケーションデプロイを簡素化するさまざまなツールやプラットフォームも利用可能です。
- 公式 kubectlを使用したデプロイメントの作成
- 記事 Kubernetesでのアプリケーションデプロイ A to Z
- 記事 Kubernetes 101: MicroK8sで最初のアプリケーションをデプロイする
- 動画 Kubernetesチュートリアル | 最初のKubernetesアプリケーション
- 動画 Kubernetes 101: 最初のアプリケーションをデプロイする
4. アプリケーションの実行
Kubernetesクラスターでアプリケーションを実行するには、YAMLファイルを使用してDeploymentやStatefulSet、Service、ConfigMapやSecretなどのKubernetesオブジェクトを定義する必要があります。DeploymentやStatefulSetは、コンテナイメージ、コンテナポート、その他の設定を定義します。Serviceは、アプリケーションにアクセスするための安定したIPアドレスとDNS名を提供し、ConfigMapやSecretには設定データや機密情報が含まれます。アプリケーションをデプロイするには、kubectl apply
を使用してKubernetesオブジェクトを作成または更新します。Kubernetesは、YAMLファイルに基づいてアプリケーションのデプロイメント、スケーリング、ネットワーキングを自動的に管理します。監視や変更はkubectl
コマンドを通じて行うことができます。
◇Pods
Kubernetesにおいて、Podはクラスター内で実行されるプロセスの単一インスタンスを表す最小のデプロイ可能な単位です。Podは1つ以上のコンテナを含むことができ、それらのコンテナは同じネットワーク名前空間を共有し、同じストレージボリュームにアクセスできます。PodはKubernetesによって作成および管理され、クラスター内のノードの1つで実行されるようにスケジュールされます。Podは軽量で柔軟な抽象化レイヤーを提供し、Kubernetesがコンテナ化されたアプリケーションのデプロイメント、スケーリング、ネットワーキングを管理できるようにします。また、同じPod内で実行されるコンテナ間の通信やデータ交換を容易にします。
- 公式 Podドキュメント
- 記事 The Kubernetes Way: Pods and Services
- 記事 本番環境で実行されるKubernetes Podsの設定に関する5つのベストプラクティス
- 動画 KubernetesにおけるPodとは?なぜ必要なのか?
◇ReplicaSets
ReplicaSetは、クラスター内で指定された数のPodレプリカ(同一のコピー)が常に実行されていることを保証するコントローラーです。ReplicaSetは、需要の変化やハードウェアの障害に応じてPodレプリカの数を自動的にスケールアップまたはダウンすることで、高可用性とスケーラビリティを確保します。ReplicaSetは、希望するレプリカ数、使用するPodテンプレート、その他の設定を指定するYAMLファイルで定義されます。ReplicaSetは、Podのステータスを監視し、必要に応じてレプリカを作成または削除して、希望する状態を維持する責任があります。
◇Deployments
Deploymentは、宣言的な設定を通じてPodとReplicaSetを管理するためのリソースオブジェクトです。Deploymentは、アプリケーションのワークロードライフサイクル、Podの数、デプロイメント戦略、コンテナイメージなどを定義する希望する状態を記述します。Deploymentコントローラーは、実際の状態が希望する状態と一致するように動作し、例えば失敗したPodを置き換えるなどの操作を行います。デフォルトで、Deploymentは「再作成」や「ローリングアップデート」などのいくつかのデプロイメント戦略をサポートしていますが、ブルー/グリーンやカナリアデプロイメントなどのより高度なデプロイメント戦略をサポートするようにカスタマイズすることもできます。
- 公式 Deploymentドキュメント
- 記事 Kubernetes Deployment: 基本戦略からプログレッシブデリバリーまで
- 動画 Kubernetes Deployments | デプロイメント戦略
◇StatefulSets
StatefulSetは、安定したネットワークIDと安定したストレージボリュームを必要とするステートフルなPodのセットのデプロイメントとスケーリングを管理するコントローラーです。StatefulSetは、データベースなどのステートフルアプリケーションを実行するために使用されます。各Podの順序と一意性が重要な場合に使用されます。StatefulSetは、各Podに一意で安定したネットワークIDと安定したストレージボリュームを提供するため、ステートフルアプリケーションは、スケールアップまたはダウンしたり、ノードが故障または置き換えられたりした場合でもデータの一貫性を維持できます。StatefulSetは、Podテンプレート、Podにアクセスするためのサービス、その他の設定を含むYAMLファイルで定義されます。
- 公式 StatefulSetドキュメント
- 記事 ステートフルKubernetesアプリケーションを構築するためのさまざまなアプローチ
- 動画 Kubernetes StatefulSet | チュートリアル
◇Jobs
Jobは、有限のタスクまたはバッチジョブの実行を管理するコントローラーです。Jobは、バッチ処理、データ分析、バックアップなどの短命なタスクを実行するために使用されます。これらのタスクは完了すると終了します。Jobは、タスクを実行するために1つ以上のPodを作成し、各Podの完了ステータスを監視します。Podが失敗または終了した場合、Jobは自動的に置換Podを作成して、タスクが正常に完了することを保証します。Jobは、Podテンプレート、完了基準、その他の設定を含むYAMLファイルで定義されます。
5. サービスとネットワーキング
サービスとネットワーキングは、ポッドと外部クライアント間の通信を可能にする重要なコンポーネントです。サービスは、一連のポッドにアクセスするための安定したエンドポイントを提供し、ネットワーキングプラグインと設定オプションは、ポッド間の通信とネットワーク分離を可能にします。これらの機能は、スケーラブルで信頼性が高く、柔軟性があるように設計されており、開発者が複雑なマイクロサービスアーキテクチャを管理およびオーケストレーションすることを容易にします。IngressやDNSベースのサービスディスカバリーなどの追加機能は、サービスへの柔軟な外部アクセスを提供し、クラスター内でのサービスディスカバリーを簡素化します。
- 公式 サービス - ドキュメント
- 公式 Kubernetesネットワークモデル
- フィード ネットワーキングに関するトップ投稿を探索
◇サービスへの外部アクセス
Kubernetes(k8s)サービスへの外部アクセスにより、外部クライアントはクラスター内で実行されているポッドやサービスにアクセスできます。k8sでサービスへの外部アクセスを有効にするには、NodePorts、LoadBalancers、Ingressなど、複数の方法があります。Ingressは、URLやホストに基づいてトラフィックをサービスにルーティングする、外部アクセスを管理するための柔軟な方法を提供するKubernetesオブジェクトです。外部アクセスは、Kubernetesデプロイメントのスケーラビリティと信頼性を確保するために不可欠です。
◇ロードバランシング
ロードバランシングは、Serviceオブジェクトを使用して、複数のポッドまたはノードにネットワークトラフィックを分散します。Serviceは、一連のポッドに対して安定したネットワークエンドポイントを提供し、他のポッドや外部クライアントが単一のIPアドレスとDNS名を通じてそれらにアクセスできるようにします。Kubernetesは、ラウンドロビン、最小接続、またはIPハッシュに基づいてトラフィックを分散する3種類のロードバランシングアルゴリズムを提供します。ロードバランシングは、Kubernetesネットワーキングの重要な部分であり、クラスター全体で効率的かつ信頼性の高いトラフィック分散を提供します。
- 公式 ロードバランシング - ドキュメント
- 記事 Ingressコントローラー:Kubernetesのスイスアーミーナイフ
- 動画 チュートリアル | Kubernetesでのロードバランシングサービス
◇ネットワーキングとポッド間通信
ネットワーキングは、Kubernetesクラスター内のポッドとリソース間の通信にとって重要です。各ポッドには一意のIPアドレスがあり、他のポッドと直接通信できます。コンテナネットワーキングインターフェース(CNI)プラグインは、ポッドのネットワークインターフェースを設定し、ポッド間の分離を提供するために使用されます。Kubernetesはまた、ロードバランシング、サービスディスカバリー、Ingressなどのネットワーキングサービスを提供し、外部トラフィックがポッドやサービスにアクセスできるようにします。これらのサービスは、Service、Ingress、NetworkPolicyなどのKubernetesオブジェクトを使用して実装されます。ネットワーキングとポッド間通信は、Kubernetesクラスターのスケーラビリティ、信頼性、柔軟性にとって不可欠です。
- 公式 クラスターネットワーキング - ドキュメント
- 公式 ポッド間通信を伴うジョブ
- 記事 Kubernetesがアプリケーションにネットワーキングとストレージを提供する方法
- フィード ネットワーキングに関するトップ投稿を探索
6. 構成管理
Kubernetes(K8s)での構成管理は、K8sクラスターで実行されているアプリケーションの構成を定義および管理するプロセスです。K8sは、ConfigMapsやSecretsなど、構成を管理するためのいくつかのメカニズムを提供し、アプリケーションのコンテナに構成を注入するためのいくつかの方法をサポートしています。構成管理は、他のKubernetes機能と緊密に統合されており、Kubernetesでスケーラブルで信頼性の高いアプリケーションを構築するために重要です。
◇ConfigMapを使用したポッド構成の注入
ConfigMapは、クラスター内で実行されているアプリケーションが使用できる構成データを保存する方法です。ConfigMapは、データベースURL、認証情報、APIキー、またはアプリケーションが使用できるその他のアプリケーション構成データなどの構成データを保持できるキー値ストアです。
◇機密データのためのSecretsの使用
Kubernetes Secretsは、パスワード、トークン、APIキーなどの機密データを安全に保存します。それらは手動または自動で作成でき、etcdに保存されます。Secretsは、ファイルまたは環境変数としてポッドにマウントでき、Kubernetes RBACを使用してアクセスを管理できます。ただし、サイズや作成後の更新ができないなどの制限があります。Secretsを理解することは、Kubernetesで安全なアプリケーションを構築するために重要です。
7. リソース管理
Kubernetesにおけるリソース管理は、CPU、メモリ、ストレージリソースを管理し、リソースの効率的かつ効果的な使用を確保することを含みます。Kubernetesは、リソースクォータ、リミット、ノードアフィニティとアンチアフィニティ、水平および垂直ポッドオートスケーリング、クラスターオートスケーリングなど、リソースを効果的に管理するためのいくつかの機能とツールを提供します。これらの機能は、リソースが公平に割り当てられ、リソース競合が回避され、ポッドが必要なリソースにアクセスできることを保証するのに役立ちます。これらの機能を使用することで、Kubernetesはリソースを効率的に管理し、パフォーマンスの向上、信頼性の向上、コストの削減を実現します。
◇リソースリクエストとリミットの設定
Kubernetesにおけるリソースリクエストとリミットは、コンテナが実行するために必要な最小および最大のCPUとメモリの量を指定します。リソースリクエストは、十分なリソースを持つノード上でコンテナをスケジュールするために使用され、リミットはリソースクォータを強制し、コンテナが過剰にリソースを消費するのを防ぎます。これらの設定は、YAMLのresources
フィールドを使用してポッドまたはコンテナレベルで設定できます。Kubernetesクラスターで最適なリソース利用を確保するために、リソースリクエストとリミットを正しく設定することが重要です。
- 公式 リクエストとリミット - ドキュメント
- 公式 デフォルトのメモリリミットとリクエストの動機
- 記事 Kubernetesリソースタイプの理解
- 記事 Kubernetesのリクエストとリミットを解明する
◇名前空間へのクォータの割り当て
名前空間にクォータを割り当てることは、Kubernetes内の特定のリソースグループのリソース使用量を制限する方法です。クォータは、CPU、メモリ、その他のリソース、および名前空間内のオブジェクトの数に対して設定できます。これにより、クラスター内の異なるチームやプロジェクト間でリソースが公平に分配されることが保証されます。クォータは、個々の名前空間またはクラスター全体に適用できます。Kubernetesでは、厳格なリソース制限を強制するハードクォータと、一定の範囲内で超過を許容するソフトクォータの両方が許可されています。クォータは、Kubernetes APIまたはYAML設定ファイルを使用して管理できます。
◇リソース使用量の監視と最適化
Kubernetes(k8s)でのリソース使用量の監視と最適化は、リソースの効率的かつ効果的な使用を確保するために重要です。リソース使用量を監視するために、k8sはMetrics Serverを提供し、Prometheusをk8sと統合することができます。Container Runtime Interface(CRI)を使用して、コンテナレベルのリソース使用量データを監視することもできます。リソース使用量を最適化するために、適切なリクエストとリミットの設定、Horizontal Pod Autoscaling(HPA)の使用、ポッドアフィニティとアンチアフィニティルールの実装、ノード選択の制御などが、リソース競合を減らし、リソース利用を改善するのに役立ちます。リソース使用量を監視し、最適化することで、k8sはアプリケーションが効率的に実行され、リソースが効果的に使用されることを保証します。
8. Kubernetesセキュリティ
Kubernetes(k8s)セキュリティは、クラスターのリソースに対する不正アクセス、データ漏洩、サービス拒否攻撃などの潜在的な脅威から保護することを含みます。これは、アクセス制御、ネットワークセキュリティ、暗号化、監視などの手段を通じて実現できます。k8sセキュリティに使用される一般的なツールには、ロールベースアクセス制御(RBAC)、Kubernetesネットワークポリシー、TLS証明書、コンテナイメージスキャンなどがあります。k8s環境の定期的な更新とパッチ適用も、セキュリティを維持するために重要です。
◇ロールベースアクセス制御(RBAC)
ロールベースアクセス制御(RBAC)は、ユーザーまたはグループに割り当てられたロールに基づいてKubernetesリソースへのアクセスを制御する方法です。RBACでは、ロールを作成し、それらをユーザーまたはグループにバインドして、Kubernetesリソースへのアクセスを制御します。ロールは、特定のリソースに対して実行できるアクションを決定する一連のルールとして定義されます。ユーザーまたはグループにロールを割り当てることで、ロールで定義された権限に基づいてKubernetesリソースへのアクセスを制限または許可できます。RBACは、許可されたユーザーとグループにアクセスを制限することで、Kubernetesクラスターのセキュリティと整合性を確保するのに役立ちます。
- 公式 ロールベースアクセス制御のベストプラクティス
- 記事 Kubernetesアクセス制御の入門
- 記事 Kubernetes認可を理解するための実践的なアプローチ
- 記事 Kubernetes RBACの3つの現実的なアプローチ
- 記事 ロールベースアクセス制御:5つの一般的な認可パターン
- 記事 RBACを使用してKubernetesとその他のリソースを大規模に保護する
- 動画 Kubernetesでのロールベースアクセス制御を理解する
◇ネットワークセキュリティ
Kubernetesにおけるネットワークセキュリティは、クラスター内の異なるコンポーネント間および外部ネットワークとの間のネットワーク通信を保護することを含みます。これは、ネットワークポリシー、暗号化、認証、認可、ファイアウォールルールなどのさまざまなメカニズムを通じて実現できます。ネットワークポリシーは、ネットワークトラフィックを細かく制御し、暗号化はポッド、ノード、外部システム間の安全な通信を確保します。認証と認可メカニズムは、不正アクセスを防ぎ、さまざまなコンポーネント間の安全な通信を提供します。ファイアウォールルールは、特定のポートとプロトコルへのアクセスを制限することで、クラスターを外部攻撃から保護します。全体として、Kubernetesにおけるネットワークセキュリティは、クラスターの機密性、整合性、可用性を維持するために重要です。
- 公式 ネットワークポリシー - ドキュメント
- 記事 6つのKubernetesセキュリティベストプラクティス
- 記事 Kubernetesネットワークセキュリティの効果
- 記事 ニュースに出ないためのKubernetesセキュリティベストプラクティス
- 動画 Kubernetesセキュリティのベストプラクティス
- フィード セキュリティに関するトップ投稿を探索
◇コンテナとポッドのセキュリティ
Kubernetes(k8s)は、信頼できるコンテナイメージの使用、コンテナの権限制限、ポッドレベルのセキュリティポリシーの実施、ネットワークセキュリティ対策の実装、RBACを使用したアクセス制御、SecretsとConfigMapsを使用した機密情報の管理などの手段を通じて、コンテナとポッドを保護できます。これらのプラクティスは、組織がk8sクラスターでのセキュリティインシデントのリスクを減らすのに役立ちます。
- 公式 ポッドまたはコンテナのセキュリティコンテキストを設定する
- 記事 チュートリアル:Kubernetesポッドセキュリティポリシーを作成する
- 記事 見過ごされがちだが重要なKubernetesセキュリティ機能6選
- 動画 Kubernetesセキュリティ - ポッドまたはコンテナのセキュリティコンテキスト
- フィード セキュリティに関するトップ投稿を探索
◇セキュリティスキャナー
Kubernetesセキュリティスキャナーは、デプロイ前にコンテナイメージの脆弱性と潜在的なセキュリティ脅威を特定するのに役立ちます。人気のあるオプションには、Aqua Security、Twistlock、Sysdig Secure、Trivy、Anchore Engine、OpenSCAPなどがあります。これらのスキャナーは、脆弱性スキャン、コンプライアンスチェック、Kubernetes環境のランタイム保護など、さまざまな機能を提供します。これらのスキャナーをパイプラインに統合することで、組織はKubernetesデプロイのセキュリティと整合性を確保し、セキュリティ侵害とデータ損失のリスクを最小限に抑えることができます。
- 記事 8つ以上のオープンソースKubernetes脆弱性スキャナー
- 記事 7つのKubernetesセキュリティスキャナー
- 記事 CI/CDを通じた自動化されたイメージスキャンでセキュリティを向上させる
- 記事 Starboard:すべてのKubernetesセキュリティピースを1つにまとめる
- フィード セキュリティに関するトップ投稿を探索
9. モニタリングとロギング
Kubernetes(k8s)におけるモニタリングは、クラスタとそのコンポーネントの健全性とパフォーマンスを監視することを指します。これには、CPU、メモリ、ストレージなどのリソースの使用率と可用性、およびk8sサービスとノードの状態を監視することが含まれます。k8sのモニタリングソリューションとして人気のあるものには、Prometheus、Grafana、Datadogなどがあります。
k8sにおけるロギングは、アプリケーション、ポッド、ノードなど、クラスタ内のさまざまなコンポーネントによって生成されるログを収集し、分析することを指します。これらのログは、クラスタの動作とパフォーマンスに関する洞察を提供し、問題のトラブルシューティングにも役立ちます。k8sのロギングソリューションとして人気のあるものには、Fluentd、Elasticsearch、Kibanaなどがあります。
- 公式 リソース使用量のモニタリングツール
- 公式 モニタリング、ロギング、デバッグ
- 公式 ロギングアーキテクチャ
- フィード ロギングに関するトップ投稿を探索
◇ログ
ログは、クラスタ内のノード上で実行されているコンテナ化されたアプリケーションによって生成されます。これらのログには、kubectl logs
コマンドの後にポッド名を指定してアクセスできます。デフォルトでは、このコマンドはポッド内の最新のコンテナからのログを表示しますが、コマンドにコンテナ名を追加することで、ポッド内の特定のコンテナのログを指定できます。コマンドに-f
フラグを追加すると、ログをリアルタイムで追跡できます。また、EFKやPrometheusスタックなどのサードパーティのロギングソリューションも利用可能で、大規模なアプリケーションに対してより高度なロギング機能とスケーラビリティを提供します。
- 公式 システムログ
- 動画 Kubernetes: ログ収集の解説
◇メトリクス
監視すべきメトリクスには、CPU使用率、メモリ使用率、ネットワーク使用率、ディスク使用率、APIサーバーメトリクス、ポッドおよびコンテナのメトリクス、クラスタレベルのメトリクスなどがあります。これらのメトリクスは、クラスタ、ノード、およびクラスタ上で実行されているアプリケーションのパフォーマンスと健全性に関する洞察を提供します。Kubernetesは、これらのメトリクスを収集し分析するためのツールとして、Prometheus、Grafana、Kubernetes Dashboardを提供しています。これらのメトリクスを監視することで、管理者はパフォーマンスの問題を特定し、クラスタを最適化してパフォーマンスとスケーラビリティを向上させることができます。
- 公式 ノードメトリクスデータ
- 動画 K8sでメトリクスを収集する方法
◇トレース
Kubernetesにおけるトレースは、JaegerやZipkinなどのツールを使用して、システムのさまざまなコンポーネントを通過するリクエストの流れを監視することを指します。OpenTracingとOpenCensusは、クラスタ上で実行されている異なるコンポーネントやアプリケーション間で一貫した方法でトレースをキャプチャする方法を提供します。トレースは、パフォーマンスのボトルネックを特定し、問題をデバッグし、システムを最適化してパフォーマンスとスケーラビリティを向上させるのに役立ちます。Kubernetesでトレースを監視することで、管理者は問題を特定し、システムの効率的なパフォーマンスを確保するための是正措置を講じることができます。
◇リソースの健全性
Kubernetesにおけるリソースの健全性監視は、ポッド、ノード、コンテナなどのリソースの健全性と可用性を監視することを指します。これにより、管理者はKubernetes Dashboard、Prometheus、Grafanaなどのツールを使用して、システムのパフォーマンスと可用性に影響を与える可能性のある問題を特定し、トラブルシューティングを行うことができます。リソースの健全性監視は、システムが障害に強く、どのような混乱からも迅速に回復できることを保証するのにも役立ちます。これはKubernetesクラスタを管理する上で重要な部分であり、システムの信頼性、可用性、スケーラビリティを確保します。
◇オブザーバビリティエンジン
Kubernetes(k8s)におけるオブザーバビリティとは、クラスタ、アプリケーション、およびその上で実行されているサービスの内部動作を把握する能力を指します。k8sのオブザーバビリティエンジンは、k8s環境内のさまざまなソースからのデータを収集、分析、可視化するためのツールまたはプラットフォームです。k8sで人気のあるオブザーバビリティエンジンには、Prometheus、Grafana、Jaeger、Elastic Stack(ELK)などがあります。
- オープンソース K8sGPT - Kubernetesの問題をスキャンするAIツール
- オープンソース HolmesGPT - Kubernetesの問題とPrometheusアラートを調査するAIOpsプラットフォーム
- 記事 Kubernetesオブザーバビリティ101: ツール、ベストプラクティス、その他
- 記事 KubeSphereにおけるKubernetesオブザーバビリティ
- フィード オブザーバビリティに関するトップ投稿を探索
10. オートスケーリング
Kubernetesにおけるオートスケーリングは、需要に基づいてデプロイメントまたはポッドのセットに割り当てられたリソースを調整することを指します。これには、Horizontal Pod Autoscaling(HPA)とVertical Pod Autoscaling(VPA)が含まれ、それぞれレプリカを増減したり、リソースのリクエストと制限を調整したりします。オートスケーリングは、Cluster Autoscalingと組み合わせて使用することで、リソースを効率的に割り当て、アプリケーションの応答性を確保します。変動するワークロードやトラフィックの急増に対処するのに役立ちます。
◇Horizontal Pod Autoscaler (HPA)
これは、Kubernetesの機能で、実行中のワークロードの現在の需要に基づいて、ポッドのレプリカ数を自動的にスケーリングします。HPAコントローラは、ポッドのCPU使用率やその他のメトリクスを監視し、指定されたターゲットを満たすためにポッドのレプリカ数を調整します。これにより、ワークロードがトラフィックや需要の増加に対処できるようになり、クラスタのリソースが過負荷になるのを防ぎます。
◇Vertical Pod Autoscaler (VPA)
Vertical Pod Autoscaler(VPA)は、Kubernetesの機能で、ポッド内のコンテナのリソース制限を自動的に調整するプロセスを自動化します。Horizontal Pod Autoscaler(HPA)がポッドのレプリカ数をスケーリングするのに対し、VPAはポッドのコンテナに割り当てられたリソースをスケーリングします。実際の使用状況に基づいて、各コンテナのリソースリクエストと制限を調整します。
◇Cluster Autoscaling
Cluster Autoscalingは、Kubernetesの機能で、ノードのリソース使用率に基づいてクラスタを自動的にスケーリングします。ノードの使用率を監視し、ワークロードを処理するために適切な量のリソースが利用可能であることを保証するために、ノードを作成または削除します。Cluster Autoscalingを実装するための異なるアプローチがあり、Horizontal Pod AutoscalerやCluster Autoscalerを使用する方法があります。これは、ワークロードが大きく変動するシナリオで有用であり、アプリケーションが応答性を保ち、可用性を維持するために、クラスタサイズを手動で調整する必要がありません。
11. スケジューリング
Kubernetesにおけるスケジューリングとは、クラスター内の特定のノードにワークロードを割り当てるプロセスを指します。Kubernetesスケジューラーは、リソースの可用性、ノードの適合性、ワークロードの優先順位などの要因に基づいてスケジューリングの決定を行います。クラスター全体でワークロードのバランスを取り、効率的なリソース使用を確保し、ノードの過負荷を回避します。スケジューリングは、地理的位置、ハードウェア要件、アプリケーション固有のニーズなどの要因を考慮します。
◇スケジューリングの基本
スケジューリングは、リソースの可用性、ラベル、アフィニティ/アンチアフィニティルール、テイント、許容などの基準に基づいてポッドをワーカーノードに割り当てることを含みます。ポッドはk8sにおける最小のデプロイ可能な単位であり、同じネットワーク名前空間を共有する1つ以上のコンテナで構成されています。スケジューラーはポッドをノードに割り当てる責任があり、ラベルはマッチングに使用されます。アフィニティおよびアンチアフィニティルールは、他のポッドやノードとの関係に基づいてポッドがどのようにスケジュールされるかを規定します。QoSはリソース要件に基づいてポッドスケジューリングの優先順位付けに使用されます。
◇テイントと許容
テイントと許容はKubernetesで使用され、ラベルに基づいて特定のノードでのポッドのスケジューリングを制限または許可します。テイントはノードに適用されるラベルで、特定の制限や要件を示します。許容はポッドに適用されるラベルで、特定のテイントを許容できることを示します。ノードにテイントがある場合、対応する許容を持つポッドのみがそのノードにスケジュールできます。この機能は、重要なワークロードと重要でないワークロードの分離の確保、特定のタスク用のノードの予約、ノードの過負荷からの保護など、様々な目的に役立ちます。
◇トポロジー分散制約
トポロジー分散制約は、クラスターのトポロジー全体でポッドの均等な分散を確保します。制約は、ノード、ゾーン、ラックなどの特定のレベルで実行できる特定のタイプのポッドの数に関するルールを定義します。これらの制約は、重要なワークロードが複数のゾーンに分散されることを確保するなど、特定のニーズに合わせてカスタマイズできます。リソースの過負荷を防ぎ、ワークロードのバランスの取れた分散を促進することで、単一障害点を防ぎ、アプリケーションの回復力を向上させます。制約はKubernetes APIまたはコマンドラインインターフェイスを使用して追加できます。
◇ポッドの優先順位
Kubernetesのポッド優先順位は、リソースに対する競合する要求がある場合に、ポッドがノードにスケジュールされる順序を決定します。各ポッドには数値の優先順位値が割り当てられ、値が高いほど優先順位が高いことを示します。スケジューラーは、ノードの適合性、テイントと許容、アフィニティとアンチアフィニティルールも考慮しながら、スケジュールされたポッドの総優先順位を最大化します。優先順位は、ビジネスロジックやアプリケーション要件に基づいて手動または自動で設定できます。優先順位は、重要なワークロードが必要なリソースを受け取り、最初にスケジュールされることを確保し、優先順位の低いワークロードはリソースが利用可能になったときにスケジュールされます。
◇退避
退避はリソース制約やポッドの障害などの理由により、ノードから実行中のポッドを終了または削除します。システムによって開始されるか、管理者がAPI経由で手動で開始することができます。退避は、ポッドがリソースをクリーンアップすることを許可する優雅なものか、直ちにそれらを終了する強制的なものかのどちらかです。Kubernetesは、退避を効果的に処理し、サービスの中断を最小限に抑えるためのプリエンプションとポッド中断予算を提供します。退避はKubernetesクラスターを管理・維持するために必要であり、Kubernetesはそれらを処理するためのツールを提供します。
- 公式 ノード圧力による退避
- 公式 API開始による退避
12. ストレージとボリューム
ボリュームはポッドで実行されているコンテナがアクセスできるディレクトリを提供し、様々なストレージタイプによってバックアップされます。永続ボリュームはポッドから独立しており、複数のポッドによって再利用できます。永続ボリューム要求は永続ボリュームから特定の量のストレージを要求します。ストレージクラスにより、管理者は動的にプロビジョニングできる異なるストレージタイプを定義できます。
◇CSIドライバー
CSI(Container Storage Interface)ドライバーはKubernetesにおいて、ストレージプロバイダーがKubernetesと統合し、コンテナ化されたアプリケーションに永続ストレージを提供するための標準的な方法を提供します。それらは別のコンテナ化されたプロセスとして動作し、明確に定義されたAPIを通じてKubernetesと通信します。CSIドライバーによりKubernetesは幅広いストレージシステムにアクセスし、スナップショットやクローニングなどの高度な機能を提供できます。
◇ステートフルアプリケーション
Kubernetesでは、ステートフルアプリケーションにはストレージが重要なコンポーネントです。これらのアプリケーションはアプリケーションの複数のレプリカ間で利用可能な永続的なデータストレージを必要とするためです。Kubernetesはボリューム、永続ボリューム、ストレージクラスなど、ストレージのための複数のオプションを提供します。
ボリュームはKubernetesにおけるストレージの基本的な構成要素です。ボリュームはアプリケーションを実行しているコンテナからアクセス可能なディレクトリであり、ホストディレクトリ、クラウドプロバイダーディスク、ネットワークストレージシステムなど、さまざまなタイプのストレージによってバックアップできます。ボリュームはKubernetesによって作成・管理され、ポッド定義の一部としてコンテナにマウントできます。
13. デプロイメントパターン
デプロイメントはクラスター全体でアプリケーションコンテナのロールアウトとスケーリングを宣言的に管理するために使用されるKubernetesリソースです。デプロイメントによりチームはデプロイメントの望ましい状態を定義し、その状態を達成するために基盤となるポッドとレプリカセットを自動的に管理できます。KubernetesはRollingUpdateやCanaryなど、アプリケーションの新バージョンがどのようにロールアウトされスケールされるかを制御するための様々なデプロイメント戦略を提供します。
◇CI/CD統合
CI/CDとKubernetesの統合には、アプリケーションをKubernetesクラスターにビルドしてデプロイするためのパイプラインのセットアップが含まれます。このプロセスには通常、アプリケーションコードの開発、ソースコードリポジトリのセットアップ、CI/CDツールの選択、Dockerイメージのビルド、イメージをコンテナレジストリにプッシュ、Kubernetesマニフェストを使用したアプリケーションのデプロイ、そして必要に応じてパイプラインとデプロイメントの監視とトラブルシューティングが含まれます。アプリケーションのテストとデプロイメントを自動化することで、KubernetesによるCI/CDはソフトウェア品質の向上、開発の迅速化、一貫性のある信頼できるデプロイメントの確保に役立ちます。
◇GitOps
GitOpsは、Gitリポジトリを宣言的な構成の信頼できる情報源として使用し、インフラストラクチャとアプリケーションを管理するための一連のプラクティスです。Kubernetesでは、GitOpsにはシステムの望ましい状態と実際の状態の両方に対してGitを単一の信頼できる情報源として使用すること、デプロイメントと管理タスクを自動化すること、そして多くの場合、継続的デリバリー(CD)プラクティスと組み合わせて使用することが含まれます。その結果、インフラストラクチャとアプリケーションをより一貫性のある、信頼性の高い、自動化されたアプローチで管理できます。
◇Helmチャート
Helmは、再利用可能でバージョン管理されたHelmチャートを通じて複雑なアプリケーションのデプロイメントと管理を簡素化するKubernetesパッケージマネージャーです。これらのチャートは関連するKubernetesリソースのセットを記述するYAMLファイルで構成され、値ファイルとGoテンプレートを使用したテンプレート化によってカスタマイズできます。Helmチャートは他のチャートに依存することもでき、簡単な共有とアクセスのためにHelm Hubのような一元化されたリポジトリに保存できます。Helmを利用することで、チームはアプリケーション管理を合理化し、労力の重複を減らすことができます。
◇カナリアデプロイメント
カナリアデプロイメントは、ユーザーまたはトラフィックの小さな割合を新バージョンに向けながら、大多数が古いバージョンを使用し続けることで、アプリケーションの新バージョンを徐々にロールアウトするためにKubernetesで使用される技術です。このアプローチにより、アップデートに完全にコミットする前に、実際の環境下で新バージョンをテストすることができます。Kubernetesでは、カナリアデプロイメントはIstio、Linkerd、Nginxなどのツールを使用するか、デプロイメント戦略やトラフィックルーティングなどの組み込み機能を使用して実装できます。
◇ブルーグリーンデプロイメント
これはKubernetesで使用されるデプロイメント戦略で、現在のバージョン(ブルー)と新しいバージョン(グリーン)の2つの同一の本番環境を実行することで、アプリケーションの新バージョンをデプロイします。グリーン環境が完全にテストされた後、トラフィックはブルー環境からグリーン環境にルーティングされ、ユーザーにシームレスな移行を提供し、ダウンタイムや中断を回避します。Kubernetesでは、ブルーグリーンデプロイメントはデプロイメント戦略、トラフィックルーティング、ロードバランシングなど、様々なツールや技術を使用して実装できます。
◇ローリングアップデート/ロールバック
ローリングアップデートはKubernetesにおけるデプロイメント戦略で、既存のポッドを新バージョンで徐々に更新しながら、プロセス全体を通してアプリケーションが利用可能であることを確保しています。Kubernetesはチームがローリングアップデートを構成して、一度にポッドの特定のパーセンテージを更新し、アップデートを続行する前にそれらが利用可能になるのを待つことができます。問題が発生した場合、Kubernetesはロールバックメカニズムを提供し、チームがアプリケーションの以前のバージョンに簡単に戻すことができます。
14. Kubernetes高度なトピック
Kubernetesは、カスタムリソースとコントローラーで拡張でき、複雑なアプリケーションやワークフローを管理できます。ポッドとサービス間の通信をサポートするために、サービスメッシュやネットワークポリシーを含む様々なネットワークモデルを提供しています。また、アプリケーションのデプロイとアップデートを自動化するために、様々なCI/CDツールやプラットフォームと統合できます。K8sはローカルストレージ、ネットワークアタッチドストレージ(NAS)、クラウドストレージプロバイダーなど、ストレージを管理するための様々なオプションを提供しています。
◇カスタムコントローラーの作成
Kubernetesのカスタムコントローラーは、Kubernetesがネイティブにサポートしていないカスタムリソースの管理を自動化します。これらはカスタムリソースを監視し、その状態の変化に反応するKubernetesコントローラーとして実装されています。カスタムリソースは、組織のニーズに特化した新しいリソースタイプでKubernetes APIを拡張することによって作成されます。カスタムコントローラーは、Operator Frameworkなど、様々なプログラミング言語やフレームワークを使用して開発できます。Operator Frameworkは、カスタムコントローラーの開発、テスト、デプロイのためのツールとベストプラクティスを提供します。
◇カスタムスケジューラーとエクステンダー
Kubernetesのカスタムスケジューラーエクステンダーは、カスタムメトリクスと制約に基づいて独自のスケジューリングロジックを定義できるようにすることで、Kubernetesのスケジューリング機能を強化します。これらはKubernetesスケジューラーと並行して実行されるカスタムKubernetesコントローラーとして実装されています。カスタムスケジューラーエクステンダーは、組織のニーズに特化したスケジューリングポリシーを実装するために使用でき、様々なプログラミング言語で開発できます。これらはスケジューリング要求を傍受し、ユーザー定義のルールに基づいてカスタムスケジューリングロジックを追加し、要求をKubernetesスケジューラーに戻します。
◇カスタムリソース定義(CRDs)
Kubernetesのカスタムリソース定義(CRDs)は、組織のニーズに特化した新しいリソースタイプを定義することでKubernetes APIを拡張します。CRDsはアプリケーション、データベース、ストレージ、ネットワークなど、様々なリソースを管理できるカスタムリソースを作成します。これらはYAMLまたはJSONマニフェストを使用して定義され、Kubernetes APIサーバーを使用して作成および管理できます。作成されると、カスタムリソースはKubernetesコントローラーを使用して管理でき、他のKubernetesコンポーネントと統合できます。CRDsはKubernetesでの運用を効率化し、組織がより効率的かつカスタマイズされた方法でリソースを管理できるようにするための強力なツールです。
◇Kubernetes拡張とAPI
Kubernetes(k8s)拡張とAPIは、Kubernetesの動作をカスタマイズし、システムに新しい機能を追加するために使用されます。カスタムリソース定義(CRDs)、カスタムコントローラー、カスタムスケジューラーエクステンダー、カスタムメトリクスAPIなどのKubernetes拡張は、Kubernetes機能を強化します。Kubernetes APIは、Kubernetesクラスター内のリソースを管理し、システムと対話するために使用されます。Kubernetes拡張とAPIを組み合わせることで、Kubernetesをカスタマイズおよび拡張するための強力なツールキットが提供され、ユーザーはKubernetesでの運用を効率化するカスタムコンポーネントとAPIを構築できます。
◇クラスター運用
独自クラスター
独自のKubernetesクラスターを作成するには、クラウドプロバイダーを選択するか独自のインフラストラクチャをセットアップし、インフラにKubernetesをインストールし、ネットワーク、ストレージ、セキュリティを設定してクラスターを構成し、Kubernetesマニフェストを使用してアプリケーションをデプロイし、Kubernetesダッシュボード、kubectl、Prometheusなどのツールを使用してクラスターを監視および管理する必要があります。このプロセスは複雑で時間がかかる場合がありますが、インフラストラクチャを完全に制御でき、特定のニーズに合わせてカスタマイズすることができます。
コントロールプレーンのインストール
コントロールプレーンのコンポーネントは、クラスターに関するグローバルな決定(例えば、スケジューリング)を行い、クラスターイベント(例えば、デプロイメントのレプリカフィールドが満たされていない場合に新しいポッドを起動する)を検出して対応します。コントロールプレーンコンポーネントはクラスター内の任意のマシンで実行できます。ただし、シンプルにするために、セットアップスクリプトは通常、すべてのコントロールプレーンコンポーネントを同じマシンで起動し、このマシンでユーザーコンテナを実行しません。
ワーカーノードの管理
Kubernetesは、コンテナをPodsに配置してノード上で実行することで、ワークロードを実行します。ノードは、クラスターに応じて仮想マシンまたは物理マシンである場合があります。各ノードはコントロールプレーンによって管理され、Podsを実行するために必要なサービスが含まれています。
マルチクラスター管理
Kubernetes(k8s)のマルチクラスター管理とは、単一のコントロールプレーンを使用して複数のKubernetesクラスターを管理する機能を指します。このアプローチにより、管理者は複数の管理コンソールやツール間を切り替えることなく、場所に関係なく複数のクラスター全体でリソースを一元的に管理およびオーケストレーションできます。