type
status
date
slug
summary
tags
category
icon
password
书籍
1.Kubernetes徹底解説
1.1 アプリケーションのデプロイ方式の進化
アプリケーションの展開方法は、大きく3つの時代を経てきました。
⁂伝統的なデプロイ:インターネット初期には、アプリケーションを物理サーバーに直接デプロイしました。
- 利点:シンプルで、他の技術を必要としません。
- 欠点:リソースの境界をアプリケーションに定義できないため、計算リソースを適切に割り当てることが難しく、また、プログラム間で影響が生じやすいです。
⁂仮想化デプロイ:1台の物理サーバーで複数の仮想マシンを実行できます。
- 利点:プログラム環境が互いに影響しないため、ある程度のセキュリティを提供します。
- 欠点:オペレーティングシステムの追加により、一部のリソースが無駄になります。
⁂コンテナ化デプロイ:仮想化と似ていますが、オペレーティングシステムを共有します。
- 各コンテナには、ファイルシステム、CPU、メモリ、プロセススペースなどがあります。
- アプリケーションの実行に必要なリソースはすべて、コンテナにパッケージ化され、基盤と解離されます。
- コンテナ化されたアプリケーションは、クラウドサービスプロバイダー間、Linuxディストリビューション間でデプロイできます。

コンテナ化された展開方法は多くの利便性をもたらしますが、いくつかの問題も生じます。たとえば:
- 1つのコンテナが故障した場合、即座に別のコンテナを起動して故障したコンテナを置き換える方法は?
- 並行アクセスが増加する場合、コンテナの数をどのようにスケーリングするか
これらのコンテナ管理の問題は、コンテナオーケストレーション問題として知られており、これらの問題を解決するためにいくつかのコンテナオーケストレーションソフトウェアが開発されています:
- Swarm:Docker自身のコンテナオーケストレーションツール
- Mesos:Apacheのリソース統合管理ツール。Marathonと組み合わせて使用します。
- Kubernetes:Googleがオープンソース化したコンテナオーケストレーションツール

1.2 Kubernetesの概要
Kubernetes(クーバーネティス)は、コンテナ技術に基づいた分散アーキテクチャの先進的なソリューションであり、Googleが数十年間厳重に機密にしてきた秘密兵器であるBorgシステムのオープンソース版です。2014年9月に最初のバージョンがリリースされ、2015年7月に最初の正式版がリリースされました。
Kubernetesの本質は、一連のサーバークラスターであり、クラスター内の各ノードで特定のプログラムを実行して、ノード内のコンテナを管理します。目的は、リソース管理を自動化することであり、主に以下の主要な機能を提供しています:
- 自己修復:コンテナがクラッシュした場合、約1秒で新しいコンテナを迅速に起動できる
- 弾力性のあるスケーリング:必要に応じて、クラスター内の実行中のコンテナの数を自動的に調整できる
- サービス発見:サービスは自動的に他のサービスへの依存関係を見つけることができます。
- ロードバランシング:複数のコンテナでサービスを起動した場合、リクエストの負荷分散を自動的に実行できる
- バージョンロールバック:新しいリリースのプログラムバージョンに問題がある場合、即座に元のバージョンに戻ることができる
- ストレージオーケストレーション:コンテナが必要とするストレージボリュームを自動的に作成できます。
1.3 Kubernetesのコンポーネント
Kubernetesクラスターは、主にコントロールノード(マスター)とワーカーノード(ノード)から構成されます。各ノードには異なるコンポーネントがインストールされています。
マスターは、クラスターの統制プレーン(中枢)であり、クラスターの管理役であります。
下記四つ目はマスタクラスタに属するコンポネント
- ApiServer:リソースを操作するの唯一のエントリーポイントであり、ユーザーからの入力コマンドを受け取り、認証、認可、APIの登録と検出などのメカニズムを提供します。
- Scheduler:クラスターのリソーススケジューリングを担当し、事前に定義されたスケジューリングポリシーに従ってPodを適切なノードにスケジュールします。言い換えれば、どのコンテナの容器をどの物理サーバーに配置することを管理します。
- ControllerManager:クラスターの状態を維持する役割で、プログラムのデプロイ方式、障害検出、自動拡張、ローリングアップデート(順次更新)などを行います。
- Etcd:クラスター内のさまざまなリソースオブジェクトの情報を保存する役割を担います。
ノード:クラスターのデータプレーンであり、コンテナに実行環境を提供する役割を担います。作業員であります。下記三つ目はマスタクラスタに属するコンポネント
- Kubelet:コンテナの管理者であり、Dockerを操作してコンテナを作成、更新、削除します。
- KubeProxy:クラスター内のサービスの発見と負荷分散を担当します。
- Docker:ノード上でのコンテナの操作を行います。

