type
status
date
slug
summary
tags
category
icon
password
 

1.Kubernetes徹底解説

1.1 アプリケーションのデプロイ方式の進化

アプリケーションの展開方法は、大きく3つの時代を経てきました。
⁂伝統的なデプロイ:インターネット初期には、アプリケーションを物理サーバーに直接デプロイしました。
  • 利点:シンプルで、他の技術を必要としません。
  • 欠点:リソースの境界をアプリケーションに定義できないため、計算リソースを適切に割り当てることが難しく、また、プログラム間で影響が生じやすいです。
⁂仮想化デプロイ:1台の物理サーバーで複数の仮想マシンを実行できます。
  • 利点:プログラム環境が互いに影響しないため、ある程度のセキュリティを提供します。
  • 欠点:オペレーティングシステムの追加により、一部のリソースが無駄になります。
⁂コンテナ化デプロイ:仮想化と似ていますが、オペレーティングシステムを共有します。
  • 各コンテナには、ファイルシステム、CPU、メモリ、プロセススペースなどがあります。
  • アプリケーションの実行に必要なリソースはすべて、コンテナにパッケージ化され、基盤と解離されます。
  • コンテナ化されたアプリケーションは、クラウドサービスプロバイダー間、Linuxディストリビューション間でデプロイできます。
    notion image
    コンテナ化された展開方法は多くの利便性をもたらしますが、いくつかの問題も生じます。たとえば:
    • 1つのコンテナが故障した場合、即座に別のコンテナを起動して故障したコンテナを置き換える方法は?
    • 並行アクセスが増加する場合、コンテナの数をどのようにスケーリングするか
    これらのコンテナ管理の問題は、コンテナオーケストレーション問題として知られており、これらの問題を解決するためにいくつかのコンテナオーケストレーションソフトウェアが開発されています:
    • Swarm:Docker自身のコンテナオーケストレーションツール
    • Mesos:Apacheのリソース統合管理ツール。Marathonと組み合わせて使用します。
    • Kubernetes:Googleがオープンソース化したコンテナオーケストレーションツール
    notion image

    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:ノード上でのコンテナの操作を行います。
      notion image
      以下は、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クラスターを展開することができます:
      1. マスターノードを作成する:kubeadm init
      1. ノードを現在のクラスターに追加する: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リソースを可視化して表示します。
       
      notion image
      物理サーバー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はさまざまなストレージシステムも提供します。
          notion image
          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ファイルをノードノードにコピーする必要があります。具体的な手順は次の通りです:
          1. マスターノードで、kubectlの設定が含まれた.kubeファイルがあることを確認します。
          1. ノードノードに.kubeファイルをコピーします。これには、scpやrsyncなどのファイル転送ツールを使用できます。
          1. ノードノードでkubectlを実行します。必要に応じて、kubectlの実行権限を確認してください。
          このようにして、kubectlをノードノードで実行できますが、一般的にはクラスタの管理や監視などの特定の目的のために行われます。
          推奨される方法の使用方法は次の通りです:
          リソースの作成/更新: 声明的なオブジェクト設定を使用して、kubectl apply -f XXX.yaml を実行します。
          リソースの削除: 命令的なオブジェクト設定を使用して、kubectl delete -f XXX.yaml を実行します。
          リソースのクエリ: 命令的なオブジェクト管理を使用して、kubectl get(describe) リソース名 を実行します。

          📎 参考文章

          • 一些引用
          • 引用文章
           
          💡
          有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
          EKSでのWordPressデプロイ:KCNA-JP試験対策 (Kubernetes実践編)Kubernetes、仮想マシンとコンテナの概念を超簡単に解説!
          Loading...
          みなみ
          みなみ
          一个普通的干饭人🍚
          最新发布
          02-生成AIパスポート試験対策:第2章「生成AI」
          2025-2-1
          01-生成AIパスポート試験対策:第1章「人口知能」
          2025-2-1
          究極のAWS認定 AI 実践者 AIF-C01 - 学習メモ
          2025-1-27
          不要再傻傻的直接买NISA啦
          2025-1-27
          Kubernetes、仮想マシンとコンテナの概念を超簡単に解説!
          2025-1-24
          529-AWS SAP AWS 「理論・実践・一問道場」VPCエンドポイント
          2025-1-22
          公告
          🎉欢迎访问我的博客🎉
          - 感谢您的支持 --
          本站点于2024/09/01建立
          👏主要分享IT相关主题👏
          系统管理:
          Redhat…
          容器和编排:
          Kubernetes、Openshift…
          云计算:
          AWS、IBM…
          AI入门
          以及技术笔记和考证经验
          定期更新,欢迎互动。
          感谢访问!
          快速浏览相关标签