Kubernetesの勉強

はじめに

ネットワーク研にいるのに、k8s も知らないのはなんかダメだなぁと思ったので勉強してみる。

参考

www.shoeisha.co.jp

kubernetes とは?

Kubernetes とは、オープンソースコンテナーオーケストレーションツールである。

そもそもコンテナとは

コンテナとは、ホスト OS 上に論理的な区画を作り、あるアプリケーションを動作させるのに必要なモジュール(ライブラリとかアプリケーションとか)を一つにまとめたもの。

なぜ他の仮想化技術に比べて軽量?

コンテナは Linux の通常のプロセスとほぼ同じ処理らしいが、それぞれのプロセスを 1 つのグループとして管理する(Linux で言えば namespace や cgroups などのカーネル機能とか) ことで、名前空間やリソースを他のプロセスやコンテナから隔離することができる。

  • ホスト型
    • Oracle VM VirtualBox など
    • ゲスト OS over 仮想化ソフトウェア over ホスト OS over ハードウェア
  • スーパバイザ型
    • Windows Hyper-V など
    • ゲスト OS over ハイパーバイザー over ハードウェア

Docker の特徴

Docker は、「コンテナ型仮想化」の代表例。

Docker が出来ることは、

  • コンテナの作成
  • コンテナの実行
  • コンテナ内でファイルシステムとして使われるイメージの作成・管理

逆に出来ないことは、

  • ネットワークのルーティング
  • 複数コンテナの連携
  • 複数台のサーバを対象としたコンテナの横断的な管理

コンテナオーケストレーションツールの必要性

コンテナオーケストレーションツールとは、すなわちコンテナを統合管理できるツールのこと。

シングルホストでは手軽なコンテナも、マルチホストで運用する際は、以下のような要求を満たさなければならない。

  • コンテナの操作(起動、停止、削除)
  • ホスト間のネットワーク接続
  • ストレージ管理
  • コンテナ-ホスト間のスケジューリング機能

Kubernetes

特徴

  • 複数サーバでのコンテナ管理(グルーピング)
  • コンテナのデプロイ
  • コンテナ間のネットワーク管理
  • コンテナの負荷分散
  • コンテナの監視
  • コンテナのアップデート
  • 障害発生時の自動復旧

アーキテクチャ1

k8s アーキテクチャ概要図 (https://github.com/kubernetes/kubernetes/blob/release-1.3/docs/design/architecture.md)

k8s-arch

コンポーネント

k8s は、1) マスターコンポネント と 2) ノードコンポネント により成る。

  • Master
    • k8s クラスタ全体を管理
    • コンテナを起動する Node を自動的に選択する
    • API Server
      • k8s のリソース情報を管理するための API
      • コンポーネントからのリソース情報を受け取り、データストア上に格納する
      • kubectl コマンドを使って操作する
    • Scheduler
      • Pod をどの node にデプロイするかを制御
    • Controller Manager
      • クラスタの状態を監視し、あるべき状態を維持する
    • データストア etcd
  • Node
    • コンテナアプリケーションを動作させるサーバ群
    • ノードは複数台でクラスタを構成
    • kubelet
      • Pod の定義ファイルに従ってコンテナを実行したり、ストレージをマウントしたり。
      • Node のステータス管理も行う

リソース

  • Pod
    • 複数のコンテナをまとめたもの
    • アプリケーションのデプロイの単位となる。
    • 同じ Pod のコンテナは、同じ Node 上に構築される。
  • ReplicaSet
    • クラスタ内で指定された数の Pod を起動しておく仕組み
  • Service
    • Kubernetes のネットワークを管理。
    • コンテナアプリケーションへのアクセス方法を決めるリソースのこと。
    • ポート番号やプロトコル、負荷分散のタイプなどを設定。

コンセプト

インフラ構成管理

今まで これから
オンプレ クラウド
メンテナンス 仮想化
長期運用 Immutable Infrastructure
システム構築の手順や変更履歴を管理 宣言的設定
  • Immutable Infrastructure
    • 一度構築したインフラは変更を加えない。
    • 変更または不要となった場合は、破棄して新しいものを作る。
  • 宣言的設定
    • システムの状態を管理
    • 自己修復が可能

