Kubernetesの勉強
はじめに
ネットワーク研にいるのに、k8s も知らないのはなんかダメだなぁと思ったので勉強してみる。
参考
kubernetes とは?
Kubernetes とは、オープンソースのコンテナーオーケストレーションツールである。
そもそもコンテナとは
コンテナとは、ホスト OS 上に論理的な区画を作り、あるアプリケーションを動作させるのに必要なモジュール(ライブラリとかアプリケーションとか)を一つにまとめたもの。
なぜ他の仮想化技術に比べて軽量?
コンテナは Linux の通常のプロセスとほぼ同じ処理らしいが、それぞれのプロセスを 1 つのグループとして管理する(Linux で言えば namespace や cgroups などのカーネル機能とか) ことで、名前空間やリソースを他のプロセスやコンテナから隔離することができる。
- ホスト型
- Oracle VM VirtualBox など
- ゲスト OS over 仮想化ソフトウェア over ホスト OS over ハードウェア
- スーパバイザ型
Docker の特徴
Docker は、「コンテナ型仮想化」の代表例。
Docker が出来ることは、
- コンテナの作成
- コンテナの実行
- コンテナ内でファイルシステムとして使われるイメージの作成・管理
逆に出来ないことは、
- ネットワークのルーティング
- 複数コンテナの連携
- 複数台のサーバを対象としたコンテナの横断的な管理
コンテナオーケストレーションツールの必要性
コンテナオーケストレーションツールとは、すなわちコンテナを統合管理できるツールのこと。
シングルホストでは手軽なコンテナも、マルチホストで運用する際は、以下のような要求を満たさなければならない。
- コンテナの操作(起動、停止、削除)
- ホスト間のネットワーク接続
- ストレージ管理
- コンテナ-ホスト間のスケジューリング機能
Kubernetes
特徴
- 複数サーバでのコンテナ管理(グルーピング)
- コンテナのデプロイ
- コンテナ間のネットワーク管理
- コンテナの負荷分散
- コンテナの監視
- コンテナのアップデート
- 障害発生時の自動復旧
アーキテクチャ1
k8s アーキテクチャ概要図 (https://github.com/kubernetes/kubernetes/blob/release-1.3/docs/design/architecture.md)
コンポーネント
k8s は、1) マスターコンポネント と 2) ノードコンポネント により成る。
- Master
- 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] コンテナイメージの作成
- リソースグループの作成
$ az group create --resource-group $ACR_RES_GROUP --location japaneast
- レジストリの作成
$ az acr create --resource-group $ACR_RES_GROUP --name $ACR_NAME --sku Standard --location japaneast
- サンプルコード(コンテナイメージ)の clone
$ git clone git@github.com:ToruManabe/Understanding-K8s
- イメージのビルド
$ az acr build --registry $ACR_NAME --image photo-view:v1.0 v1.0/
[AKS] 連携
- サービスプリンシパルの作成
$ az ad sp create-for-rbac --name $SP_NAME --role Reader --scopes $ACR_ID --query password --output tsv
- クラスタの作成
$ 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