Kubernetes(k8s)の基礎

はじめに

私がKubernetesに興味をもったのは,9月東京でCyberAgentさんが行ったDC見学会がきっかけでした. DC見学会の詳細は秘密保持契約などもあるため割愛します.

それまで私はHDDやSSDなどハードウェア目線での運用に興味を持って学んできましたが,DC見学会後の社員さんとの座談会でOpenStackやKubernetesの話題が持ち上がりました.研究もホスト上に直で環境を構築して行っていたのもありコンテナの「コ」の字も分からなかったので,そこでコンテナ技術に興味を持ちました.

またちょうどその時研究室内で学習用サーバを追加する話が持ち上がっていたためKubernetesを用いてまとめて管理できればいいと思い,Qiitaやブログなどを参考に学びはじめました.ネットの情報だけでは体系的な知識が身につかないと考え,以下のKubernetes完全ガイドを購入して詳しく学びました. 忘れないうちにこのブログでKubernetesについてを自分用のメモとしてまとめておきます. 本記事ではKubernetesの導入方法などは書きません.

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)

  • 作者:青山 真也
  • 発売日: 2018/09/21
  • メディア: 単行本(ソフトカバー)

Kubernetesとは

作ったところ

Googleの社内で利用されていたコンテナクラスタマネージャを基に作られたOSSです.現在ではCloud Native Computing Foundation(CNCF)で管理,開発が行われています.

www.cncf.io

CNCFには様々なプロジェクトがありますが成熟度合いが設定されており,KubernetesはGraduatedと呼ばれる最高グレードに位置付けられているため非常に安定して動作し,アップデートなども頻繁に行われています.その他のCNCFにおけるGratuatedグレードに分類されているプロジェクトは以下の通りです.

www.cncf.io

概略

Kubernetesはコンテナオーケストレーションエンジンと呼ばれるものです.コンテナオーケストレーションエンジンとはDockerをはじめとするコンテナランタイムで コンテナ化されたアプリケーションのデプロイやスケーリング管理などの自動化を可能とします. Dockerなどのコンテナランタイム単体では複数のホストを連携させて運用したりまとめて管理することが難しいので,Kubernetesをはじめとする コンテナオーケストレーションエンジンを使用します.Kubernenetesは下図のようなイメージです. Kubernetesには役割で大きく分けてWorkerとMasterと呼ばれるNodeが存在します.Workerは実際にコンテナを展開し,アプリケーションをデプロイするNodeになります.Masterは複数のWorkerを管理するためのNodeになります.Masterは基本的に1Nodeから作成できますが複数のMasterを作成することで,Master Nodeの冗長化をすることも可能です.Worker Nodeもまた複数用意することができます.このMasterとWorkerの塊をKubernetes Clusterと呼び,サービスレベル目標(SLO)では一つのKubernetes Clusterあたり5000Node以内に収めることが推奨されています.

kubernetes_image
Kubernetesイメージ図

できること

Kubernetesでは以下のようなことができます.また,以下以外にも多くの機能がありますが,今回は割愛します.

  • マルチノードのコンテナ管理

  • コンテナのスケジューリング

  • リソース管理

  • スケーリング

  • Infrastructure as Code(IaC)

  • セルフヒーリング

etc...

マルチノードのコンテナ管理・リソース管理

概略の序盤でも述べましたが,仮想マシン・物理マシンを問わずマルチノードでコンテナの管理を行うことができます.

コンテナのスケジューリング

マルチノード構成においてコンテナランタイムのみで運用している場合必要なリソースを考えてどの仮想マシン・物理マシンにコンテナを配置するか考えなければなりませんが,Kubernetesでは必要なリソースを伝えると図2のようにユーザはNodeを意識することなく自動で最適なNodeが選択されコンテナがデプロイされます.もちろん,手動で展開したいNodeを選択することで好きなNodeにコンテナをデプロイすることも可能です.しかし実際は図3のようにWorkerの上にPodと呼ばれるものを作り,その中でコンテナをデプロイしています.そのためNodeやPodをまたいでコンテナのデプロイはできません.また,SLOでは一つのKubernetes Cluster上で15,000 Pod以下を推奨しています.

auto_scheduling
オートスケジューリング

actually_kubernetes
Kuberntesの実際の動き

スケーリング

同じコンテナイメージを使用することで同じコンテナを複数のノードに作成することができ,負荷分散や耐障害性の向上をすることが可能になっています. またオートスケーリング機能もあり,自動的に行うことも可能です.

Infrastructure as Code(IaC)

KubernetesYAMLファイル・JSONファイルでデプロイしたいコンテナなどの管理をすることができます. これによりシステム構築や管理の自動化もできます.

セルフヒーリング

もしKubernetes Cluster内のWorker Nodeに障害が発生した場合でも正常動作しているNodeで自動的にコンテナをデプロイしてくれます. セルフヒーリング機能により障害発生時も速やかに復旧することが可能になり,耐障害性を高めることができます.

Kubernetes動作環境

Kubernetesは大きく分けてオンプレミス上にインストールし実行する方法や,パブリッククラウド上でマネージドなKubernetes環境を構築・使用する方法などがあります.

オンプレミス

オンプレミス上にKubernetesを導入する場合一から手動での構築もできますが非常に難易度が高いです.そのためkubeadmのようなKubernetes導入ツールを用いることで簡単にオンプレミス環境にKubernetesを導入することができます.

オンプレミス上にKubernetesを導入する場合,ホスト間・ノード間での通信を可能にするためKubernetes Cluster内のネットワークを構築する必要があります. Kubernetes Cluster内ネットワークの構築手段は複数用意されておりCalicoやCanal, Flannelなどがあります.

Managed Kubernetes Service

パブリッククラウドでもマネージドなKubernetesサービスが用意されており,GoogleのGKE(Google Kubernetes Engine)やAmazonAmazon EKS(Amazon Elastic Container Service for Kubernetes)やMicrosoftAKS(Azure Kubernetes Service)があります.このようにメジャーなパブリッククラウドでサポートされているため,パブリッククラウドでもKubernetesを快適に使用することができます.設定方法などはクラウド事業者毎に少し異なります.

cloud.google.com

aws.amazon.com

azure.microsoft.com

まとめ

Kubernetesについて簡単にまとめて見ましたが,これから実際に導入などを行って行きます. 実際の構築なども気が向いたらブログでまとめます.