Kubernetesとは何か(K8s)? Kubernetesの基本チュートリアル

Kubernetesとは何か(K8s)? Kubernetesの基本チュートリアル

  • ITOps・DevOps
6分で読めます 更新日 May 6, 2020

ポイント: Kubernetes(K8s)は、コンテナ化されたアプリケーションの管理を自動化し、デプロイメントとスケーラビリティを向上させるオープンソースプラットフォームです。このチュートリアルでは、そのアーキテクチャ、主要なコンポーネント、Minikubeを使用したインストールをカバーします。

  • Kubernetesは、コンピューティング、ネットワーキング、ストレージのワークロードをオーケストレーションします。
  • アプリケーションのための自動ロールアウト、スケーリング、自己修復機能を提供します。

この投稿では、私たちはKubernetes、K8sとも呼ばれるものを説明します。この紹介では、次のことをカバーします:

  • Kubernetesとは
  • それができないこと
  • それが解決する問題
  • K8sのアーキテクチャコンポーネント
  • インストール
  • 代替オプション

この記事では、あなたがKubernetesに不慣れで、その概念と構成要素をしっかり理解したいと考えていることを前提としています。

Kubernetesとは何ですか?

Kubernetesの有用性を理解し始めるためには、まず2つの概念を理解する必要があります: 不変のインフラ と コンテナです。

  • 不変のインフラとは、サーバーがデプロイされた後、決して変更されないという実践です。何かを変更する必要がある場合は、サーバー上で直接行うことはありません。その代わりに、すべての変更が組み込まれた基本イメージから新しいサーバーを構築します。これにより、追加の変更なしに古いサーバーを新しいサーバーに置き換えることができます。
  • コンテナは、コード、ランタイム、システムツール、システムライブラリ、構成をまとめてパッケージ化する方法を提供します。この出荷物は軽量でスタンドアロンの実行可能ファイルです。これにより、アプリケーションは、実行場所(例:Ubuntu、Windowsなど)に関係なく、常に同じように動作します。コンテナ化は新しい概念ではありませんが、マイクロサービスとDockerの台頭とともに非常に人気を集めています。

これらの概念を武器に、Kubernetesをコンテナまたはマイクロサービスプラットフォームとして定義することができます。これは、コンピューティング、ネットワーキング、およびストレージインフラストラクチャのワークロードをオーケストレーションします。アプリケーションをデプロイするタイプを制限しないため(任意の言語が機能します)、Kubernetesは、コンテナ化されたアプリケーションをスケールする方法を拡張し、真の不変のインフラストラクチャのすべての利点を享受できるようにします。K8Sの一般的なルール:アプリがコンテナに収まる場合、Kubernetesはそれをデプロイします。ところで、「Kubernetes」という名前の由来を疑問に思っている場合、それはギリシャ語で「操縦士」または「パイロット」を意味します。略語K8sは、「ubernete」の8文字を数字の8に置き換えることによって派生しています。Kubernetesプロジェクトは、2014年にGoogleによってオープンソース化され、10年以上にわたり生産ワークロードを大規模に実行するために使用されてきました。Kubernetesは、動的にスケーリング可能なコンテナ化アプリケーションを実行し、管理のためのAPIを活用する能力を提供します。Kubernetesはベンダーに依存しないコンテナ管理ツールであり、クラウドコンピューティングコストを最小化し、強靭でスケーラブルなアプリケーションの実行を簡素化します。Kubernetesは、クラウドでコンテナ化されたアプリケーションを実行するための標準となっており、主要なクラウドプロバイダー(AWS、Azure、GCE、IBM、Oracle)が現在、管理されたKubernetesサービスを提供しています。

Kubernetesの基本用語と定義

K8Sの使用方法を理解し始めるためには、API内のオブジェクトを理解する必要があります。基本的なK8Sオブジェクトといくつかの高レベルの抽象化は、コントローラーとして知られています。これらはアプリケーションライフサイクルの構成要素です。基本オブジェクトには次のものが含まれます:

  • Pod. 1つまたは複数のコンテナのグループです。
  • Service. ポッドの論理的なセットとそれにアクセスするためのポリシーを定義する抽象化です。
  • Volume. データを永続化するための抽象化です。(これは、コンテナが一時的であり、コンテナが削除されたときにデータが削除されるため、必要です。)
  • Namespace. 特定の目的(たとえば、特定のプロジェクトや開発者のチーム)に専用されたクラスタのセグメントです。