以下は、WordPressサービスを展開する際のKubernetesシステムの各コンポーネントの呼び出し関係を説明します:
- まず、Kubernetes環境が起動されると、クラスタの各ノードは自身の情報をetcdデータベースに保存します。
- WordPressサービスのデプロイリクエストは、最初にマスターノードのapiServerコンポーネントに送信されます。
- apiServerは、WordPressサービスをどのノードにデプロイするかを決定するためにschedulerコンポーネントを呼び出します。
- この時、schedulerは各ノードの情報をetcdから読み取り、特定の方法(アルゴリズム)でノードを選択し、結果をapiServerに通知します。
- apiServerはcontroller-managerを呼び出して、WordPressサービスをワーカーノードにデプロイできるように、どうデプロイするのか、いろいろ計画して、調整します。
- kubeletは指示を受け取ると、WordPressのポッドを起動してもらうようにワーカーノードに指示します。
- これで、ポッドはKubernetesの最小単位であり、コンテナはポッド内で実行されます。
- WordPressサービスが起動すると、ポッドはkube-proxyを介してアクセスされます。
- これにより、外部ユーザーはクラスター内のWordPressサービスにアクセスできます。
1.4マスターの基本要素
- Master:クラスターの制御ノードであり、各クラスターには少なくとも1つのマスターノードが必要で、クラスターの制御を担当します。
- ワーカーNode:作業負荷ノードであり、マスターがこれらのノードにコンテナを割り当て、ノードにコンテナのデプロイを担当します。
- Pod:Kubernetesの最小制御単位であり、すべてのコンテナはPod内で実行されます。1つのPodには1つまたは複数のコンテナが含まれます。
- Controller:コントローラーは、Podの管理を行います。Podの起動、停止、数のスケーリングなどがこれに含まれます。
- Service:外部サービスへの統一されたアクセスポイントです。複数のPodを同じ種類のものとして維持します。
- Label:Podを分類するためのラベルです。同じ種類のPodは同じラベルを持ちます。
- NameSpace:Podの実行環境を分離するための名前空間です。(開発環境や本番環境など分けます)
2.kubernetesクラスター環境の構築
2.1 前提知識
現在、Kubernetesクラスターを本番環境に展開する方法は大きく2つあります:
kubeadm:
kubeadmは、Kubernetesクラスターを迅速に展開するためのkubeadm initとkubeadm joinを提供するツールです。
公式サイト:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
バイナリパッケージ:
GitHubからリリースされたバイナリパッケージをダウンロードし、各コンポーネントを手動で展開してKubernetesクラスターを構築します。kubeadmは展開を簡素化しますが、詳細が隠れているため、問題が発生した場合のトラブルシューティングが困難になります。より簡単で制御可能な展開を希望する場合は、バイナリパッケージを使用してKubernetesクラスターを手動で構築することをお勧めします。手動での展開は手間がかかりますが、その過程で多くの作業原理を学ぶことができ、将来のメンテナンスに役立ちます。
2.2 kubeadm デプロイメント方法の簡単紹介
kubeadmは、Kubernetesクラスターを迅速に展開するための公式コミュニティツールです。このツールは、2つのコマンドを使用してKubernetesクラスターを展開することができます:
- マスターノードを作成する:
kubeadm init
- ノードを現在のクラスターに追加する:
kubeadm join <マスターノードのIPとポート>
2.3 インストール要件
Kubernetesクラスターを展開する前に、次の条件を満たす必要があります:
- 1つ以上のマシン:オペレーティングシステムはCentOS 7.x-86_x64である必要があります。
- ハードウェアの構成:2GB以上のRAM、2つ以上のCPU、30GB以上のハードディスクが必要です。
- クラスター内のすべてのマシンがネットワークで通信できる必要があります。
- 外部ネットワークにアクセスできる必要があります。イメージを取得する必要があります。
- swapパーティションを無効にする必要があります。
2.4 最終目標
- すべてのノードにDockerとkubeadmをインストールします。
- Kubernetesマスターを展開します。
- コンテナーネットワークプラグインを展開します。
- Kubernetesノードを展開し、ノードをKubernetesクラスターに追加します。
- Dashboard Webページを展開し、Kubernetesリソースを可視化して表示します。

