DUICUO

クラウドコンピューティングのパワーを解き放つ: Kubernetes の深掘り

I. Kubernetes とは何ですか?

Kubernetesは、大規模なコンテナ化されたアプリケーションの管理を容易にするオープンソースのコンテナオーケストレーションおよび管理ツールです。アプリケーションのデプロイ、スケーリング、アプリケーションのヘルスチェック、障害復旧などのタスクを自動化し、可観測性、回復力、自己修復などのコア機能を提供することで、アプリケーションの効率性と信頼性を効果的に向上させます。

1. Kubernetesの紹介

Kubernetes は、コンテナを通じてアプリケーションと環境を分離し、それらを自己完結型のユニットで展開および管理することで、アプリケーションの展開と管理をよりシンプルかつ自動化することを目的としています

Kubernetes は、アプリケーションの展開、管理、自動化、可観測性などの主要な機能を統合するように設計されており、可用性、弾力性、拡張性が高く、自己修復機能を備えたアプリケーション管理プラットフォームを提供します。

2. Kubernetesの開発の歴史

Kubernetes はもともと Google によって開発され、2014 年に Cloud Native Computing Foundation に寄贈されました。その過程で、Kubernetes は安定した API を導入し、管理できるコンテナ化されたアプリケーションを拡張し、ますます多くの貢献者とユーザーを引き付けました。

3. Kubernetesの主な機能

  1. コンテナオーケストレーション:Kubernetesは、コンテナのデプロイ、スケーリング、ヘルス管理を自動化します。KubernetesはアプリケーションをPod単位でスケジュールすることで、複数のコンテナ間でリソースをより効率的に共有し、データを同期できるようにします。
  2. クラスター管理: Kubernetes は、ノードのステータスから、負荷分散、障害回復、自動スケーリングなどのクラウド プラットフォーム全体の管理まで、クラスター全体を管理できます。
  3. サービス検出と負荷分散: Kubernetes には、サービスが互いを検出できるようにする組み込みのサービス検出および負荷分散メカニズムが用意されており、インフラストラクチャの安定性とスケーラビリティが向上します。
  4. ストレージ オーケストレーション: Kubernetes は、クラウド ストレージ、ローカル ストレージ、永続ボリュームなど、アプリケーション向けのさまざまなストレージ ソリューションを提供できます。

次の例では、Kubernetes アプリケーション構成ファイルを使用して上記の機能を説明します。

 apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:v1 ports: - containerPort: 8080 volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: myappdata --- apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: myapp ports: - name: http protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer

この設定ファイルは、myapp という名前の Deployment と myapp という名前の Service を定義しています。Deployment の spec フィールドでは実行する Pod レプリカの数を定義し、Selector フィールドではこの Deployment に含める Pod を指定します。

`template` フィールドでは、Pod の仕様を定義できます。この例では、Pod には `myapp` というコンテナが含まれており、これは `myapp:v1` というイメージから実行されます。コンテナは、Kubernetes がコンテナの内部ファイルシステムの `/mnt/data` に `data` という永続ボリュームをマウントできるようにポートを公開しています。

YAMLファイルの後半では、myappというServiceが定義されています。このServiceは、spec.selectorを使用して指定されたDeployment内のPodを選択します。ここでは、app=myappのPodが選択されています。このServiceは、クライアントからのリクエストをPodが公開するポートに転送します。また、ServiceのタイプはLoadBalancerとしてデプロイされることを指定しています。

上記は、Kubernetes 構成ファイルの基本的なデモンストレーションと、Kubernetes の主な機能を実装する方法です。

II. Kubernetesの基本概念

1. ポッド

ポッド

PodはKubernetesにおける最小の操作単位です。コンテナを包むラッパーであり、通常は1つ以上の密接に関連するコンテナで構成されます。Pod内のすべてのコンテナは同じネットワークと共有ボリュームにアクセスできるため、コンテナ間でのデータ共有と通信が可能になります。

2. コントローラー

コントローラ

  • コントローラーは、Podの起動、停止、管理を担当し、ユーザーの要件に従ってPodが正常に実行されるようにします。一般的なコントローラーには、Deployment、ReplicaSet、StatefulSetなどがあります。
  • デプロイメント コントローラー: ユーザー定義のポリシーに従って Pod レプリカの数がデプロイおよび管理されていることを確認し、ローリング アップグレードとロールバック操作をサポートします。
  • ReplicaSet コントローラーはデプロイメントの基盤となるコントローラーであり、指定された数の Pod レプリカがクラスター内で実行されていることを確認します。
  • StatefulSet コントローラー: ステートフル アプリケーションを管理し、規則的なデプロイメントとアップグレードをサポートするために使用されます。