コントローラーまたは高レベルの抽象化には次のものが含まれます:

  • ReplicaSet(RS)。 希望するポッドの数が実行されていることを保証します。
  • Deployment. RSのポッドに対する宣言的な更新を提供します。
  • StatefulSet. データベースなどのステートフルアプリケーションを管理するワークロードAPIオブジェクトです。
  • DaemonSet. すべてまたは一部のワーカーノードがポッドのコピーを実行することを保証します。これは、Fluentdのようなデーモンアプリケーションに役立ちます。
  • Job. 1つ以上のポッドを作成し、特定のタスクを完了まで実行し、その後ポッドを削除します。

マイクロサービス

以前のモノリシックアプリケーションの特定の部分です。従来のマイクロサービスベースのアーキテクチャは、1つまたは複数の最終製品を構成する複数のサービスを持っています。マイクロサービスは通常、アプリケーション間で共有され、継続的インテグレーションと継続的デリバリーの管理を容易にします。モノリシックとマイクロサービスアーキテクチャの違いを探る。

イメージ

通常はDockerコンテナイメージであり、アプリケーションを実行するために必要なすべてを含む実行可能なイメージです。アプリケーションコード、ライブラリ、ランタイム、環境変数、構成ファイルが含まれます。ランタイム時に、コンテナイメージは、そのイメージにパッケージ化されたすべてを実行するコンテナになります。

ポッド

ストレージとネットワークを共有し、Kubernetes構成に従ってそれらのコンテナの動作を示す単一またはグループのコンテナです。ポッドはIPアドレスとポートアドレス空間を共有し、ローカルホストネットワーキングを介して互いに通信できます。各ポッドには、クラスタ内の他のポッドがアクセスできるIPアドレスが割り当てられます。ポッド内のアプリケーションは共有ボリュームにアクセスでき、これはポッドのライフサイクルを超えてデータを永続化する必要がある場合に役立ちます。Kubernetes Podsについてさらに学ぶ。

ネームスペース

ネームスペースは、単一のクラスタ内に複数の仮想Kubernetesクラスタを作成する方法です。ネームスペースは通常、多数のユーザー、チーム、プロジェクトがある大規模なデプロイメントに使用されます。

レプリカセット

Kubernetesレプリカセットは、レプリカセット内の指定された数のポッドが常に実行されていることを保証します。1つのポッドが死ぬかクラッシュすると、レプリカセットの構成はその代わりに新しいポッドが作成されることを保証します。通常、レプリカセットの代わりにDeploymentを使用してこれを管理します。Kubernetes ReplicaSetsについてさらに学ぶ。

デプロイメント

ポッドまたはレプリカセットの希望する状態を定義する方法です。デプロイメントは、どのくらいの数の各コンテナが同時に実行される必要があるかに関するポリシーを定義することによって、コンテナにHAポリシーを定義するために使用されます。

サービス

ポッドのセットをポリシーによって結合するものです。サービスは、クラスタの外部からの起源に対してコンテナ化されたアプリケーションを公開するために使用されます。Kubernetesサービスについてさらに学ぶ。

ノード

コンテナ/ポッドが実行される(通常は)仮想ホストです。

Kubernetesのアーキテクチャとコンポーネント

K8Sクラスタは、APIを公開し、デプロイメントをスケジュールし、一般的にクラスタを管理するマスターノードで構成されています。複数のワーカーノードが、Dockerやrktなどのコンテナランタイムを担当し、マスターと通信するエージェントを持つことができます。

マスターコンポーネント

これらのマスターコンポーネントは、マスターノードから構成されています:

  • Kube-apiserver. APIを公開します。
  • Etcd. すべてのクラスタデータを格納するキー値ストアです。(マスターノードと同じサーバーで実行することも、専用のクラスタで実行することもできます。)
  • Kube-scheduler. ワーカーノードに新しいポッドをスケジュールします。
  • Kube-controller-manager. コントローラーを実行します。
  • Cloud-controller-manager. クラウドプロバイダーと通信します。

ノードコンポーネント

  • Kubelet. ポッド内のコンテナが実行されていることを確認するエージェントです。
  • Kube-proxy. ネットワークルールを維持し、転送を実行します。
  • コンテナランタイム。 コンテナを実行します。

Kubernetesが提供する利点は何ですか?