物理サーバーor仮想サーバー | IP | これらをインストール |
master01 | 192.168.5.3 | docker,kubectl,kubeadm,kubelet |
node01 | 192.168.5.4 | docker,kubectl,kubeadm,kubelet |
node02 | 192.168.5.5 | docker,kubectl,kubeadm,kubelet |
具体的な実装過程は割愛しますが
少なくとも一台のマスターサーバと何台のノードサーバを用意し、ネットワークが通じる上で、三つのサーバーにdocker,kubectl,kubeadm,kubeletらをインストールしておけば、各設定をしておけば、Kubernetesクラスタを構築できることを覚えてときましょう!
3.リソース管理
3.1 リソース管理の概要
Kubernetesでは、すべてのものがリソースとして抽象化され、Kubernetesを管理するためにリソースを操作する必要があります。
- Kubernetesは、基本的にはクラスターシステムであり、クラスター内にさまざまなサービスを展開できます。サービスの展開とは、Kubernetesクラスター内で個々のコンテナを実行し、指定されたプログラムをコンテナ内で実行することです。
- Kubernetesの最小の管理単位はポッドであり、コンテナはポッド内に配置されます。一般的に、Kubernetesはポッドを直接管理せず、ポッドコントローラーを介してポッドを管理します。
- ポッドがサービスを提供すると、ポッドへのアクセス方法を考える必要があります。Kubernetesは、この機能を実現するためにServiceリソースを提供します。
- また、ポッド内のプログラムのデータを永続化する必要がある場合、Kubernetesはさまざまなストレージシステムも提供します。

