AKS を始める場合、公式ドキュメントの以下の情報が役に立ちます。
どちらもまず試すには非常に重宝するものの、Kubernetes やコンテナ技術などある程度の知識がないと何を実行したのか理解できないまま終わる可能性があります。そこでチュートリアルを深堀することで、以下の達成を目指します。
- Kubernetes (k8s) と AKS の概要
- 基本的な k8s コマンドの理解と習得
- コンテナと関連技術の概要の理解
- サンプルアプリケーションの理解
前提条件
- Azure サブスクリプション (無料体験版もあります)
- Visual Studio または Visual Studio Code などの IDE
- Docker
- git
※尚、この記事は Windows 10 の環境でテストした内容を元にしています。
今回はまず k8s と AKS の概要についてみていきます。文字ばかりで面白みに欠けますが、今後のためにもキーワードを抑えるくらいのつもりで見てください。
コンテナとは
アプリケーションはこれまで OS 上に直接インストールされ実行されてきました。その後ハードウェアの進化により増加した CPU やメモリリソースを効率よく動作させるため、また設定や環境の異なる OS 上で動作するアプリケーションを利用できるよう仮想マシンが利用されるようになりました。
しかし仮想マシンは OS の全機能を持つためオーバーヘッドが大きいため、ここ数年はより効率よくアプリケーションを集約できるコンテナが利用されるようになっています。Docker がコンテナを実行するランタイムとして業界標準ツールとなっています。
Kubernetes とは
複数のコンテナから構成される複雑なアプリケーションを柔軟に展開したり、セキュリティやストレージの管理など大規模運用に必要な機能を提供する「コンテナオーケストレーター」の機能を提供する製品としては Kubernetes が実質の業界標準ツールとなっています。
Kubernetes はオーケストレーションを実現する主要なサービスとワークロードの調整などをするコンポーネントを持ったマスターノードと、開発したアプリケーションのコンテナを実行するノードから構成されます。尚、Kubernetes は最初の K と最後の S の間に 8 文字あることから k8s と省略されます。
Azure Kubernetes Service (AKS)とは
AKS は k8s のノードの利用に対してだけ課金を行う、Azure のサービスです。マスターノードや k8s のバージョン管理、必要なツール類の提供は全て Azure の機能と統合され Microsoft が管理するため、マネージド Kubernetes と呼ばれます。
AKS を k8s サービスを作成すると、AKS クラスターが作成され、自動的にノードとなる仮想マシンが作成、展開、構成されます。
以下に k8s や AKS の主要な概念についてまとめます。
クラスター マスター
AKS クラスターを作成すると k8s のマスター機能を持ったクラスターマスターが作成されます。クラスターマスターには以下の k8s の主要なコンポーネントが含まれます。
- kube apiserver: Kubernetes API を提供
- etcd: クラスターの構成に使うキー/バリューストア
- kube scheduler: どのノードにポッドを展開するかなど、ワークロードのスケジューリング機能
- kube contoller manager: Deployment や ReplicaSet コントローラーなど各種コントローラーの管理
それぞれの機能については今後の記事で随時詳細を紹介していきます。
ノード
マスターは AKS によって管理されますが、ノードは自分で管理する必要があります。ノードとは k8s のノードコンポーネントがインスールされた仮想マシンのことです。以下のコンポーネントが含まれます。
- kubelet: クラスターマスターと連携する k8s Agent
- kube proxy: k8s のネットワーク機能であり、サービスとポッドの IP を管理
- コンテナランタイム: AKS では Docker ではなく Moby というコンテナランタイムを使用
仮想マシンは AKS がサポートする数多くのサイズから選択が可能で、設定によっては自動的にノードの数を増減することもできます。詳細については今後の記事で紹介します。
ノードプール
ノードはノードプールに所属し、ノードプール内のノードは全て同じサイズの VM で構成されます。2019 年 9 月時点ではプレビュー機能として複数のノードプールがサポートされるため、サイズの異なる VM を 1 つの AKS クラスタで利用することができます。これにより機械学習を行うコンテナを含むポットは GPU をサポートするノード上に配置し、CPU をより使うコンテナを含むポッドは CPU がより強力なノードに配置することが可能です。ポッドの配置については今後の記事で紹介します。
ポッド
ポッドとはコンテナを 1 つ以上含むアプリケーションの単位です。多くのシナリオでは 1 ポッド 1 コンテナです。ポッドはノードに配置されますが、CPU やメモリなどのリソースの要求を定義できるほか、アプリケーションの起動設定や再起動のポリシーなど様々な設定が可能です。通常ポッドはデプロイを使って展開します。
サービス
各ポッドは IP アドレスがアサインされ直接通信することができますが、以下のようなシナリオでポッドに対する通信を維持することが困難になります。
- ポッドはいつ再起動するかわからず、再起動時には IP が変わる
- 複数ポッドがある場合に、機能にアクセスするための単一 IP が必要となる
また複数のポッドが存在する場合、ロードバランスなど通信の振り分けも必要となってきます。
サービスはネットワーク機能を提供するコンポーネントで、ポッドに対して通信をルーティングすることができます。
デプロイ
k8s でポッドやサービスを展開する場合、CLI を使って展開するか、yaml や JSON で定義したマニフェストをデプロイコントローラーに渡して展開します。デプロイを使うことでポッドだけでなくサービスの定義や、各種要素の詳細な設定を定義する事が可能であり、一括で適用できるため、通常はマニフェストを利用した展開が行われます。チュートリアルでもデプロイを使って展開するため、詳細はその時に紹介します。
レプリカセット
複数のポッドを起動したい場合、レプリカセットを使って指定した数のポッドを維持します。レプリカセットはデプロイの一部として定義します。指定された数のポッドは、リソースがあるノードで実行されるよう自動でスケジュールされます。
デーモンセット
レプリカセットは指定した数のポッドを維持する機能を提供しますが、どのノードで実行されるかはスケジューラーによって決定されます。その一方デーモンセットは対象となるノードすべてに対してポッドを起動することができるため、全ノードや特定のノード群に対してある機能を実行しておきたい場合はデーモンセットを使います。
ステートフルセット
アプリケーションは極力ステートレスになるよう設計されますが、データベースなどステートフルなポッドが必要な場合はステートフルセットを使って展開します。ステートフルセットを使うとストレージやネットワーク名などが保持されます。
当然このほかにも数多くの概念が存在しますが、それらはおいおい説明します。
サポートの範囲
AKS は Microsoft が管理する部分とユーザーが自分で管理する部分に分かれており、それぞれの責任範囲があります。サポートの詳細については Azure Kubernetes Service のサポート ポリシー を参照してください。
まとめ
今回は k8s と AKS についての概要をまず紹介しましたが、文章ばかりだと退屈で理解も進まないので、次回から見ていくチュートリアルの深堀で実際に学んでいきましょう。
参考
Azure Kubernetes Services (AKS) における Kubernetes の中心概念
What is Kubernetes
Azure Kubernetes Service のサポート ポリシー
Azure Kubernetes Service (AKS) でサポートされている Kubernetes のバージョン