K8Sは、ボックスから出した状態で、私たちが不変のインフラを実行することを可能にするいくつかの重要な機能を提供します。コンテナは自動的に終了され、置き換えられ、自己修復され、新しいコンテナはその機能を果たすために必要なサポートボリューム、 セキュリティ、 構成などにアクセスします。これらの重要なK8S機能により、コンテナ化されたアプリケーションが効率的にスケールします:

  • 水平スケーリング。 コマンドラインまたはUIからアプリケーションを必要に応じてスケールします。
  • 自動ロールアウトとロールバック。 すべてのインスタンスが同時に失敗したり停止したりしないように、アプリケーションの健康を監視しながら変更をロールアウトします。何かがうまくいかない場合、K8Sは自動的に変更をロールバックします。
  • サービス発見と負荷分散。 コンテナには独自のIPが割り当てられ、負荷分散のために単一のDNS名の背後に一連のコンテナを置くことができます。
  • ストレージオーケストレーション。 ローカルまたはパブリッククラウドまたはネットワークストレージを自動的にマウントします。
  • 秘密と構成の管理。秘密を作成し、更新し、イメージを再構築せずに構成を管理します。
  • 自己修復。 プラットフォームは、多くの問題を修復します:失敗したコンテナを再起動し、ノードが死んだ場合にコンテナを置き換え、ユーザー定義のヘルスチェックに応答しないコンテナを終了し、準備ができるまでクライアントにコンテナを広告するのを待ちます。
  • バッチ実行。 バッチおよび継続的インテグレーションワークロードを管理し、失敗したコンテナを置き換えます。
  • 自動バイナリパッキング。 リソース要件やその他の制約に基づいて自動的にコンテナをスケジュールします。

Kubernetesができないこと

Kubernetesは多くのクールで有用なことができます。しかし、Kubernetesができないことを考慮することも同様に重要です:

  • Jenkinsのようなツールを置き換えることはできません。したがって、アプリケーションを自動的にビルドすることはできません。
  • ミドルウェアではありません。したがって、メッセージバスやキャッシングなど、ミドルウェアが行うタスクを実行することはありません。
  • どのログソリューションが使用されているかは気にしません。アプリをstdoutにログする場合は、好きな方法でログを収集できます。
  • 構成言語(例:JSON)には関心がありません。

K8sはこれらのことに対して意見を持たず、単に私たちが望む方法でアプリを構築し、任意のタイプの情報を公開し、その情報を自由に収集できるようにします。

Kubernetesの競合他社

もちろん、Kubernetesは市場で唯一のツールではありません。さまざまなツールがあり、以下のようなものがあります:

  • Docker Compose - ステージングには良いが、プロダクションには適していません。
  • Nomad - クラスタ管理とスケジューリングを可能にしますが、秘密と構成の管理、サービスの発見、監視のニーズを解決することはできません。
  • Titus - Netflixのオープンソースオーケストレーションプラットフォームは、プロダクションで使用している人が十分ではありません。

全体として、Kubernetesは、優れたボックス内の機能を提供し、機能を簡単に拡張できる無数のサードパーティの追加機能とともに提供します。

Kubernetesの始め方

通常、Kubernetesは、オンプレミスのハードウェアまたは主要なクラウドプロバイダーのいずれかにインストールします。ただし、多くのクラウドプロバイダーやサードパーティがManaged Kubernetesサービスを提供していますが、テスト/学習体験のためには、これは費用がかかり、必要ではありません。隔離された開発/テスト環境でKubernetesを始める最も簡単で迅速な方法はminikubeです。

Kubernetesのインストール方法

K8Sをローカルにインストールするのは簡単で、直感的です。動作を開始するには、2つのものが必要です: Kubectl と Minikube。

  • Kubectl は、クラスタと対話するためのCLIツールです。
  • Minikube は、あなたの開発マシンにローカルにクラスタをデプロイするバイナリです。

これで、数分以内にローカルでクラスタにコンテナ化されたアプリをデプロイできます。高可用性の プロダクショングレードのクラスタ には、以下のようなツールを使用できます:

  • Kops
  • EKS、これはAWSの管理サービスです
  • GKE 、Googleが提供しています

