Open3

Gettting started Kubernetes!

shin_k_2281shin_k_2281

Kubernetesとは

コンテナのオーケストレーションツール。

複数のコンテナを管理して運用できるのがKubernetesの役割。

複数のコンテナとは全く同じ構成のコンテナが複数という意味。

また、docker-composeと違う点は、docker-composeが複数のコンテナやボリュームの作成
のみを行えるのに対し、k8sは作成して管理しあるべき状態を維持するように監視することが可能

また、定義ファイル(docker-compose.yamlとマニフェストファイル)は、k8sの方は作成された定義ファイルをetcdというデータベースで管理するという点でも異なる。

この情報によってpodが管理される。
また、k8sの定義ファイルはコマンドによっても書き換えられる。

Kubernetesは複数の物理的マシンに複数のコンテナがあることが前提

20個のコンテナが必要ならば20回docker runしなければならない、という事を改善する。

Docker Composeを使用したとしても物理マシンの数が多ければ手間は相当なものになる。

そこでKubernetesを使用することでコンテナの作成や管理をよしなにやってくれる

マニフェストファイルというものを定義することで、全ての物理マシンにコンテナを作成して管理する

マスターノードとワーカーノード

マスターノード

ワーカーノードを管理し、コントロールするノード
マスターノード上ではコンテナは動いていない

管理する側のPCにはkubectlを入れて、これを使ってマスターノードにログインし
初期設定や各種調整を行う

ワーカーノード

実際にタスクを動かすノード

クラスター

マスターとワーカーで構成されたk8sシステムの一群をクラスターという
クラスターは自立していて、人間が命令をせずとも、マスターに設定された内容に従って
マスターノードが自立的にワーカーノードを管理する。

Kubernetesを使うには

  • k8sのインストール
  • CNI(仮想ネットワークドライバ)のインストール
    • flannel
    • Calio
    • AWS VPC CNI

マスターノードはコンテナなどの状態管理のためにetcdというデータベースを入れる。
ワーカーノードにはDockerEngineなどのコンテナエンジンが必要

etcd
定義ファイルをデータベース化したもの。
etcdに定義されたオブジェクトをインスタンス化することによって
実際のPodやサービスなどが稼働する。

コントロールプレーンとkube-let

マスターノードでは、コントロールプレーンを使ってワーカーノードの管理をする

コントロールプレーンは5つのコンポーネントで構成される。

マスターノードのコントロールプレーン構成

  • kube-apiserver
    外部とやりとりをするプロセス
  • kube-controller-maneger
    コントローラーを統括管理、実行する
  • kube-scheduler
    Podをワーカーノードへ割り当てる
  • cloud-controller-manager
    クラウドサービスと連携してサービスを作る
  • etcd
    クラスター情報を全管理するデータベース
    • etcd以外はk8sの標準搭載となっている

ワーカーノードの構成

  • kube-let
    マスターノード側のkube-schedulerと連携してワーカーノード上にPodを配置して実行。
    また、実行中のPodの状態を定期的に監視してkube-schedulerへ通知する
  • kube-proxy
    ネットワーク通信をルーティングする仕組み

Kubernetesの構成

Pod

kubernetesではコンテナはPodという単位で管理される。
Podはコンテナとボリュームがセットになったもの。
しかしPod内にボリュームを作らないこともある

サービス

Podをまとめて管理するものをサービスと呼ぶ。
異なるワーカーノードに属するPodもその違いを気にせずにサービスがPodをまとめることもある
→複数のワーカーノードでも同じPodは一つのサービスが管理する

また、この役割はいわばロードバランサーと同じ。
サービスごとに自動でIPアドレスが割り当てられ、そこにアクセスしてくる通信を捌く。
より上の各ワーカーノードへの振り分け自体は、本物のロードバランサやイングレスなどで行う。

レプリカセット

Podの数を管理する。
障害などでPodが停止した場合など、足りない分を増やしたり、定義ファイルを元に実際のPodに
差分があった場合は削除したりする。
Podはサービスとレプリカセットの2つの管理のもとで稼働する。

レプリカセットにより管理されている同一構成のPodはレプリカという

デプロイメント

**Podのデプロイを管理する。**Podがどのイメージを使うかなどの情報を持つ。
レプリカセットは単体では使い勝手が悪いので、基本的にデプロイメントと一緒に使う。

kubernetesのその他のリソース

  • pod
  • podtemplates
  • replication controllers
  • resource quotas
  • secrets
  • service accounts
  • service
  • demonsets
  • deployments
  • replicasets
  • statefulsets
  • cronjobs
  • jobs
shin_k_2281shin_k_2281

定義ファイルの書き方

  • k8sはマニフェストファイルで登録されたないように従ってPodを作成する。
  • 定義ファイルの内容をapplyするとそれがetcdに読み込まれてサーバーがその状態を保つようになる
  • 定義ファイルはリソース単位で記述する。
    • 主に最初に作成するのはデプロイメントかサービスになる。
      →Podを作るのだが、Podとして定義ファイルを作成する場合は、
      Podしか作成されないので、それを抱擁する大きなまとまりである
      サービスやデプロイメントとして定義することもある。
    • デプロイメントとして定義すると、それはレプリカセットとPodを定義したことにもなる

各リソースの概要

  • Node
    Kubernetesクラスタで実行するコンテナを配置するためのサーバ

  • NameSpace
    Kubernetesクラスタ内で作る仮想的なクラスタ

  • Pod
    コンテナ集合体の単位で、コンテナを実行する方法を定義する

  • ReplicaSet
    同じ仕様のPodを複数生成・管理する

  • Deployment
    ReplicaSetの世代管理をする

  • Service
    Podの集合にアクセスするための経路を作る

  • Ingress
    ServiceをKubernetesクラスタの外に公開

  • ConfigMap
    設定情報を定義し、Podに供給する

  • PersistentVolume
    Podが利用するストレージのサイズや種別を定義する

  • PersistentVolumeClaim
    PersistentVolumeを動的に確保する

  • StorageClass
    PersistentVolumeが確保するストレージの種類を定義する

  • StatefulSet
    同じ仕様で一貫性のあるPodを複数生成・管理する

  • Job
    常駐目的ではない複数のPodを作成し、正常終了することを確保する

  • CronJob
    cron記法でスケジューリングして実行されるJob

  • Secret
    認証情報などの機密データを定義する

  • Role
    Namespace内で操作可能なKubernetesリソースのルールを定義する

  • RoleBinding
    RoleとKubernetesリソースを利用するユーザを紐づける

  • ClusterRole
    Cluster全体で操作可能なKubernetesリソースのルールを定義する

  • ClusterRoleBinging
    ClusterRoleとKubernetesリソースを利用するユーザを紐づける

  • ServiceAccount
    PodにKubernetesリソースを操作させる際に利用するユーザー