SE(しがないエンジニア)のブログ

IT技術ネタ(クラウド・セキュリティ周り)が中心です!他雑記(お馬さん 他いろいろ)もあり。

Kubernetes(AKS)をやさしく学ぶ旅 その5

今回はハンズオンなしです

前回、割とガッツリなハンズオンだったので今回は要点を押さえた座学?形式でまとめようと思います。

Kubernetes の仕組みを覚える為の用語たち

スケジューリングとディスカバリー

スケジューリング

アプリケーションを適切なところにデプロイする仕組みで個別の要件に合わせたものをマニフェストファイルで定義しクラスター内サーバーに(独自アルゴリズムで)デプロイする。

サービスディスカバリー

デプロイされたアプリケーションがどこにあるかを見つけだす仕組み。Kubernetes とセットのキーワードで良く挙げられる「マイクロサービス」型のアプリケーションでは小さな機能を提供する多数のサービスで組み合わされシステムを作る。その際のサービス間のやり取りを担う。サービスディスカバリーの種類としては「固定IPアドレス」や「構成レジストリ」が挙げられる。

Kubernetesのサーバー構成

Master

Kubernetesクラスター全体を管理する役割を担う。Master は etcd と呼ばれる分散キーバリューストア(KVS)を使ってクラスターの構成情報を管理している。

Node

コンテナーアプリケーションを動作させるサーバー群。通常は Node を複数用意して、クラスターを構成する。クラウドでは仮想マシンVMインスタンスが Node になることが一般的。

と、ここまでをまとめるとこんな感じです。

f:id:btsn:20191010231919j:plain

図のように Master の APIクラスター全体を制御します。

Kubernetesコンポーネントたち

Master

API Server

Kubernetes のリソース情報を管理するためのフロントエンドの REST API。各コンポーネントからリソース情報を受け取り、データストアである etcd に格納する役目を持っている。他のコンポーネントは etcd の情報に API Server を介してアクセスし、開発者/システム管理者がこの API Server にアクセスする際には kubectl コマンドを利用する。

Scheduler

Pod をどの Node で動かすかを制御するためのバックエンドコンポーネント。前回のその4 計5つの Pod をクラスターで動作させましたが、Kubernetes 内部では Scheduler によって Pod の配置先を割り当てていました。

Controller Manager

Controller Manager は Kubernetes クラスターの状態を監視し、あるべき状態の維持に努めるバックエンドコンポーネント

データストア(etcd)

Kubernetes クラスターの構成を保持する分散KVS。Key - Value型でデータを管理する。マニフェストの内容が保存されるイメージを持つとよい。

Node

Kubelet

Node では kubelet というエージェントが動作しており、Pod の定義ファイルに従ってコンテナーを実行したりストレージをマウントしたりする機能を持つ。

kube-proxy

さまざまな中継、変換を行うネットワークプロキシ。

Kubernetes のリソースたち

アプリケーションの実行

Pod

Kubernetesでは複数のコンテナーをまとめて Pod という単位として管理する。Pod は Kubernetes においてアプリケーションのデプロイの単位となり、Pod の単位で作成や開始、停止や削除などを行う。

ReplicaSet

ReplicaSetはクラスター内で指定された Pod を起動しておく仕組み。起動中の Pod を監視し、何かしらの理由で停止してしまった場合に該当の Pod を削除し新たな Pod を起動するようにする。

Deployment

アプリケーションの配布単位を管理するもの。Deployment は ReplicaSet の履歴を持ち、Pod  内のコンテナーのバージョンアップを行いたい時に停止することなくローリングアップデートできる。また、ロールバック(1つ前の世代に戻す)もできる。

DaemonSet

ReplicaSet で Pod を配置する際には Node の選択ができないものの、「各 Node に Pod を1つずつ配置する」といった場合には DaemonSet で要件を叶える。

StatefulSet

基本的にコンテナーアプリケーションはステートレスであるが、データベースなど永続データと連携する場合は状態を保持する必要がある。その際に利用するのが StatefulSet。

ネットワークの管理

Service

Kubernetes クラスター内で起動した Pod に対してアクセスするときは Service を定義する。

Ingress

クラスター外部のネットワークからアクセスを受け付けるためのオブジェクト。

アプリケーション設定情報の管理

ConfigMap

アプリケーションの設定情報や構成ファイル等の固有識別情報を Pod から参照できる仕組み。

Secrets

ConfigMap と同様に構成情報をコンテナーアプリケーションに渡すものだが、DBに接続するときのパスワード他、秘匿性の高い情報を管理するときに利用。

バッチジョブの管理

Job

1つまたは複数の Pod で処理されるバッチ的なジョブ。

CronJob

決まったタイミングで繰り返す Job の実行に使われるリソース。

 マニフェストファイル

Kubernetes は宣言的設定を行うときにマニフェストファイルを使用します。

マニフェストファイルの基本

Kubernetes ではクラスター内で動かすコンテナーアプリケーションやネットワークの設定、バッチ実行するジョブなどのリソースを作成します。リソースの具体的な設定情報はファイルで管理しておりそのファイルがマニフェストファイルです。(YAML形式)

ちなみに、マニフェストファイルをクラスターに登録する際は kubectl コマンドを利用します。

$ kubectl apply -f webserver.yaml

 クライアントから受け取った命令をベースに Kubernetes Master の API Server が構成情報である etcd に書き込みます。ちなみに、クラスターから削除する場合は その4 でも実行しておりますが下記のコマンドで実現できます。

$ kubectl delete -f webserver.yaml

ちなみに、マニフェストファイルの書き方は下記が参考になります。

qiita.com

YAML はインデントでデータの階層構造を表すのでインデントが正常な形式でないとエラーになるので注意しましょう!私はそこで少しはまりました。。

その他、、

他にも Pod の管理に最適なラベル設定やリソースをまとめて仮想的に分離する Namespace という機能がありますがこれ以上書くと長くなってしまうので今回は割愛します・・・・。