Kubernetes 導入編(備忘録)

Kubernetes 導入編(備忘録)

はじめに

どうもこんにちわ!

今回からIT系の話題についても触れていきたいと思います。

Kubernetesについて、復習の意味を込めて、4回くらいに分けて投稿していきたいと思います。初めての方にもわかりやすいように書いていこうと思います。

今回はKubernetes完全ガイドという本を参考にしております。この本は非常によくまとまったおり、初心者の方、または触ったことのある方の復習用にぴったりです!


Kubernetes完全ガイド Production-Grade Containe (impress top gear) [ 青山真也 ]

それでは、スタートです。

Kubernetesとは

Kubernetesとは、コンテナー化されたアプリーケーションを管理するオーケストレーションツールです。

コンテナー=dockerとイメージされている方も多いと思いますが、コンテナー技術はdoker以外にもcontainer-dやcri-oなどがあります。これらを総称して、コンテナーランタイムと呼びます。

ただし、これらのコンテナーランタイムはいわば土台となります。それだけでは本番環境の運用に耐えうるものではなく、それらを管理するオーケストレーションツールが必要となります。

コンテナー向けのオーケストレーションツールはKubernetes以外にもdocker swamなどもありますが、Kubernetesはオーケストレーションツールのデファクトスタンダードとなっています。

Kubernetesを使うと良いこと

kubernetesを使用すると以下の管理が容易になります。

  • Kubernetes Nodeの管理
  • コンテナーのスケジューリング
  • ローリングアップデート
  • スケーリング・オートスケーリング
  • コンテナの死活監視
  • 障害時のセルフヒーリング
  • ロードバランシング
  • サービスディスカバリ
  • データの管理
  • Infrastructure as Code
  • その他エコシステムの連携

1つずつ簡潔に解説していきます。

Kubernetes Nodeの管理

コンテナーが実際に稼働するNodeのことをWorkerなどと呼びます。(各クラウドサービスによって名称が異なります。)Kubernetesでは、これらの管理を行うことができます。例えば、グルーピング(プール)の作成を行ったり、Nodeのリソース状態の管理することができます。

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

コンテナーはworkerにスケジューリングされていきますが、どのworker上で動かすかどうかをkubernetesは管理することができます。簡単にいうと「ディスクIOが頻繁に発生するPod」に対しては、「ディスク性能が良いworker」にデプロイすることが可能です。

スケーリング・オートスケーリング

複数のコンテナを異なるWorkerにデプロイすることが可能です。また、レプリカ数を決めておけば、常にその数、Podを稼働させておく設定も可能です。Node自体の増減も自在に行うことができます。

コンテナの死活監視

TCP、HTTPによる死活監視が可能です。livenessprobeとreadnessprobeなどがありますが、次回以降で説明します。

障害時のセルフヒーリング

コンテナーのプロセスが停止した場合、スケージュールされていれば、自動的にコンテナーは再デプロイされます。例えば、稼働しているWorkerで障害が発生した時も他のNodeで自動起動させることが可能です。

ロードバランシング

コンテナへのアクセスのルーティングはKubernetes内のロードバランシング機能が担っています。ServiceやIngressなどのリソースのことです。例えば、コンテナ障害時のServiceからの切り離しや、スケーリング時の追加・削除などを自動的に行ってくれます。

サービスディスカバリ

Kubernetesは必要に応じて、Pod数を上限させたりすることができるダイナミクスなシステムです。同時に複数のPodが異なるNode上で稼働しているため、どのサービスが動いているのか把握することが困難になります。これを把握する仕組みがサービスディスカバリと呼び、これらの機能をKubernetesは持っています。

データの管理

Kubernetesでは、バックエンドのデータストアにetcdを採用しています。etcdはクラスター間でデータを共有できるキーバリュストアです。キーバリューストアとは、keyを指定するとそれに紐づいたバリュー(値)を呼び出すことができる仕組みとなっているデータストアのことです。

Kubernetesでは、コンテナやServiceに関するマニフェストが冗長化されて保存されています。

Infrastructure as Code & エコシステムとの連携

Kubernetesでリソースをデプロイするためには、マニュフェストファイルというyaml形式で記載されたファイルを使用します。つまり、すべてコードで管理することができます。

これに付随し、多くのミドルウェアでKubernetesをサポートしています。

具体的なものは以下になります。

  • Ansible : Kubernetesへのコンテナのデプロイ
  • Fluentd : Kubernetes上のコンテナログを転送
  • Jenkins : Kubernetesへのコンテナのデプロイ
  • Spinnaker : Kubernetesへのコンテナのデプロイ
  • Prometheus : Kubernetesのモニタリング

Kubernetesの導入方法

導入方法には以下3つの選択肢があります。

ローカルで稼働

MinikubeやDocker for Macなどがありますが、Macユーザーであれば、Docker for Macが簡単かと思います。注意点としては、単一のNodeしか使用できません。

Qitaに導入記事があったので、参考にしてください。

https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

Kubernetesを手軽に実行してみたい場合、一番手っ取り早いのはローカルで実行することです。

Kubernetes構築ツールの活用

続いて、オンプレミスのサーバーや、publicクラウドの仮想サーバーに環境を構築した場合はkubeadmやRancherを使用することができます。私は、AWS上のubuntusサーバーにkubeadmでKubernets環境を構築しましたが、なかなか骨が折れる作業でした。

その他、Enterprise向けには、IBM Cloud PrivateやRedHat Openshiftなどを利用することができます。本番業務で使用する場合はこちらの選択肢になるでしょう。

マネージドサービス

クラウドベンダーが提供しているKubernetesサービスです。Google Kubernets Engine(GKE)、Azure Kubernetes Servie(AKS)、Elastic Container Service for Kubernetes(EKS)、IBM Cloud Kubernetes Service(IKS)などがあります。

おそらく、public クラウドサービスを活用して、本番運用をする上では、必須サービスとなります。各社それぞれ特徴があり、AWSでは複数種類のサービスを提供していたりましす。(AWS Fargateなど)


今回はここまでで、次回はKubernetesのリソースについて、記載したいと思います。

CodeCampGATE