Kubernetes を支える仕組み

  • スケジューリング
    • アプリケーションを適切なところにデプロイする仕組み
  • サービスディスカバリー
    • デプロイされたアプリケーションがどこに(サーバまたはノード)あるか見つけ出す
  • 構成レジストリ
    • サービスディスカバリーに用いる、インフラとサービスを動的に紐づけるもの。

Azure

リソースグループ

  • Azure が管理する、論理的な単位。
  • Azure ユーザが使うレジストリもこのグループで分割管理してそう。

Azure Container Registry

コンテナイメージの共有サービス。

  • 複数リージョン間でのレジストリ管理
  • セキュリティと CI/CD 管理
  • コンテナイメージの自動ビルド

Azure Kubernetes Service

Kubernetes クラスタを管理するパブリッククラウドのサービス。

サービスプリンシパル

ACR 内のコンテナイメージを取得するためのアクセス権限を、AKS に与えるために用いる。

作業

[ACR] コンテナイメージの作成

  1. リソースグループの作成
    $ az group create --resource-group $ACR_RES_GROUP --location japaneast
  2. レジストリの作成
    $ az acr create --resource-group $ACR_RES_GROUP --name $ACR_NAME --sku Standard --location japaneast
  3. サンプルコード(コンテナイメージ)の clone
    $ git clone git@github.com:ToruManabe/Understanding-K8s
  4. イメージのビルド
    $ az acr build --registry $ACR_NAME --image photo-view:v1.0 v1.0/

これを k8s クラスタ上で pull して動かす。

[AKS] 連携

  1. サービスプリンシパルの作成
    $ az ad sp create-for-rbac --name $SP_NAME --role Reader --scopes $ACR_ID --query password --output tsv
  2. クラスタの作成
    $ az aks create --name $AKS_CLUSTER_NAME --resource-group $AKS_RES_GROUP --node-count 3 --kubernetes-version 1.11.4 --node-vm-size Srandard_DS1_v2 --generate-ssh-keys --service-principal $APP_ID --client-secret $SP_PASSWD

ここでエラー発生…

Operation failed with status: 'Bad Request'. Details: The VM size of AgentPoolProfile:nodepool1 is not allowed in your subscription in location 'japaneast'. The available VM sizes are ...

とのこと。

仕方ないのでポータルの方を見に行く。確かに、利用できる VM のサイズは限られており、「汎用」ファミリは使えないよう。なんでや。

未指定も怖いので、とりあえず一番安い Standard_F2s_v2 にしてみる。

また怒られた。

Operation failed with status: 'Bad Request'.
Details: Provisioning of resource(s) for container service testAKSCluster in resource group testAKSCluster failed.
Message : Operation could not be completed as it results in exceeding approved Total Regional Cores quota.

Additional details - Deployment Model: Resource Manager, Location: japaneast, Current Limit: 4, Current Usage: 0, Additional Required: 6, (Minimum) New Limit Required: 6.
...

よく分からないが、作成したリソースグループの容量の都合上、作成できるノード数が 2 つまでだったらしい。CLI だとこういう問題の同定がしづらいよな…
以下でようやくクラスタが作成できた。なお、2020/04/02 現在、既定の k8s version は、1.15.10であった。

$ az aks create \
    --name $AKS_CLUSTER_NAME \
    --resource-group $AKS_RES_GROUP \
    --node-count 2 \
    --node-vm-size Srandard_F2s_v2 \
    --generate-ssh-keys \
    --service-principal $APP_ID \
    --client-secret $SP_PASSWD

アプリケーションのデプロイ

  • マニフェストファイルの作成
    • クラスターにどのようにアプリケーションをデプロイし、クライアントからのアクセスをどう処理するかの構成情報を定義する。
    • misc
      • どのようなアプリケーションを起動したいのか
      • どのくらいの CPU やメモリなどのコンピューティングリソースが必要か
      • ネットワークアドレスはどう割り当てたいか
    • service の設定も
      • K8s クラスター上で動作させた Pod に、クライアントからアクセスするためのサービスの設定
      • P.53 の図が分かりやすい。