Kubernetes-quick-guide
Kubernetes-概要
Cloud Native Computing Foundation(CNCF)がホストするオープンソースコンテナー管理ツールのKubernetes。 これは、以前は別のシステムで処理されていた長時間実行プロセスとバッチジョブの両方を管理するためにGoogleで開発されたBorgの拡張バージョンとしても知られています。
Kubernetesには、デプロイメントの自動化、アプリケーションのスケーリング、およびクラスター全体でのアプリケーションコンテナーの操作の機能が備わっています。 コンテナ中心のインフラストラクチャを作成できます。
Kubernetesの機能
Kubernetesの重要な機能の一部を次に示します。
- 開発、統合、展開を継続
- コンテナ化されたインフラストラクチャ
- アプリケーション中心の管理
- 自動拡張可能なインフラストラクチャ
- 開発テストと本番環境での環境の一貫性
- 各コンポーネントが個別のユニットとして機能できる疎結合インフラストラクチャ
- リソース使用率の高密度 *作成される予定の予測可能なインフラストラクチャ
Kubernetesの主要コンポーネントの1つは、物理および仮想マシンインフラストラクチャのクラスターでアプリケーションを実行できることです。 また、クラウド上でアプリケーションを実行する機能も備えています。* ホスト中心のインフラストラクチャからコンテナ中心のインフラストラクチャへの移行に役立ちます。*
Kubernetes-アーキテクチャ
この章では、Kubernetesの基本アーキテクチャについて説明します。
Kubernetes-クラスターアーキテクチャ
次の図に示すように、Kubernetesはクライアントサーバーアーキテクチャに従います。 ここで、マスターは1台のマシンにインストールされ、ノードは別のLinuxマシンにインストールされています。
マスターとノードの主要なコンポーネントは、次のセクションで定義されます。
Kubernetes-マスターマシンコンポーネント
Kubernetes Master Machineのコンポーネントは次のとおりです。
etcd
クラスター内の各ノードで使用できる構成情報を保存します。 これは、複数のノードに分散できる高可用性キーバリューストアです。 機密情報が含まれている可能性があるため、Kubernetes APIサーバーからのみアクセスできます。 これは、すべてにアクセス可能な分散キー値ストアです。
APIサーバー
Kubernetesは、APIを使用してクラスターですべての操作を提供するAPIサーバーです。 APIサーバーはインターフェースを実装します。つまり、さまざまなツールやライブラリが簡単に通信できます。 Kubeconfig は、通信に使用できるサーバー側ツールと一緒のパッケージです。 Kubernetes APIを公開します。
コントローラーマネージャー
このコンポーネントは、クラスターの状態を調整してタスクを実行するほとんどのコレクターを担当します。 一般に、それは非終了ループで実行され、APIサーバーへの情報の収集と送信を担当するデーモンと見なすことができます。 クラスターの共有状態を取得し、サーバーの現在のステータスを目的の状態にするために変更を行います。 キーコントローラーは、レプリケーションコントローラー、エンドポイントコントローラー、名前空間コントローラー、およびサービスアカウントコントローラーです。 コントローラーマネージャーは、さまざまな種類のコントローラーを実行して、ノード、エンドポイントなどを処理します。
スケジューラー
これはKubernetesマスターの重要なコンポーネントの1つです。 ワークロードの分散を担当するマスターのサービスです。 クラスターノードの作業負荷の使用率を追跡し、リソースが利用可能なワークロードを配置し、ワークロードを受け入れます。 言い換えれば、これはポッドを利用可能なノードに割り当てる責任があるメカニズムです。 スケジューラーは、ワークロードの使用率と新しいノードへのポッドの割り当てを担当します。
Kubernetes-ノードコンポーネント
以下は、Kubernetesマスターと通信するために必要なノードサーバーの主要コンポーネントです。
港湾労働者
各ノードの最初の要件はDockerです。これは、カプセル化されたアプリケーションコンテナーを比較的孤立しているが軽量なオペレーティング環境で実行するのに役立ちます。
キューブレットサービス
これは、コントロールプレーンサービスとの間で情報を中継する各ノードの小さなサービスです。 etcd ストアと対話して、構成の詳細とライトの値を読み取ります。 これは、コマンドを受信して作業するためにマスターコンポーネントと通信します。 その後、 kubelet プロセスは、作業状態とノードサーバーを維持する責任を負います。 ネットワークルール、ポート転送などを管理します。
Kubernetesプロキシサービス
これは各ノードで実行されるプロキシサービスであり、外部ホストでサービスを利用できるようにします。 要求を正しいコンテナに転送するのに役立ち、プリミティブな負荷分散を実行できます。 これにより、ネットワーク環境が予測可能でアクセスしやすくなり、同時に隔離されます。 ノード上のポッド、ボリューム、シークレットの管理、新しいコンテナの健康診断の作成など。
Kubernetes-マスターおよびノード構造
次の図は、Kubernetesマスターとノードの構造を示しています。
Kubernetes-セットアップ
Kubernetesをセットアップする前に、仮想データセンター(vDC)をセットアップすることが重要です。 これは、ネットワークを介して互いに通信できる一連のマシンと見なすことができます。 実践的なアプローチでは、物理インフラストラクチャまたはクラウドインフラストラクチャがセットアップされていない場合、 PROFITBRICKS でvDCをセットアップできます。
クラウドでのIaaSのセットアップが完了したら、*マスター*と*ノード*を構成する必要があります。
注-Ubuntuマシンのセットアップが表示されます。 同じことが他のLinuxマシンでも設定できます。
前提条件
- Dockerのインストール*-KubernetesのすべてのインスタンスでDockerが必要です。 Dockerをインストールする手順は次のとおりです。
- ステップ1 *-rootユーザーアカウントでマシンにログオンします。
- ステップ2 *-パッケージ情報を更新します。 aptパッケージが機能していることを確認してください。
- ステップ3 *-次のコマンドを実行します。
- ステップ4 *-新しいGPGキーを追加します。
- ステップ5 *-APIパッケージイメージを更新します。
上記のすべてのタスクが完了したら、Dockerエンジンの実際のインストールから開始できます。 ただし、これの前に、使用しているカーネルのバージョンが正しいことを確認する必要があります。
Docker Engineをインストールする
次のコマンドを実行して、Dockerエンジンをインストールします。
- ステップ1 *-マシンにログオンします。
- ステップ2 *-パッケージインデックスを更新します。
- ステップ3 *-次のコマンドを使用してDocker Engineをインストールします。
- ステップ4 *-Dockerデーモンを起動します。
- ステップ5 *-Dockerがインストールされている場合は、次のコマンドを使用します。
etcd 2.0をインストールする
これはKubernetes Master Machineにインストールする必要があります。 それをインストールするには、次のコマンドを実行します。
コマンドの上記のセットで-
- まず、 etcd をダウンロードします。 指定した名前でこれを保存します。
- 次に、tarパッケージを展開する必要があります。
- dirを作成します。/optという名前のビン内。
- 抽出したファイルをターゲットの場所にコピーします。
これでKubernetesを構築する準備ができました。 クラスタ上のすべてのマシンにKubernetesをインストールする必要があります。
上記のコマンドは、kubernetesフォルダーのルートに _output ディレクトリーを作成します。 次に、選択した任意のディレクトリ/opt/binなどにディレクトリを抽出できます。
次に、Kubernetesマスターとノードのセットアップから実際に開始する必要があるネットワーキング部分が来ます。 これを行うには、ノードマシンで実行できるホストファイルにエントリを作成します。
上記のコマンドの出力は次のとおりです。
次に、Kubernetes Masterの実際の構成から始めます。
最初に、すべての構成ファイルの正しい場所へのコピーを開始します。
上記のコマンドは、すべての構成ファイルを必要な場所にコピーします。 ここで、Kubernetesフォルダーを作成したのと同じディレクトリに戻ります。
次のステップは、コピーされた構成ファイルを/etcの下で更新することです。 dir.
次のコマンドを使用して、マスターでetcdを構成します。
kube-apiserverを構成する
マスターでこれを行うには、前にコピーした /etc/default/kube-apiserver ファイルを編集する必要があります。
kube Controller Managerを構成する
次に、対応するファイルでkubeスケジューラーを構成します。
上記のすべてのタスクが完了したら、Kubernetesマスターを起動して先に進むことができます。 これを行うために、Dockerを再起動します。
Kubernetesノードの構成
Kubernetesノードは、 kubeletとkube-proxy の2つのサービスを実行します。 先に進む前に、ダウンロードしたバイナリを、kubernetesノードを構成する必要なフォルダーにコピーする必要があります。
kubernetesマスターに対して行ったのと同じ方法でファイルをコピーします。 kubeletとkube-proxyのみを実行するため、それらを構成します。
次に、コンテンツを適切なディレクトリにコピーします。
kube-proxyの場合、次のコマンドを使用して構成します。
最後に、Dockerサービスを再起動します。
これで設定は完了です。 次のコマンドを実行して確認できます。
Kubernetes-画像
Kubernetes(Docker)イメージは、コンテナ化されたインフラストラクチャの主要な構成要素です。 現時点では、DockerイメージをサポートするためにKubernetesのみをサポートしています。 ポッドの各コンテナーには、その内部で実行されるDockerイメージがあります。
ポッドを設定するとき、設定ファイルの画像プロパティはDockerコマンドと同じ構文を持ちます。 構成ファイルには、レジストリから取得する予定のイメージ名を定義するフィールドがあります。
以下は、Dockerレジストリからイメージを取得し、Kubernetesコンテナーに展開する一般的な構成構造です。
上記のコードでは、定義しています-
- name:Tesing_for_Image_pull -この名前は、Dockerレジストリからイメージをプルした後に作成されるコンテナーの名前を識別および確認するために与えられます。
- name:neo4j-server -これは、作成しようとしているコンテナに付けられた名前です。 neo4j-serverを指定したように。
- image:<Dockerイメージの名前> -これは、Dockerまたはイメージの内部レジストリからプルしようとしているイメージの名前です。 取得しようとしているイメージ名とともに完全なレジストリパスを定義する必要があります。
- imagePullPolicy -常に-このイメージプルポリシーは、このファイルを実行してコンテナを作成するたびに、同じ名前を再びプルすることを定義します。
- *コマンド:["echo"、 "SUCCESS"] *-これにより、コンテナを作成し、すべてがうまくいった場合、コンテナにアクセスするときにメッセージが表示されます。
イメージをプルしてコンテナを作成するには、次のコマンドを実行します。
ログを取得すると、成功として出力が取得されます。
上記のコマンドは成功の出力を生成するか、失敗として出力を取得します。
注-すべてのコマンドを自分で試すことをお勧めします。
Kubernetes-ジョブ
ジョブの主な機能は、1つ以上のポッドを作成し、ポッドの成功について追跡することです。 指定された数のポッドが正常に完了することを保証します。 指定された数のポッドの正常な実行が完了すると、ジョブは完了したと見なされます。
ジョブを作成する
ジョブを作成するには、次のコマンドを使用します-
上記のコードでは、定義しています-
- * kind:Job→* kindをJobとして定義し、 kubectl に、使用されている yaml ファイルがジョブタイプポッドを作成することであることを伝えます。
- * Name:py→*これは使用しているテンプレートの名前であり、仕様はテンプレートを定義します。
- * name:py→コンテナ仕様で *py として名前を付けました。これは、そこから作成されるPodを識別するのに役立ちます。
- *画像:python→*ポッド内で実行されるコンテナーを作成するためにプルする画像。
- restartPolicy:Never→この画像再起動の条件はneverとして指定されます。これは、コンテナが強制終了またはfalseの場合、それ自体が再起動しないことを意味します。
次のコマンドを使用して、 py.yaml という名前で保存されたyamlでジョブを作成します。
上記のコマンドはジョブを作成します。 ジョブのステータスを確認する場合は、次のコマンドを使用します。
上記のコマンドはジョブを作成します。 ジョブのステータスを確認する場合は、次のコマンドを使用します。
スケジュールされたジョブ
Kubernetesのスケジュール済みジョブは Cronetes を使用します。これはKubernetesジョブを受け取り、Kubernetesクラスターで起動します。
- ジョブをスケジュールすると、指定した時点でポッドが実行されます。
- 自動的に起動するパロディックジョブが作成されます。
注-スケジュールされたジョブの機能はバージョン1.4でサポートされており、betch/v2alpha 1 APIは、APIサーバーを起動しながら –runtime-config = batch/v2alpha1 を渡すことで有効になります。
ジョブを作成し、スケジュールされたジョブにするために使用したのと同じyamlを使用します。
上記のコードでは、定義しています-
- schedule:h/30 * * ?→ジョブが30分ごとに実行されるようにスケジュールするには。
- */bin/sh:*これは/bin/shでコンテナに入ります
- * ps –eaf→*マシン上でps -eafコマンドを実行し、コンテナー内の実行中のすべてのプロセスをリストします。
このスケジュールされたジョブの概念は、指定された時点で一連のタスクをビルドして実行し、プロセスを完了するときに役立ちます。
Kubernetes-ラベルとセレクター
ラベル
ラベルは、ポッド、レプリケーションコントローラー、およびサービスに接続されるキーと値のペアです。 これらは、ポッドやレプリケーションコントローラーなどのオブジェクトの属性を識別するために使用されます。 それらは作成時にオブジェクトに追加でき、実行時に追加または変更できます。
セレクター
ラベルは一意性を提供しません。 一般的に、多くのオブジェクトが同じラベルを保持できると言えます。 ラベルセレクターは、Kubernetesのコアグループ化プリミティブです。 ユーザーがオブジェクトのセットを選択するために使用します。
Kubernetes APIは現在、2種類のセレクターをサポートしています-
- 等価ベースのセレクター
- セットベースのセレクター
等式ベースのセレクター
キーと値によるフィルタリングが可能です。 一致するオブジェクトは、指定されたすべてのラベルを満たす必要があります。
セットベースのセレクター
セットベースのセレクタを使用すると、値のセットに従ってキーをフィルタリングできます。
上記のコードでは、ラベルセレクターを app:salesplatform として、コンポーネントを component:neo4j として使用しています。
Kubernetes-名前空間
名前空間は、リソース名に追加の修飾を提供します。 これは、複数のチームが同じクラスターを使用していて、名前が衝突する可能性がある場合に役立ちます。 複数のクラスター間の仮想壁として使用できます。
名前空間の機能
以下は、Kubernetesのネームスペースの重要な機能の一部です-
- 名前空間は、同じ名前空間を使用したポッド間通信に役立ちます。
- 名前空間は、同じ物理クラスターの上に配置できる仮想クラスターです。
- チームとその環境を論理的に分離します。
名前空間を作成する
次のコマンドは、名前空間を作成するために使用されます。
名前空間を制御する
次のコマンドは、名前空間を制御するために使用されます。
上記のコードでは、
- このコマンドを使用して名前空間を作成しています。
- これにより、使用可能なすべてのネームスペースがリストされます。
- これにより、コマンドで名前が指定された特定のネームスペースが取得されます。
- これは、サービスに関する完全な詳細を説明します。
- これにより、クラスターに存在する特定のネームスペースが削除されます。
サービスでのネームスペースの使用-例
以下は、サービスで名前空間を使用するためのサンプルファイルの例です。
上記のコードでは、 elk という名前のサービスメタデータで同じ名前空間を使用しています。
Kubernetes-ノード
ノードは、ミニオンとも呼ばれるKubernetesクラスター内の作業マシンです。 これらは、物理、VM、またはクラウドインスタンスの可能性がある作業単位です。
各ノードには、プロキシサービスやkubeletサービスなどのポッドを実行するために必要なすべての必要な構成があり、ノードで作成されたポッドでDockerコンテナーを実行するために使用されます。
Kubernetesによって作成されるのではなく、クラウドサービスプロバイダーまたは物理マシンまたはVMマシン上のKubernetesクラスターマネージャーによって外部で作成されます。
複数のノードを処理するKubernetesの主要なコンポーネントは、複数の種類のコントローラーを実行してノードを管理するコントローラーマネージャーです。 ノードを管理するために、Kubernetesは、作成されたオブジェクトが有効なノードであることを検証する種類ノードのオブジェクトを作成します。
セレクターを使用したサービス
JSON形式では、次のように見える実際のオブジェクトが作成されます-
ノードコントローラー
これらは、Kubernetesマスターで実行され、metadata.nameに基づいてクラスター内のノードを継続的に監視するサービスのコレクションです。 必要なすべてのサービスが実行されている場合、ノードが検証され、コントローラーによってそのノードに新しく作成されたポッドが割り当てられます。 有効でない場合、マスターはポッドを割り当てず、有効になるまで待機します。
ただし、クラスタ管理者が手動で管理する場合は、フラットを回すことで実行できます-
Kubernetes-サービス
サービスは、ポッドの論理セットとして定義できます。 これは、ポッドにアクセスできる単一のIPアドレスとDNS名を提供するポッドの上部の抽象化として定義できます。 サービスを使用すると、負荷分散の構成を非常に簡単に管理できます。 ポッドが非常に簡単にスケーリングできるようにします。
サービスはKubernetesのRESTオブジェクトで、その定義をKubernetesマスターのKubernetes apiServerにポストして、新しいインスタンスを作成できます。
セレクタなしのサービス
上記の構成により、Tutorial_point_serviceという名前のサービスが作成されます。
セレクターを使用したサービス構成ファイル
この例では、セレクターがあります。そのため、トラフィックを転送するには、エンドポイントを手動で作成する必要があります。
上記のコードでは、「192.168.168.40:8080」として定義されたエンドポイントにトラフィックをルーティングするエンドポイントを作成しました。
マルチポートサービスの作成
サービスの種類
ロードバランサー-クラウドプロバイダーのロードバランサーを使用します。 NodePort および ClusterIP サービスは、外部ロードバランサーがルーティングする先に自動的に作成されます。
サービスタイプがノードポートのフルサービス yaml ファイル。 自分で作成してみてください。
Kubernetes-ポッド
ポッドは、Kubernetesクラスターのノード内のコンテナーとそのストレージのコレクションです。 内部に複数のコンテナを持つポッドを作成することが可能です。 たとえば、データベースコンテナーとデータコンテナーを同じポッドに保持します。
ポッドの種類
ポッドには2種類あります-
- シングルコンテナポッド
- マルチコンテナポッド
シングルコンテナポッド
これらはkubctl runコマンドを使用して簡単に作成できます。このコマンドでは、ポッドの作成中にプルするDockerレジストリに定義済みのイメージがあります。
例-Dockerハブで利用可能なTomcatイメージでポッドを作成します。
これは、 yaml ファイルを作成してから kubectl create コマンドを実行することでも実行できます。
上記の yaml ファイルが作成されたら、 tomcat.yml という名前でファイルを保存し、作成コマンドを実行してドキュメントを実行します。
tomcatという名前のポッドが作成されます。 describeコマンドと kubectl を使用してポッドを説明できます。
マルチコンテナポッド
マルチコンテナポッドは、コンテナの定義で yaml mail を使用して作成されます。
上記のコードでは、Tomcat用とMongoDB用の2つのコンテナを持つ1つのポッドを作成しました。
Kubernetes-レプリケーションコントローラー
レプリケーションコントローラーは、Kubernetesの重要な機能の1つであり、ポッドのライフサイクルを管理します。 指定された数のポッドレプリカがいつでも実行されていることを確認する必要があります。 指定された数のポッドまたは少なくとも1つのポッドが実行されていることを確認したいときに使用します。 指定されたnoのポッドをアップまたはダウンする機能があります。
ポッドを何度も作成するのではなく、複製コントローラーを使用してポッドのライフサイクルを管理することをお勧めします。
セットアップの詳細
- 種類:ReplicationController *→上記のコードでは、 *yabe ファイルがレプリケーションコントローラーの作成に使用されることを kubectl に伝えるレプリケーションコントローラーとして種類を定義しています。
- name:Tomcat-ReplicationController →これは、複製コントローラーが作成される名前を識別するのに役立ちます。 kubctlを実行すると、 rc <Tomcat-ReplicationController> を取得すると、レプリケーションコントローラーの詳細が表示されます。
- replicas:3 →これにより、複製コントローラーは、ポッドのライフサイクルの任意の時点でポッドの3つのレプリカを維持する必要があることを理解できます。
- *名前:Tomcat *→仕様セクションでは、ポッド内に存在するコンテナがtomcatであることをレプリケーションコントローラーに伝えるtomcatとして名前を定義しています。
- containerPort:7474 →ポッドがポッド内のコンテナーを実行しているクラスター内のすべてのノードが同じポート7474で公開されるようにするのに役立ちます。
ここでは、Kubernetesサービスが3つのTomcatレプリカのロードバランサーとして機能しています。
Kubernetes-レプリカセット
レプリカセットは、ポッドのレプリカの数を実行する必要があります。 レプリケーションコントローラーの代替と見なすことができます。 レプリカセットと複製コントローラーの主な違いは、複製コントローラーが等式ベースのセレクターのみをサポートするのに対して、レプリカセットはセットベースのセレクターをサポートすることです。
セットアップの詳細
apiVersion:extensions/v1beta1 →上記のコードでは、APIバージョンはレプリカセットの概念をサポートするKubernetesの高度なベータバージョンです。
kind:ReplicaSet →kubectlがファイルがレプリカセットの作成に使用されていることを理解するのに役立つレプリカセットとして種類を定義しました。
層:バックエンド→ラベル層を、一致するセレクターを作成するバックエンドとして定義しました。
\ {key:tier、operation:In、values:[Backend]} →これは、 matchExpression が定義した一致条件を理解し、 matchlabel が詳細を見つけるために使用する操作で理解するのに役立ちます。
Kubernetes-展開
展開がアップグレードされ、レプリケーションコントローラーの上位バージョン。 これらは、複製コントローラのアップグレードバージョンでもあるレプリカセットの展開を管理します。 レプリカセットを更新する機能があり、以前のバージョンにロールバックすることもできます。
これらは、 matchLabels および selectors の多くの更新された機能を提供します。 Kubernetesマスターには、それを実現する展開コントローラーと呼ばれる新しいコントローラーがあります。 展開を途中で変更する機能があります。
展開の変更
更新中-ユーザーは進行中の展開を完了する前に更新できます。 これにより、既存の展開が解決され、新しい展開が作成されます。
削除-ユーザーは、展開を完了する前に削除することで、展開を一時停止/キャンセルできます。 同じデプロイメントを再作成すると、再開されます。
ロールバック-展開または展開中の展開をロールバックできます。 ユーザーは、* DeploymentSpec.PodTemplateSpec = oldRC.PodTemplateSpec。*を使用して、展開を作成または更新できます。
展開戦略
展開戦略は、新しいRCが既存のRCを置き換える方法を定義するのに役立ちます。
再作成-この機能は、既存のすべてのRCを強制終了し、新しいRCを表示します。 これにより、迅速な展開が可能になりますが、古いポッドがダウンし、新しいポッドが起動しない場合、ダウンタイムが発生します。
ローリングアップデート-この機能は、古いRCを徐々にダウンさせ、新しいRCをアップさせます。 これにより、展開が遅くなりますが、展開はありません。 常に、このプロセスで使用できる古いポッドと新しいポッドはほとんどありません。
Deploymentの構成ファイルは次のようになります。
上記のコードでは、レプリカセットと異なるのは、種類を展開として定義したことだけです。
配置を作成
展開を取得する
展開のステータスを確認する
展開の更新
前の展開へのロールバック
Kubernetes-ボリューム
Kubernetesでは、ボリュームはポッド内のコンテナーからアクセス可能なディレクトリと考えることができます。 Kubernetesにはさまざまなタイプのボリュームがあり、タイプはボリュームの作成方法とそのコンテンツを定義します。
Dockerにはボリュームの概念がありましたが、唯一の問題はボリュームが特定のポッドに非常に限定されていたことでした。 ポッドの寿命が終了するとすぐに、ボリュームも失われました。
一方、Kubernetesを介して作成されるボリュームは、コンテナーに限定されません。 Kubernetesのポッド内に展開されたコンテナの一部またはすべてをサポートします。 Kubernetesボリュームの主な利点は、ポッドが複数のストレージを同時に使用できる異なる種類のストレージをサポートしていることです。
Kubernetesボリュームの種類
以下は、人気のあるKubernetesボリュームのリストです-
- emptyDir -ポッドがノードに最初に割り当てられたときに作成されるタイプのボリュームです。 Podがそのノードで実行されている限り、アクティブのままです。 ボリュームは最初は空であり、ポッド内のコンテナーはemptyDirボリューム内のファイルを読み書きできます。 ノードからポッドが削除されると、emptyDirのデータは消去されます。
- hostPath -このタイプのボリュームは、ホストノードのファイルシステムからポッドにファイルまたはディレクトリをマウントします。
- gcePersistentDisk -このタイプのボリュームは、Google Compute Engine(GCE)永続ディスクをポッドにマウントします。 ポッドがノードから削除されても、 gcePersistentDisk のデータはそのまま残ります。
- awsElasticBlockStore -このタイプのボリュームは、Amazon Web Services(AWS)Elastic Block Storeをポッドにマウントします。 gcePersistentDisk と同様に、 awsElasticBlockStore のデータは、ポッドがノードから削除されてもそのまま残ります。
- nfs - nfs ボリュームを使用すると、既存のNFS(ネットワークファイルシステム)をポッドにマウントできます。 ノードからポッドが削除されても、 nfs ボリュームのデータは消去されません。 ボリュームはアンマウントされているだけです。
- iscsi - iscsi ボリュームにより、既存のiSCSI(SCSI over IP)ボリュームをポッドにマウントできます。
- flocker -これは、オープンソースのクラスター化コンテナーデータボリュームマネージャーです。 データボリュームの管理に使用されます。 flocker ボリュームを使用すると、Flockerデータセットをポッドにマウントできます。 データセットがFlockerに存在しない場合、まずFlocker APIを使用して作成する必要があります。
- glusterfs -Glusterfsは、オープンソースのネットワークファイルシステムです。 glusterfsボリュームを使用すると、glusterfsボリュームをポッドにマウントできます。
- rbd -RBDはRados Block Deviceの略です。 rbd ボリュームを使用すると、Rados Block Deviceボリュームをポッドにマウントできます。 ノードからポッドが削除された後も、データは保持されたままです。
- cephfs - cephfs ボリュームを使用すると、既存のCephFSボリュームをポッドにマウントできます。 ポッドがノードから削除された後、データはそのまま残ります。
- gitRepo - gitRepo ボリュームは空のディレクトリをマウントし、ポッドが使用する git リポジトリをそこにクローンします。
- secret - secret ボリュームは、パスワードなどの機密情報をポッドに渡すために使用されます。
- persistentVolumeClaim - persistentVolumeClaim ボリュームは、PersistentVolumeをポッドにマウントするために使用されます。 PersistentVolumesは、特定のクラウド環境の詳細を知らなくても、ユーザーが永続ストレージ(GCE PersistentDiskやiSCSIボリュームなど)を「要求」する方法です。
- downwardAPI - downwardAPI ボリュームを使用して、アプリケーションで下位APIデータを利用できるようにします。 ディレクトリをマウントし、要求されたデータをプレーンテキストファイルに書き込みます。
- azureDiskVolume - AzureDiskVolume は、Microsoft Azureデータディスクをポッドにマウントするために使用されます。
永続ボリュームと永続ボリューム要求
永続ボリューム(PV)-管理者によってプロビジョニングされたネットワークストレージです。 これは、PVを使用する個々のポッドから独立したクラスター内のリソースです。
- Persistent Volume Claim(PVC)*-Kubernetesがポッド用に要求するストレージは、PVCと呼ばれます。 ユーザーは、基礎となるプロビジョニングを知る必要はありません。 クレームは、ポッドが作成されるのと同じネームスペースで作成する必要があります。
永続ボリュームの作成
上記のコードでは、定義しています-
- kind:PersistentVolume →使用されているyamlファイルが永続ボリュームを作成することであることをkubernetesに伝えるPersistentVolumeとして種類を定義しました。
- name:pv0001 →作成しているPersistentVolumeの名前。
- 容量:→この仕様は、作成しようとしているPVの容量を定義します。
- storage:10Gi →これは、定義されたパス上の10Giスペースを要求しようとしていることを、基盤となるインフラストラクチャに伝えます。
- ReadWriteOnce →これは、作成しているボリュームのアクセス権を示します。
- path: "/tmp/data01" →この定義は、基礎となるインフラストラクチャ上のこのパスの下にボリュームを作成しようとしていることをマシンに伝えます。
PVの作成
PVの確認
PVの説明
永続的なボリューム要求の作成
上記のコードでは、定義しています-
- kind:PersistentVolumeClaim →指定された容量を要求しようとしている基盤インフラストラクチャに指示します。
- name:myclaim-1 →作成しようとしているクレームの名前。
- ReadWriteOnce →これは、作成しようとしているクレームのモードを指定します。
- *ストレージ:3Gi *→これにより、kubernetesに要求しようとしているスペースの量が通知されます。
PVCの作成
PVCに関する詳細の取得
PVCの説明
PODでPVおよびPVCを使用する
上記のコードでは、定義しています-
- * volumeMounts:*→これは、マウントが行われるコンテナ内のパスです。
- ボリューム:→この定義は、クレームするボリューム定義を定義します。
- * persistentVolumeClaim:*→この下で、定義されたポッドで使用するボリューム名を定義します。
Kubernetes-秘密
シークレットは、暗号化されたユーザー名やパスワードなどの機密データの保存に使用されるKubernetesオブジェクトとして定義できます。
Kubernetesでシークレットを作成する方法は複数あります。
- txtファイルから作成します。
- yamlファイルから作成します。
テキストファイルから作成
ユーザー名やパスワードなどのテキストファイルからシークレットを作成するには、まずそれらをtxtファイルに保存し、次のコマンドを使用する必要があります。
Yamlファイルから作成する
シークレットを作成する
シークレットを使用する
シークレットを作成したら、ポッドまたはレプリケーションコントローラーで次のように使用できます-
- 環境変数
- ボリューム
環境変数として
環境変数としてシークレットを使用するために、ポッドyamlファイルのspecセクションで env を使用します。
ボリュームとして
環境変数としての秘密の構成
上記のコードでは、 env 定義の下で、レプリケーションコントローラーの環境変数としてシークレットを使用しています。
ボリュームマウントとしての秘密
Kubernetes-ネットワークポリシー
ネットワークポリシーは、同じ名前空間内のポッドが相互におよびネットワークエンドポイントと通信する方法を定義します。 APIサーバーのランタイム構成で extensions/v1beta1/networkpolicies を有効にする必要があります。 そのリソースは、ラベルを使用してポッドを選択し、ルールを定義して、ネームスペースで定義されている特定のポッドへのトラフィックを許可します。
まず、名前空間分離ポリシーを構成する必要があります。 基本的に、この種のネットワークポリシーはロードバランサーに必要です。
名前空間を作成したら、ネットワークポリシーを作成する必要があります。
ネットワークポリシーYaml
Kubernetes-API
Kubernetes APIは、システムの宣言的な構成スキーマの基盤として機能します。 Kubectl コマンドラインツールを使用して、APIオブジェクトを作成、更新、削除、および取得できます。 Kubernetes APIは、Kubernetesのさまざまなコンポーネント間でコミュニケーターとして機能します。
KubernetesにAPIを追加する
Kubernetesに新しいAPIを追加すると、Kubernetesに新しい機能が追加され、Kubernetesの機能が向上します。 ただし、システムのコストと保守性も増加します。 コストと複雑さのバランスをとるために、いくつかのセットが定義されています。
追加されるAPIは、ユーザーの50%以上に役立つはずです。 Kubernetesに機能を実装する他の方法はありません。 例外的な状況については、Kubernetesのコミュニティミーティングで説明し、APIを追加します。
APIの変更
Kubernetesの機能を向上させるために、システムに継続的に変更が導入されます。 Kubernetesチームは、システムの既存の機能を削除したり、影響を与えたりせずにKubernetesに機能を追加します。
一般的なプロセスを実証するために、ここに(仮説的な)例があります-
- ユーザーがPodオブジェクトを*/api/v7beta1/…*にPOSTします
- JSONは v7beta1.Pod 構造に非整列化されます
- デフォルト値は v7beta1.Pod に適用されます
- v7beta1.Pod は api.Pod 構造に変換されます
- api.Pod が検証され、すべてのエラーがユーザーに返されます
- api.Pod はv6.Podに変換されます(v6は最新の安定バージョンであるため)
- v6.Pod はJSONにマーシャリングされ、 etcd に書き込まれます
Podオブジェクトが保存されたので、ユーザーはサポートされている任意のAPIバージョンでそのオブジェクトを取得できます。 たとえば-
- ユーザーは*/api/v5/…*からポッドを取得します
- JSONは etcd および unmarshalled から v6.Pod 構造に読み取られます
- デフォルト値は v6.Pod に適用されます
- v6.Pod はapi.Pod構造に変換されます
- api.Pod は v5.Pod 構造に変換されます
- v5.Pod はJSONにマーシャリングされ、ユーザーに送信されます
このプロセスの意味するところは、APIの変更は慎重にかつ下位互換性を持って行う必要があるということです。
APIバージョン管理
複数の構造のサポートを容易にするために、Kubernetesは、 /api/v1 または /apsi/extensions/v1beta1 などの異なるAPIパスで複数のAPIバージョンをサポートします
Kubernetesのバージョニング標準は、複数の標準で定義されています。
アルファレベル
- このバージョンにはアルファが含まれています(例: v1alpha1)
- このバージョンはバグがあるかもしれません。有効なバージョンにはバグがある可能性があります
- バグのサポートはいつでも削除できます。
- サポートが常に存在しない場合があるため、短期テストでのみ使用することをお勧めします。
ベータレベル
- バージョン名にベータ版が含まれています(例: v2beta3)
- コードは完全にテストされており、有効なバージョンは安定しているはずです。
- この機能のサポートは廃止されません。いくつかの小さな変更があるかもしれません。
- 以降のリリースで互換性のない変更が行われる可能性があるため、ビジネスクリティカルではない使用にのみ推奨されます。
安定したレベル
- バージョン名は vX です。 X は整数です。
- 機能の安定したバージョンは、多くの後続バージョンのリリースされたソフトウェアに表示されます。
Kubernetes-Kubectl
Kubectlは、Kubernetes APIと対話するためのコマンドラインユーティリティです。 これは、Kubernetesクラスター内のポッドの通信と管理に使用されるインターフェースです。
Kubernetesクラスターと対話するには、kubectlをローカルに設定する必要があります。
Kubectlの設定
curlコマンドを使用して、実行可能ファイルをローカルワークステーションにダウンロードします。
Linuxの場合
OS Xワークステーション上
ダウンロードが完了したら、システムのパスでバイナリを移動します。
Kubectlの構成
構成操作を実行する手順は次のとおりです。
- $ \ {MASTER_HOST} を、前の手順で使用したマスターノードのアドレスまたは名前に置き換えます。
- $ \ {CA_CERT} を前の手順で作成した ca.pem への絶対パスに置き換えます。
- $ \ {ADMIN_KEY} を前の手順で作成した admin-key.pem への絶対パスに置き換えます。
- $ \ {ADMIN_CERT} を前の手順で作成した admin.pem への絶対パスに置き換えます。
セットアップの検証
Kubernetes-Kubectlコマンド
例えば、
同じ方法で、 create コマンドと kubectl を使用して、リストされているように複数のものを作成できます。
配備
名前空間
クォータ
秘密のドッカーレジストリ
秘密の
秘密のジェネリック
秘密のTL
サービスアカウント
サービスclusterip
サービスロードバランサー
サービスノードポート
例えば、
上記とは別に、次のようなロールアウトを使用して複数のタスクを実行できます-
ロールアウト履歴
ロールアウト一時停止
ロールアウト再開
ロールアウトステータス
ロールアウトの取り消し
同じコマンドをポッドでも使用できます。
Kubernetes-アプリの作成
Kubernetes展開用のアプリケーションを作成するには、最初にDockerでアプリケーションを作成する必要があります。 これは2つの方法で行うことができます-
- ダウンロードすることにより *Dockerファイルから
ダウンロードすることにより
既存のイメージはDockerハブからダウンロードでき、ローカルのDockerレジストリに保存できます。
そのためには、Docker* pull *コマンドを実行します。
上記のコードの出力は次のとおりです。
上記のスクリーンショットは、ローカルDockerレジストリに保存されている一連の画像を示しています。
テストするアプリケーションで構成されるイメージからコンテナを構築する場合は、Docker runコマンドを使用して実行できます。
Dockerファイルから
Dockerファイルからアプリケーションを作成するには、まずDockerファイルを作成する必要があります。
以下は、Jenkins Dockerファイルの例です。
上記のファイルが作成されたら、Dockerfileという名前で保存し、ファイルパスにcdします。 次に、次のコマンドを実行します。
イメージが構築されたら、イメージが正常に機能し、コンテナに変換できるかどうかをテストできます。
Kubernetes-アプリの展開
デプロイメントは、イメージをコンテナに変換し、それらのイメージをKubernetesクラスター内のポッドに割り当てる方法です。 これは、サービス、ポッド、レプリケーションコントローラー、レプリカセットの展開を含むアプリケーションクラスターのセットアップにも役立ちます。 クラスタは、ポッドにデプロイされたアプリケーションが相互に通信できるようにセットアップできます。
このセットアップでは、1つのアプリケーションの上にロードバランサーを設定して、トラフィックをポッドのセットに転送し、後でバックエンドポッドと通信できます。 ポッド間の通信は、Kubernetesで構築されたサービスオブジェクトを介して行われます。
NgnixロードバランサーYamlファイル
NgnixレプリケーションコントローラーYaml
フロントエンドサービスYamlファイル
フロントエンド複製コントローラーYamlファイル
バックエンドサービスYamlファイル
バックアップされたレプリケーションコントローラーYamlファイル
Kubernetes-自動スケーリング
GCEでスケーラブルなインフラストラクチャをセットアップするには、まず、Googleクラウドモニタリング、Googleクラウドロギング、スタックドライバーの機能を有効にしたアクティブなGCEプロジェクトが必要です。
最初に、いくつかのノードが実行されているクラスターをセットアップします。 完了したら、次の環境変数を設定する必要があります。
環境変数
完了したら、 kube-up.sh を実行してクラスターを起動します。 これにより、クラスターの自動スカラーアドオンと一緒にクラスターが作成されます。
クラスターの作成時に、次のkubectlコマンドを使用してクラスターを確認できます。
これで、クラスターにアプリケーションをデプロイし、水平ポッドオートスケーラーを有効にできます。 これは、次のコマンドを使用して実行できます。
上記のコマンドは、アプリケーションの負荷が増加しても、PODのレプリカを少なくとも1つ、最大10個保持することを示しています。
次のコマンドを使用して、実行中のポッドの数を確認できます。
そして最後に、ノードのステータスを取得できます。
Kubernetes-ダッシュボードのセットアップ
Kubernetesダッシュボードのセットアップには、セットアップの前提条件として必要な一連のツールを使用したいくつかの手順が含まれます。
- Docker(1.3以降)
- 行く(1.5+)
- nodejs(4.2.2+)
- npm(1.3以降)
- Java(7+)
- gulp(3.9+)
- Kubernetes(1.1.2以降)
ダッシュボードのセットアップ
バージョンの確認
GOのインストール
Kubernetes Dashboardのインストール
ダッシュボードを実行する
Kubernetesダッシュボード
Kubernetes-監視
監視は、大規模なクラスターを管理するための重要なコンポーネントの1つです。 このために、多くのツールがあります。
Prometheusを使用した監視
これは、監視および警告システムです。 SoundCloudで構築され、2012年にオープンソース化されました。 多次元データを非常にうまく処理します。
プロメテウスには、監視に参加するための複数のコンポーネントがあります-
- プロメテウス-データをスクラップして保存するコアコンポーネントです。
- Prometheusノードexplore -ホストレベルのマトリックスを取得し、それらをPrometheusに公開します。
- Ranch-eye - haproxy であり、 cAdvisor 統計をPrometheusに公開します。
- Grafana -データの視覚化。
- InfuxDB -牧場主からのデータを保存するために特に使用される時系列データベース。
- Prom-ranch-exporter -これは単純なnode.jsアプリケーションであり、Rancherサーバーにサービスのスタックのステータスを照会するのに役立ちます。
セマテキストDockerエージェント
これは、最新のDocker対応メトリック、イベント、およびログ収集エージェントです。 すべてのDockerホストで小さなコンテナーとして実行され、すべてのクラスターノードとコンテナーのログ、メトリック、およびイベントを収集します。 コアサービスがDockerコンテナーに展開されている場合、Kubernetesコアサービスのコンテナーを含むすべてのコンテナー(1つのポッドに複数のコンテナーが含まれる場合があります)を検出します。 展開後、すべてのログとメトリックはすぐに使用できます。
ノードへのエージェントの展開
Kubernetesは、ポッドがクラスターに追加されることを保証するDeamonSetsを提供します。
SemaText Dockerエージェントの構成
環境変数を介して構成されます。
apps.sematext.comで無料アカウントを取得します(まだお持ちでない場合)。
タイプ「Docker」のSPMアプリを作成して、SPMアプリトークンを取得します。 SPMアプリはKubernetesのパフォーマンスメトリックとイベントを保持します。
Logseneアプリを作成して、Logseneアプリトークンを取得します。 LogseneアプリはKubernetesログを保持します。
以下に示すように、DaemonSet定義のLOGSENE_TOKENおよびSPM_TOKENの値を編集します。
- 最新のsematext-agent-daemonset.yml(生のプレーンテキスト)テンプレートを取得します(以下も参照)。
- ディスク上のどこかに保存します。
- SPM_TOKENおよびLOGSENE_TOKENプレースホルダーをSPMおよびLogsene Appトークンに置き換えます。
DaemonSetオブジェクトを作成する
kubectlを使用してSematext Agent Dockerを実行する
Kubernetesログ
Kubernetesコンテナーのログは、Dockerコンテナーのログと大差ありません。 ただし、Kubernetesユーザーは、展開されたポッドのログを表示する必要があります。 したがって、次のようにログ検索にKubernetes固有の情報を利用できるようにすることは非常に便利です-
- Kubernetes名前空間
- Kubernetesポッド名
- Kubernetesコンテナー名
- Dockerイメージ名
- Kubernetes UID
ELKスタックとLogSpoutの使用
ELKスタックには、Elasticsearch、Logstash、およびKibanaが含まれます。 ログを収集してログプラットフォームに転送するには、LogSpoutを使用します(FluentDなどの他のオプションがあります)。
次のコードは、KubernetesでELKクラスターをセットアップし、ElasticSearchのサービスを作成する方法を示しています-
複製コントローラーの作成
木花URL
Kibanaの場合、Elasticsearch URLを環境変数として提供します。
Kibana UIは、コンテナポート5601および対応するホスト/ノードポートの組み合わせで到達可能です。 開始時には、Kibanaにはデータがありません(データをプッシュしていないため、これは予想されます)。