3. サービス

サービス

サービスはKubernetesサービスの抽象化レイヤーです。外部に一意のIPアドレスとDNS名を提供し、サービスポートを介して特定のPod IPにマッピングします

このサービスは、負荷分散とノード間アクセスもサポートしています。

4. 名前空間

名前空間

名前空間は、Kubernetes クラスター内の仮想リソースのコレクションであり、さまざまなリソースを分離し、リソース名の競合を防ぐために使用されます

デフォルトでは、Kubernetes クラスターにデフォルトの名前空間が存在しますが、ユーザーが独自の名前空間を作成することもできます。

5. ノード

ノード

ノードはKubernetesクラスター内のワーカーノードです。物理マシンまたは仮想マシンのいずれかです。各ノードはKubernetes kubeletコンポーネントを実行し、Podのライフサイクル管理を担います。また、各ノードにはサービスプロキシをサポートするためにkube-proxyコンポーネントも必要です。

6. ボリューム

音量

ノードはKubernetesクラスター内のワーカーノードです。物理マシンまたは仮想マシンのいずれかです。各ノードはKubernetes kubeletコンポーネントを実行し、Podのライフサイクル管理を担います。また、各ノードにはサービスプロキシをサポートするためにkube-proxyコンポーネントも必要です。

7. 永続ボリューム

永続ボリューム

ボリュームは、Kubernetesにおける永続的なデータストレージに使用される抽象的な概念です。ボリュームは動的に割り当てたり、事前割り当てしたりすることができ、複数のPodによる共有の読み取り/書き込み操作をサポートします。Kubernetesは、emptyDir、hostPath、NFS、PersistentVolumeなど、さまざまなボリュームタイプをサポートしています。

8. 永続ボリューム

永続ボリューム

これはKubernetesにおける永続ストレージサービスです。ストレージリソースの利用率を向上させ、ストレージリソースの管理を簡素化し、複数のPodで共有可能なアプリケーション向けストレージサービスを提供することを目的としています。

9. 展開

展開

デプロイメントはKubernetesで最も一般的に使用されるコントローラーの1つであり、ユーザー定義のポリシーに従ってポッドがデプロイおよび管理されることを保証するために使用され、ローリングアップグレードとロールバックをサポートします。デプロイメントを使用すると、ユーザーはデプロイメント仕様オーケストレーションを通じて、ポッドのレプリカ数、イメージバージョン、環境変数などを定義できます。

10. 秘密

秘密

11. 構成マップ

構成マップ

ConfigMapはKubernetes内のオブジェクトであり、構成データをアプリケーションプロセスから分離することで、アプリケーションの構成管理を容易にします。ConfigMap内のデータは、環境変数またはファイルとしてアプリケーションに挿入できるため、アプリケーションのデプロイと管理が簡素化されます。

III. コンテナ化技術の紹介

コンテナ化は、アプリケーションとその実行環境をまとめてパッケージ化し、本質的に同一のコンピュータ環境で実行できるようにする仮想化テクノロジです。

以下ではコンテナ化技術について簡単に紹介します。

1. コンテナ化の基本原則

コンテナ テクノロジーはオペレーティング システム層に基づく仮想化であり、アプリケーションとそれに依存するランタイム環境をパッケージ化して、ポータブルなソフトウェア コンテナを形成します

コンテナ化により、アプリケーション間の分離とセキュリティを維持しながら、迅速なアプリケーションの展開、繰り返し可能なビルド、クロスプラットフォーム操作が可能になります。

2. コンテナ化技術の利点

従来の仮想化テクノロジー (仮想マシンなど) と比較して、コンテナ化テクノロジーには次のような利点があります。

