こんにちはサイオステクノロジーの前田です。
Kubernetesに関しての本はありますし、歴史についても語っている本は多くあります。しかし内容が難しく情報量が多い本が多いため、難しさを感じられている方も多いでしょう。今回はコンテナオーケストレーションのOSSのKubernetesについてわかりやすさ重視で超初心者向けに記載していきます。
Dockerと単純に記載しているときはDocker Swarmではない利用で記載しています。
- Kubernetes 超初心者入門
Kubernetesとは
Kubernetsはコンテナオーケストレーションのデファクトスタンダードになります。コンテナというアプリケーションの一つの形にしているものをデプロイ&サービスとして動かしていくならKubernetesを利用しましょう。
難しく考えるといろいろありますが、コンテナを動かしていくならKubernetesを選びましょう。問題があれば他のdocker swarm等の別のオーケストレーションを選択してください。Kubernetesは生Kubernetesを改良して利用しやすくなったベンダー製品もあります。製品も豊富ですが、基本的な考えとしてはKubernetesを選択するぐらいの気持ちで考えてください。
- Kubernetesのいろいろな呼び方
- クバネテス
- クーベネティス
- 生クーベ
- K8s(ケーハチエス)
-
コンテナオーケストレーションとは
- 運用者の負担を減らし、コンテナを素早くサービスとして提供します。下記のような機能があります。
- コンテナのスケジューリング
- インフラの抽象化
- コンテナのセルフヒーリング
- コンテナの数が10個程度であれば、死活監視やバックアップも従来通りのサーバと同じく手動で管理可能、しかし10万以上のコンテナを俗人的に管理することは、運用コスト等の観点で現実論として難しいためコンテナオーケストレーションを利用します。
- 運用者の負担を減らし、コンテナを素早くサービスとして提供します。下記のような機能があります。
- Kubernetseの特徴
-
- オープンソースのためどこの環境でも利用することができます。
- バージョンアップが年数回あります。
- CNCFでgraduatedな状態で成熟した状態です。
- リンク
-
Kubernetesの代表的なメリット
Kubernetesを利用するといろいろなメリットがあります、代表的でわかりやすいメリットを記載していきます。
①コンテナの停止時や動作不良時に自動的にコンテナを再起動することが可能
Kubernetesではコンテナが正常に動作しないとき、自動的にコンテナを終了する機能や自動的に起動するように設定が可能です。Dockerをローカル環境で利用すると、コンテナが停止したときは自動起動しないで落ちたままですし、マシンを再起動するとコンテナは停止している状態です。Kubernetesでは設定している通りに自動的に起動します。
②コンテナアプリケーションのバージョンアップ対応が楽で安定にすることが可能
コンテナアプリケーションでバージョンアップしたときに簡易に環境のバージョンアップが可能です。新しいバージョンに適応するときに、現行のバージョンを止めずにバージョンアップするということが設定できるため、複数回のバージョンアップがあるときに随時設定&計画しなくてよくなります。簡易なバージョンアップ適応(文字の変更)だけでも社内審査やいろいろあり3週間以上かかる運用をしている人たちもおります。Kubernetesではバージョンアップとロールバックがしやすいため、適応までの時間が早くすることが可能です。
③外部ストレージとの接続が簡易
コンテナは再起動した場合初期化されてデータが消えてしまいます。そのため、保管したいデータはコンテナの外部のストレージを用意する必要があります。少しのアプリケーションでしたら個別設定でできますが、複数のアプリがある場合個別設定するのは大変です。Kubernetesでは外部ストレージの設定が簡単にできます。手動で設定することも可能ですし、欲しい容量等をアプリ側に設定しておけば、クラスターがストレージと連携して自動的にストレージを個別に払い出すような設定も可能です。
④リソースの考慮が簡単
アプリケーションを運用するときはリソース計算をする必要がでてきます。それはアプリケーションのデプロイ環境に限界があり物理環境とかだと変更するのが難しいからです。しかしKubernetesはクラスターに新しいノードを追加すればリソースを追加できるため、厳密なリソース計算をする必要が薄く、多く利用するならノード(サーバ)増やすという柔軟な対応が可能です。アプリケーションのリソース使用量の確保や制限等もできるため、複数のアプリケーションを運用することができます。
⑤環境情報の管理が簡単
コンテナイメージは同一でも検証環境とプロダクション環境では接続するDBを変更したい場合があります。Kubernetesでは環境変数を利用して設定を行うことが多く、汎用的に利用するためコンテナを作ることがあります。環境変数を保管することで、管理や運用を楽にできます。知られたくない環境変数をシークレットという形に設定をしたり、いろいろな形で管理することが可能です。
Kubernetesでよくある失敗
- サーバの台数の勘違い
- 1アプリケーションを1クラスタ(サーバ1台)で構成する形で見積もり、サーバ費用が想定以上になるという場合があります。Kubernetesはサーバ一台で動かすことは可能です。しかし冗長性やリソースの確保等を考えると基本的にはサーバ1台で動かすのはお勧めしません。マネージドサービスではアプリケーションを動かすサーバだけを利用できるようにしている場合もあります。しかし自分でローカル環境で構築する場合は最低(クラスター管理のマスター3台とアプリを動かすワーカー2台)5台の構成を考える必要があります。
- 構築したら終了という勘違い
- Kubernetesは構築した後からが本番です。バージョンアップもありますので、構築して運用を考えない状況には向きません。構築も利用規模によって変わってきます。問題が起きたら対応するという運用方法ではなく、随時課題や目標を決めて利用する必要が出てきます。
Kubernetesの基本構成
Kubernetesの基本構成ではノード(サーバマシン)という単位と、コンポーネントという単位で考えます。最初はコンポーネントはほぼ覚える必要はありません。コンポーネントを覚えないとKubernetesを使用できないということはありません。ここではノードという単位で考えていきます。Kubernetesではクラスターを組まなくても動作することは可能です、しかし運用等を考えると複数ノードが存在するクラスターで動作することを頭に入れておいたほうが良いです。
-
ノード単位
- ノードには、マスターとワーカーの2種類に分かれます。インフラという3種類に分ける場合もありますが、インフラノードはワーカーノードの中のクラスターを利用するのに便利なコンポーネント(モニタリング等)を動作させるノードとなります。そのためマスターとワーカーの2種類になると考えてください。
-
マスターノード(コントロールプレーン)
- kubernetesを管理するコンポーネントが集まっています。クラスターを管理して、ワーカーノードに何をデプロイするとかの情報や、クラスターをどう構成するかという情報が入ってます。
- マスターノードのetcd(データベース)のため冗長構成は3台以上の奇数台数になります。
- マネージドサービスを利用する場合、こちらのマスターについては自己管理しない場合が多いです。
- あまり詳しく覚える必要ないノードです。マスターノードに設定後、マスターノードがワーカーノードにデプロイするイメージで考えてください。
-
ワーカーノード
- 自分たちのアプリケーションを実行するノード
- 最低2台以上で動かすことが望ましい。
- アプリケーションの外部からのアクセスはワーカーノードにアクセスする形が多いです。Kubenetesのクラスターにグローバルからアクセスがある場合は、ロードバランサー経由でアクセスが来るほうが良いです。
Kubernetesの種類
Kubernetesを実際に運用&構築するのは大変です。ここでは利用されるKubernetesをいくつか紹介していきます。
-
マネージドサービス
-
セルフマネージド
- セルフマネージドではKubernetes(生Kube)ともいわれる自分で冗長構成で構築したKubernetes、もしくはRed Hat が提供しているOpenShiftが有名になります。ネットワークが制限された環境での構築、高いセキュリティ観点を考慮したという場合にはセルフマネージドを利用します。
- Kubernetes : 冗長構成で構築した、自分で管理して自分で構築するKubernetes
- OpenShift : 開発者用の機能等、複数の機能を持つKubernetes
- セルフマネージドではKubernetes(生Kube)ともいわれる自分で冗長構成で構築したKubernetes、もしくはRed Hat が提供しているOpenShiftが有名になります。ネットワークが制限された環境での構築、高いセキュリティ観点を考慮したという場合にはセルフマネージドを利用します。
-
検証環境で利用
Kubernetesのアプローチ方法
Kubernetesを利用する場合はKubernetesのことを全部学んでから利用するのではなく、目的別に利用しながら覚えていきましょう。最初は専門用語が多いと思いますが、全部学ぼうとするとそれだけで終わりのない旅にでる状態になります、目的別におすすめを記載しておきます。
- どこでKubernetesを利用するか
- 自分のローカル環境: minikube
- クラウド環境: 各種クラウドマネージドkubernetes(EKS,GKE,AKS)
- 社内のサーバ : Kubernetes冗長構成,OKD
- 何のためにKubernetesを利用するか
- 単純に少し触ってみたい場合: Kubernetes公式ページのkatacoda
- 自作アプリをデプロイする場合: マネージドKubernetesかMinikube
- 他社アプリケーションを利用: マネージドKubernetes もしくはKubernetesクラスター
Kubernetesを学んでいく方法
Kubernetsを学ぶ方法について記載します。有償無償いろいろなものがあります。ここでは自主学習向けで最初におすすめなものをいくつか挙げてます。最初は全体的な流れと目的の操作に必要なことを覚えることを優先してください。ある程度できたら各種Kubernetesのリソースを覚えてたり、Kubernetesで利用するコンポーネント名(プロメテウス等、イスティオ等)を覚えてください。
- おすすめの書籍
- 重要な内容だけにしぼり、わかりやすく記述されている万人初心者向けの書籍
- 全体学習してKubernetsの資格取得や専門家になる人向けの辞書的な書籍
- 少し操作してみたい人向け公式ハンズオン学習
- 学習観点
- Kubernetesを完全に学んで利用するには1人10億ほどの学習コストが必要と算出されるぐらい学習コストがかかります。マネージドサービスやHelm等のデプロイツールが出たため、学習するコストは大分減りましたがそれでもかなりの学習コストがかかります。基本的にはKubernetes自体を全部学ぼうとせず重要なものだけ学ぶようにしましょう。AWSで例えるとAWSのサービス全部覚えなくてもAWSでサーバ構築と運用はできます。Kubernetesも全部学ばなくてもコンテナアプリケーションをデプロイ運用できます。全部を学ぼうとせず、目的を決めて実行することが大事です。
さいごに
Kubernetesの何より注意することは学習方針と目標設計です。一度だけで100点満点の完璧を目指すために利用するのは全く向いていません。それはKubernetesの構成もそうですし、アプリのデプロイ、Kubernetesの学習についてもです。Kubernetsはまず触れてみて、目標を設定して、その後、課題は対応するか、課題として残すか決める。100点満点を考えるのではなく、目標を達成するための基準を満たす利用をする必要があります。
私自身、KubernetesはHelmやOperatorにあうまではただただ大変で覚えることが多い,大学物理のような印象がありました。しかし、HelmやOperatorを利用して簡易に一瞬でアプリケーションをデプロイした瞬間にサーバエンジニアとしての業務の時代が変わると感じました。これからの変更が激しい時代において、Kubernetesは基盤の一つとして検討されることは間違いないです。しかし、現状は利用方法よりも意味的な内容の資料が多く、難しい勉強が大変だと思う方も多いでしょう。今回の記事がKubernetsの難解さ学びにくさの解消の一つになれれば幸いです。