Minikubeを使用すると、仮想マシンの内部にシングルノードのクラスタを実行できます(通常はVirtualBox内で実行されています)。公式のKubernetesドキュメントに従って、あなたのマシンにminikubeをインストールしてください。 https://kubernetes.io/docs/setup/minikube/。minikubeがインストールされると、ローカルマシンで仮想化されたシングルノードクラスタを実行する準備が整います。minikubeクラスタを開始できます;

    $ minikube start

Kubernetesクラスタとの対話は、主にkubectl CLIまたはKubernetesダッシュボードを介して行われます。kubectl CLIは、たくさんのタイピング(とメモリ)を節約するbashの自動補完もサポートしています。公式のインストール手順を使用して、あなたのマシンにkubectl CLIをインストールしてください。 https://kubernetes.io/docs/tasks/tools/install-kubectl/。Kubernetesクラスタと対話するには、kubectl CLIのコンテキストを設定する必要があります。Kubernetesコンテキストは、クラスタ内のネームスペースにアクセスするユーザーのアクセスパラメーターのグループを定義します。minikubeを開始すると、デフォルトでコンテキストは自動的にminikubeに切り替わります。kubectl CLIコマンドを実行するクラスタを定義するために使用されるkubectl CLIコマンドは多数あります。

    $ kubectl config get-context
$ kubectl config set-context
    $ Kubectl config delete-context

最初のコンテナ化されたアプリケーションをMinikubeにデプロイ

これまでに、ローカルマシン上でローカルのシングルノードKubernetesクラスタが実行されているはずです。このチュートリアルの残りの部分では、ポッド内で単純なHello Worldコンテナ化アプリケーションをデプロイするために必要な手順を説明します。minikubeノードのIPアドレスで公開されたエンドポイントを持つアプリケーションを作成します。Kubernetesデプロイメントを作成するには;

    $ kubectl run hello-minikube --image=k8s.gcr.io/
    echoserver:1.4 --port=8080

デプロイメントが成功したことが確認できるので、デプロイメントを表示できます;

    $ kubectl get deployments

私たちのデプロイメントはKubernetesポッドを作成しているはずです。クラスタ内で実行されているポッドを表示できます;

    $ kubectl get pods

私たちのHello WorldアプリケーションにHTTPリクエストを送信する前に、Kubernetesサービスとしてポッドを公開する必要があります。デフォルトでは、ポッドは内部IPアドレスでのみアクセス可能であり、クラスタの外部からのアクセスはありません。

    $ kubectl expose deployment hello-minikube --
    type=NodePort

デプロイメントを公開すると、Kubernetesサービスが作成されます。サービスを表示できます:

    $ kubectl get services

クラウドプロバイダーを使用する場合、通常、サービスエンドポイントのプライベートまたはパブリックIPアドレスを割り当てるために、—type=loadbalancerを設定します。minikubeはローカルの開発/テスト環境であり、負荷分散装置がサポートされないため、—type=NodePortはサービスエンドポイントにminikubeホストIPを使用します。コンテナ化されたアプリケーションにアクセスするためのURLを見つけるには、次のコマンドを実行します;

    $ minikube service hello-minikube -—url

ターミナルからの応答をCurlして、公開されたサービスがポッドに到達していることを確認します。

    $ curl http://:

Kubernetesサービスを介してポッドにHTTPリクエストを送信したので、すべてが期待通りに動作していることを確認できます。ポッドのログを確認すると、HTTPリクエストが表示されるはずです。

    $ kubectl logs hello-minikube-c8b6b4fdc-sz67z

結論として、私たちは現在、Kubernetesのシングルノードクラスタ内で単純なコンテナ化されたアプリケーションを実行しており、Kubernetesサービスを介して公開されたエンドポイントがあります。

学習のためのMinikube

Minikubeは、Kubernetesを理解し、スケールでのコンテナオーケストレーションの概念を学ぶのに最適ですが、ローカルマシンからプロダクションワークロードを実行したくはありません。上記を踏まえ、単純なHello Worldアプリケーションを実行するKubernetesポッド、サービス、デプロイメントが機能しているはずです。ここから、コンテナ化されたアプリケーションのためにKubernetesを使用し始めたい場合は、Kubernetesクラスタを構築するか、人気のあるクラウドプロバイダーからの多くの管理されたKubernetesのオファリングを比較することをお勧めします。

追加リソース

Kubernetesについてもっと知るには、これらのリソースを探ってください:

これらの投稿は私自身のものであり、BMCの立場、戦略、意見を必ずしも表すものではありません。

ITOps・DevOpsの関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。