コンテナ化技術の利点

  • 軽量: 仮想マシンと比較すると、コンテナ テクノロジはより軽量で、消費するシステム リソースが少なくなります。
  • 高速な起動とシャットダウン: 仮想マシンと比較して、コンテナの起動とシャットダウンははるかに高速であり、アプリケーションの展開時間が大幅に短縮されます。
  • 容易な移植性:アプリケーションは、依存関係や環境とともにコンテナにパッケージ化されているため、コンテナ技術をサポートするあらゆるプラットフォームで、変更を加えることなく実行できます。この移植性により、アプリケーションの開発と展開の柔軟性が向上します。
  • 再現可能なビルド: コンテナ内に含まれるすべてのコンポーネントをアプリケーションと一緒にパッケージ化できるため、どのマシンでも一貫したアプリケーション パフォーマンスが保証されます。
  • 管理が容易: コンテナはコードを通じて構成および管理でき、同じコードを複数の異なる環境に展開できるため、管理効率が向上します。

3. 主流のコンテナ技術

主流のコンテナ技術

  • Dockerは業界で最も人気のあるクロスプラットフォーム コンテナ化ソリューションであり、イメージ構築、イメージ管理、コンテナ オーケストレーションなどを含む完全なコンテナ化テクノロジ スタックを提供します。
  • Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理のためのオープンソースのコンテナオーケストレーションプラットフォームです。Kubernetesは、自動スケーリング、負荷分散、自動リカバリなど、多くの機能を提供しており、コンテナクラスターの管理をよりシンプルかつ効率的にします。
  • OpenShiftは、Red Hatが管理するKubernetesベースのエンタープライズグレードのコンテナ化アプリケーションプラットフォームです。DevOps、マルチテナント、自動スケーリングなど、多くのツールと機能を備え、包括的なコンテナ化ソリューションとなっています。
  • LXC/LXDは、仮想マシンと同様の分離機能とセキュリティ機能を提供するカーネルベースのコンテナ仮想化方式です。

4. コンテナ化技術の応用シナリオ

コンテナ化技術は、以下の分野で広く利用されています。

コンテナ化技術の応用シナリオ

  • DevOps : コンテナ化テクノロジーにより、アプリケーションの導入、テスト、リリースが加速され、DevOps プロセスの効率が向上します。
  • マルチテナント アプリケーション: コンテナ化テクノロジーにより、複数の顧客に個別のアプリケーション インスタンスを提供できるため、顧客データとコンピューティング リソースの分離、管理、制御が可能になります。
  • 継続的インテグレーション/継続的デリバリー: コンテナ化テクノロジーは、アプリケーションとその依存コンポーネントを単一のコンテナ イメージに結合することで、継続的インテグレーションと継続的デリバリーをより簡単に、より信頼性の高いものにします。
  • クラウド プラットフォーム: コンテナ化テクノロジーにより、クラウド プラットフォーム上のアプリケーションの展開と管理が簡素化され、クラウド環境間でのアプリケーションの移植性が向上します。

IV. Kubernetesのコンテナとポッド

Kubernetes のコンテナとポッド

Kubernetes システムでは、コンテナは非常に重要な概念です。

Kubernetes システムの主な機能の 1 つは、コンテナ レベルでアプリケーションをスケーリングおよび管理することです。

コンテナは、アプリケーションを単一のランタイム環境にカプセル化する、軽量なオペレーティングシステムレベルの仮想化技術です。コンテナ内には、アプリケーションとその実行に必要なすべてのものがパッケージ化され、単一のポータブルなユニットを形成します。コンテナは、開発者のラップトップ、ローカル開発環境、本番環境など、あらゆる環境で実行できます。

Pod は、Kubernetes システム内のコンテナに最も密接に関連する概念です。

Podは、Kubernetesシステムにおいてデプロイ可能な最小のプロセス単位です。Podは、ネットワーク名前空間、ストレージ名前空間、そして基盤となるストレージ容量を共有する1つ以上のコンテナの集合です。Pod内のコンテナは相互に通信することができ、より複雑なアプリケーションを構成できます。

例えば、Webアプリケーションを実行する場合、Webコンテナとデータベースコンテナが必要になることがあります。これらの2つのコンテナはPodを形成し、相互通信を可能にします。Pod内のコンテナは同じネットワーク名前空間とストレージ名前空間を共有するため、互いのネット​​ワークとストレージに直接アクセスでき、異なるコンテナ間でのデータ転送におけるレイテンシを削減し、データ共有を可能にします。