1、2セッションにKubernetesの内部の仕組みを紹介しました。実はKubernetesを学ぶ際の重要なポイントは、クラスター上のポッド、ポッドコントローラー、サービス、ストレージなどのリソースを操作する方法を学ぶことです。
3.2 YAML言語の紹介
YAMLは、XMLやJSONに似たマークアップ言語ですが、データを中心に置き、識別言語を重視していません。そのため、YAML自体の定義は比較的シンプルで、「人間に優しいデータフォーマット言語」と呼ばれています。
XMLの例:
YAMLの例:
YAMLの構文は比較的シンプルで、次のような特徴があります。
- 大文字と小文字が区別されます。
- インデントを使用して階層関係を表します。
- インデントにはタブを使用せず、スペースのみが許可されます。
- インデントのスペース数は重要ではありません。同じレベルの要素は左揃えされる必要があります。
- '#'はコメントを表します。
YAMLは、スカラー、オブジェクト、配列などのデータ型をサポートしています。
- スカラー:単一の、分解できない値
- オブジェクト:キーと値の組み合わせの集まり、マッピング(mapping)/ ハッシュ(hash)/ 辞書(dictionary)とも呼ばれる
- 配列:順序に並んだ値のグループ、シーケンス(sequence)/ リスト(list)とも呼ばれる
注意!
- 1.YAMLを書くときは、末尾にスペースを追加することを忘れないでください。
- 2. 複数のYAML構成を1つのファイルに入れる必要がある場合は、---で区切ってください。
- 3. こののサイトは、YAMLが正しく書かれているかどうかを検証するために使用できる、YAMLをJSONに変換するツールです。 https://www.json2yaml.com/convert-yaml-to-json
3.3 リソース管理方法
Kubernetesリソースの管理方法には、次の3つの方法があります。
- 命令によるオブジェクト管理:kubectlコマンドを使って直接Kubernetesリソースを操作します。
- 命令によるオブジェクト設定:kubectlコマンドや設定ファイルを使用してKubernetesリソースを設定します。
- 宣言的なオブジェクト設定:applyコマンドや設定ファイルを使ってKubernetesリソースを設定します。
タイプ | 操作対象 | 適用環境 | 利点 | 欠点 |
命令式オブジェクト管理 | オブジェクト | テスト | 簡単 | アクティブなオブジェクトのみ操作可能で、監査やトラッキングができない |
命令式オブジェクト設定 | ファイル | 開発 | 監査やトラッキングが可能 | プロジェクトが大規模になると、設定ファイルが多くなり、操作が煩雑になる |
宣言的オブジェクト設定 | ディレクトリ | 開発 | ディレクトリ操作をサポート | 予期しない問題が発生した場合、デバッグが難しい |
3.4kubectlコマンド
kubectlはKubernetesクラスターのコマンドラインツールであり、これを使用するとクラスター自体を管理したり、クラスター上でのコンテナ化アプリケーションのインストールやデプロイメントを行ったりできます。kubectlコマンドの構文は以下の通りです:
- command:リソースに対して実行する操作を指定します。例えば、create、get、deleteなどがあります。
- type:リソースの種類を指定します。例えば、deployment、pod、serviceなどがあります。
- name:リソースの名前を指定します。名前は大文字と小文字が区別されます。
- flags:追加のオプションパラメータを指定します。
例えば、以下のように使用します:
Kubernetes API で利用可能なリソースの一覧を表示します。これにより、Kubernetes クラスター上で利用可能なリソースの種類やそれらの名前を確認できます。
頻繁に使用されるリソースの例は次のとおりです:
リソースの種類 | リソース名 | 略称 | リソースの役割 |
クラスタレベルのリソース | nodes | no | クラスタを構成する部分 |
名前空間 | namespaces | ns | ポッドを分離する |
ポッドリソース | pods | po | コンテナを装備したもの |
ポッドリソースコントローラ | replicationcontrollers | rc | ポッドリソースを制御する |
レプリカセット | replicasets | rs | ポッドリソースを制御する |
デプロイメント | deployments | deploy | ポッドリソースを制御する |
デーモンセット | daemonsets | ds | ポッドリソースを制御する |
ジョブ | jobs | ㅤ | ポッドリソースを制御する |
クーロンジョブ | cronjobs | cj | ポッドリソースを制御する |
水平ポッドオートスケーラー | horizontalpodautoscalers | hpa | ポッドリソースを制御する |
StatefulSets | statefulsets | sts | ポッドリソースを制御する |
サービスディスカバリリソース | services | svc | ポッドの統一された外部インターフェイス |
イングレス | ingress | ing | ポッドの統一された外部インターフェイス |
ストレージリソース | volumeattachments | ㅤ | ストレージ |
永続ボリューム | persistentvolumes | pv | ストレージ |
永続ボリュームクレーム | persistentvolumeclaims | pvc | ストレージ |
設定リソース | configmaps | cm | 設定 |
シークレット | secrets | ㅤ | 設定 |
kubernetesでは、リソースに対してさまざまな操作が許可されています。詳細な操作コマンドは、
--help
を使用して確認できます。命令分類 | コマンド | 翻訳 | コマンドの目的 |
基本コマンド | create | 作成 | リソースを作成します |
ㅤ | edit | 編集 | リソースを編集します |
ㅤ | get | 取得 | リソースを取得します |
ㅤ | patch | 更新 | リソースを更新します |
ㅤ | delete | 削除 | リソースを削除します |
ㅤ | explain | 説明 | リソースの文書を表示します |
実行とデバッグ | run | 実行 | 指定されたイメージをクラスター内で実行します |
ㅤ | expose | 公開 | リソースをServiceとして公開します |
ㅤ | describe | 説明 | リソースの内部情報を表示します |
ㅤ | logs | ログ | ポッド内のコンテナのログを出力します |
ㅤ | attach | アタッチ | 実行中のコンテナにアタッチします |
ㅤ | exec | 実行 | コンテナ内でコマンドを実行します |
ㅤ | cp | コピー | ポッドの内外でファイルをコピーします |
ㅤ | rollout | 展開 | リソースの展開を管理します |
ㅤ | scale | スケール | ポッドの数をスケールアップ(またはダウン)します |
ㅤ | autoscale | 自動スケール | ポッドの数を自動的に調整します |
高度なコマンド | apply | 適用 | ファイルを使用してリソースを構成します |
ㅤ | label | ラベル | リソースにラベルを更新します |
その他のコマンド | cluster-info | クラスター情報 | クラスターの情報を表示します |
ㅤ | version | バージョン | 現在のサーバーとクライアントのバージョンを表示します |
3.4.1命令式オブジェクト管理
簡単なポッドのデプロイコマンド
3.4.2命令式オブジェクト設定
命令式オブジェクト設定とは、設定ファイルを用意し、コマンドを使って設定ファイルを反映することです
1.nginxpod.yamlファイルを作成します
2. createコマンドで、設定ファイルを反映します。
これで、nginxpod.yamlに基づいて、二つのリソースが環境に作成されました。
3.getコマンドで、リソースの一覧表を見ます
二つのリソースが表示されました。
4.Deleteでリソースを削除します
これで、二つの資源が削除されました。
命令式オブジェクト設定は、リソースを操作するための方法です。簡単に言えば、「コマンド + YAML設定ファイル(コマンドに必要なさまざまなパラメーターが含まれています)」と考えることができます。
3.4.3宣言的オブジェクト設定
宣言的のオブジェクト設定は、命令式オブジェクト設定と非常に似ていますが、applyという1つのコマンドしかありません。
要するに、宣言的なオブジェクト設定は、リソースの最終状態をYAMLファイルで指定し、それをapplyコマンドで適用することです。これにより、次のようなことが可能になります:
- リソースが存在しない場合は、作成されます(kubectl createと同様)。
- リソースが既に存在する場合は、指定された状態に更新されます(kubectl patchと同様)。
つまり、applyコマンドを使って、リソースの望ましい状態を定義し、Kubernetesがそれに従って必要な変更を行うのです。
その他:kubectlを通常はマスターノードで実行しますが、必要に応じてノードノードでも実行できます。そのためには、マスターノードにある.kubeファイルをノードノードにコピーする必要があります。具体的な手順は次の通りです:
- マスターノードで、kubectlの設定が含まれた.kubeファイルがあることを確認します。
- ノードノードに.kubeファイルをコピーします。これには、scpやrsyncなどのファイル転送ツールを使用できます。
- ノードノードでkubectlを実行します。必要に応じて、kubectlの実行権限を確認してください。
このようにして、kubectlをノードノードで実行できますが、一般的にはクラスタの管理や監視などの特定の目的のために行われます。
推奨される方法の使用方法は次の通りです:
リソースの作成/更新: 声明的なオブジェクト設定を使用して、kubectl apply -f XXX.yaml を実行します。
リソースの削除: 命令的なオブジェクト設定を使用して、kubectl delete -f XXX.yaml を実行します。
リソースのクエリ: 命令的なオブジェクト管理を使用して、kubectl get(describe) リソース名 を実行します。
📎 参考文章
- 一些引用
- 引用文章
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
- 作者:みなみ
- 链接:https://www.minami.ac.cn//%E8%B3%87%E6%A0%BC%E5%8B%89%E5%BC%B7/83c01eb7-6fce-4dcb-95f7-d481d67f9b8a
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。