ポッドは、アプリケーションのスケーリングと管理をサポートするように設計されています。ポッドはKubernetesクラスター内の異なるノードで実行できるため、可用性とパフォーマンスが向上します。Kubernetesシステムはポッド内でコンテナを作成および破棄できるため、アプリケーション実行時の復元力とスケーラビリティが向上します。また、Kubernetesは柔軟なスケジューリングメカニズムも提供しており、アプリケーションのニーズに応じてクラスターからポッドを動的に選択できます。

まとめると、コンテナとポッドはKubernetesにおいて重要な概念です。コンテナは移植可能なランタイム環境を提供し、ポッドは最小限のデプロイ可能なプロセス単位を提供することで、アプリケーションをより小さく管理しやすいチャンクに分割することを可能にします。この設計は、高可用性、パフォーマンス向上、耐障害性向上など、多くのメリットをもたらします。今日のクラウドコンピューティングとコンテナ化された世界において、Kubernetesのコンテナとポッドの概念は不可欠なテクノロジーとなっています。

V. Kubernetes のサービスとイングレス

Kubernetes クラスターでは、Service と Ingress は 2 つの非常に重要な概念であり、どちらもアプリケーション アクセスとトラフィック ルールを制御するために使用されます。

サービスは、Podの論理グループを定義し、それらに安定したIPアドレスとDNS名を提供するために使用される抽象的な概念です。ネットワーク抽象化レイヤーとして、Serviceはアプリケーションが固定された安定したネットワーク識別子を介してPodにアクセスできるようにします。また、ServiceはトラフィックがバックエンドPodに均等に分散されるように、負荷分散戦略も定義します。

Kubernetes では、サービスには次の機能があります。

  • アプリケーションに安定した IP と DNS 名を提供します。
  • 透過的な負荷分散戦略を使用して、トラフィックをバックエンド ポッドに分散します。
  • さまざまなレベルのトラフィック分散をサポートするために、内部または外部のアクセス メカニズムを提供します。

Kubernetes クラスターでは、Ingress を使用して外部サービスへのアクセスを提供できます。Ingress は、クラスター内のサービスへの外部からのアクセスルールを定義するための API オブジェクトです。Ingress の最も一般的なユースケースは、HTTP および HTTPS トラフィックをウェブサイトのバックエンドサービスにルーティングすることです。Ingress は、トラフィックを異なるサービスにルーティングすることでトラフィックを制御し、TLS エンドポイントと名前ベースの仮想ホストをサポートします。また、Ingress は、効率的で信頼性の高いトラフィック配信を実現するために、様々な負荷分散戦略をサポートしています。

Kubernetes では、Ingress には次の機能があります。

  • 外部からのサービスへのアクセス、ルーティング、負荷分散のメカニズムをアプリケーションに提供します。
  • HTTP と HTTPS の両方のトラフィックのルーティングと転送をサポートします。
  • 名前ベースの仮想ホストと TLS エンドポイントをサポートします。

Kubernetesにおいて、ServiceとIngressはアプリケーションアクセスとトラフィック制御に不可欠なメカニズムです。Serviceは安定したIPアドレスとDNS名、そして透過的な負荷分散戦略を提供し、トラフィックがバックエンドPodに均等に分散されることを保証します。一方、IngressはHTTPおよびHTTPSトラフィックをクラスター内の異なるServiceにルーティングし、TLSエンドポイントと名前ベースの仮想ホストをサポートします。Kubernetesにおいて、ServiceとIngressは信頼性、拡張性、そして可用性に優れたアプリケーションを実装するために不可欠なコンポーネントです。

VI. Kubernetesでのデプロイメントとレプリカセット

Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を柔軟かつ強力に行うオープンソースのコンテナ管理プラットフォームです。デプロイメントとレプリカセットは、Kubernetesにおいて重要な概念です。

アプリケーションの複数のコピーを展開および管理するための信頼性が高く制御可能な方法を提供し、それによってアプリケーションの可用性と信頼性が向上します。

Kubernetes でのデプロイメントとレプリカセット

デプロイメントは、アプリケーションの状態とターゲットの状態を定義し、これらの状態の一貫性が保たれるようにするコントローラーです

Deployment は、アプリケーションのレプリカ数、コンテナイメージのバージョン、その他の関連設定を定義します。その後、ReplicaSet を使用して、レプリカ数が想定数と一致するようにします。Deployment で定義されたレプリカ数が実際の数と一致しない場合は、想定数に達するように Pod が自動的に作成または削除されます。また、Deployment はアップグレードとロールバックの制御も提供し、アプリケーションのアップデートとロールバックをより容易かつ管理しやすくします。

ReplicaSet は、 Pod の数を制御するために使用されるコントローラーです

ReplicaSet は、指定された数の Pod が常に実行されていることを保証し、必要に応じて Pod を自動的に作成または削除します。また、コンテナイメージのバージョンやその他の関連設定も定義し、Pod が常に同じ一貫した環境で実行されるようにします。Pod に障害が発生したり削除されたりした場合、ReplicaSet は自動的に新しい Pod を作成し、アプリケーションの安定性と可用性を確保します。

DeploymentとReplicaSetの関係は密接です。DeploymentはReplicaSetを使用してアプリケーションの状態がターゲットの状態と一致することを保証しますが、ReplicaSetはPodをアプリケーションのデプロイメントの最小単位として使用します。この階層的な関係は、Kubernetesシステムにおいて非常に重要です。なぜなら、アプリケーションのデプロイ、スケーリング、管理を信頼性と制御性をもって実現できるからです。

デプロイメントとレプリカセットは、Kubernetes システムにおいて非常に重要な概念です

これらは、アプリケーションのデプロイ、スケーリング、管理を信頼性と制御性に優れた方法で実現します。デプロイメントはアプリケーションの状態とターゲット状態を定義し、レプリカセットを使用してこれらの状態の一貫性を確保します。レプリカセットは、アプリケーションデプロイの最小単位としてポッドを使用し、指定された数のポッドが常に実行されるようにします。この階層的な関係は、Kubernetes システムにおいて非常に重要です。アプリケーションの複数のレプリカを効率的に管理し、アプリケーションの可用性と信頼性を向上させることができるからです。

VII. Kubernetesにおける名前空間とラベル

Kubernetes クラスターでは、名前空間とラベルは 2 つの非常に重要な概念です。

名前空間は、無関係なリソースのグループを作成できる仮想クラスターです

名前空間を使用すると、単一の物理クラスターを複数の論理クラスターに分割し、リソースの分離と名前空間による名前の競合を回避できます。さらに、名前空間はリソースのクォータと制限を設定するメカニズムも提供し、アプリケーションの管理と保護を強化します。

Kubernetes の名前空間とラベル

例えば、クラスター内に複数の部門や環境がある場合、各部門または環境ごとに名前空間を作成できます。各名前空間には独自のリソースクォータと制限を設定することで、アプリケーションを偶発的または悪意のあるリソース消費から保護できます。各名前空間には、Pod、Service、ConfigMap、Secret、Deploymentなど、独自のリソースセットがあり、名前空間内で同じ名前を使用しても競合は発生しません。

ラベルは、Kubernetes システムのもう 1 つの重要な概念です

ラベルは、ポッド、サービス、レプリカセットなどのリソースに付与できるキーと値のペアです。ラベルは、リソースを識別および分類することで、管理と監視を向上させるために使用されます。Kubernetesシステムでは、ラベルは通常、以下の目的で使用されます。

  • ポッドやその他のリソースの機能や環境などの情報を使用してそれらを識別し、より適切に分類して監視できるようにします。
  • リソースを選択してフィルタリングし、グループ化して、削除、更新などの操作を実行できるようにするために使用されます。
  • 特定のノードまたはリージョンにリソースをデプロイできるように、リソースのスケジュールとルーティングを制御するために使用されます。

名前空間とラベルを組み合わせることで、アプリケーションの管理と保護を強化できます。名前空間はリソースの分離と名前空間を提供し、名前の競合やリソースの消費を防ぎます。一方、ラベルはリソースの分類、管理、監視のためのよりきめ細かなメカニズムを提供し、リソースの選択と操作をより適切に制御できます。

名前空間とラベルは、Kubernetes において非常に重要な概念です。

  1. 名前空間は、名前の競合とリソースの消費を回避するための仮想化クラスターとリソース分離のメカニズムを提供します。
  2. ラベルは、リソースの分類、管理、監視のためのより詳細なメカニズムを提供し、リソースの選択と操作をより適切に制御できるようにします。
  3. Kubernetes システムでは、名前空間とラベルを使用することでアプリケーションの管理と保護が向上し、アプリケーションの信頼性と可用性が向上します。

この記事はWeChat公式アカウント「Nezha Programming」から転載したものです。以下のQRコードからフォローできます。転載の許可については、Nezha Programming公式アカウントまでお問い合わせください。