//Buildで発表されたAzure Kubernetes with Azure Cosmos DB (preview)を試してみた記録です。
これは何かというと、kubernetesの必須コンポーネントであるetcdを通常etcd clusterではなく、代わりにマネージドサービスであるAzure Cosmos DBのetcdAPI機能を使うというものです。
ちなみに発表されたのはBuild期間中なのですが、元になるGitHubのドキュメントは半年くらい前から見える状態でした。
目次
kubernetesにおけるetcdとは
etcdというのは、一貫性を持った分散型のkey-valueストアです。kubernetesを構成する複数のノードのどこからアクセスしても、どこからアップデートしても、一貫性をもって同じデータが取得できる仕組みを支えています。kubernetesクラスターが持つ情報はetcdに保存されます。
etcd自身の高可用のために奇数個のノードからなるクラスター(kubernetesのクラスターとは別。kubernetesを動かすマシンと同居させてもいいし、隔離してもいい)を組みことが推奨され、ノードのCPUやディスク、ノード間のネットワークなどは比較的高いパフォーマンスが求められます。
etcd/faq.md at master · etcd-io/etcd · GitHub
etcd/hardware.md at master · etcd-io/etcd · GitHub
という事情があるため、etcdクラスターを構築して運用するのもそれなりに大変なのですが、そこをManagedなサービスであるCosmos DBで賄おうをいうのがこの機能となります。具体的に何がうれしいかというのはここに書いてあります。
大規模なクラスターを組んだとき(etcdで管理するオブジェクトも多くなる)やregionを超えてのスケーラビリティや安定性についても言及があります。
クラスターの作成
"Azure Kubernetes"とありますが、今のところマネージドなAKSではなく、AKS engineでのみ利用可能です。一番上にリンクしたドキュメントに従って作成しますが、いくつか前提条件があります。
- etcd API in Azure Cosmos DB はpreviewなのであらかじめ申請フォームから申し込んで許可されておく必要があります。自分の場合は一晩でOKが出ました。 https://aka.ms/cosmosetcdapi-signup
- Azure CLI をインストールしておきます。 ー
- リソースプロバイダーでDocumentDBを登録しておく
az provider register --namespace Microsoft.DocumentDB
- Azure Kubernetes Engineの v0.32.3 が必要とあるのでこれをローカルマシンにインストールします。インストールといっても、GitHubのリリースページにある圧縮ファイルをダウンロードし、展開しておくだけです。Windows, Linux, macOSごとに用意されているので適当なものを選びます。自分はWindows Subsystem for Linux (WSL)上で作業をしました。
あとは手順通りすすめていきます。リージョンはcentralus
でしか利用できないので一択です。
az group create --name akscosmosetcd --location "centralus"
Azure AD Service Principalを作成します。scopesには先ほど作成したリソースグループのIDを指定します。appId
、password
をメモしておきます。
az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/<subscriptionID>/resourceGroups/<resource_group_name>"
apiModel.json
というファイル名で以下の内容を保存します。ファイルパスは任意でいいような気もしますが、先ほど展開してできたディレクトリの中にあるaks-engine
という実行可能ファイルと同じ階層に配置しました。
{ "apiVersion": "vlabs", "properties": { "orchestratorProfile": { "orchestratorType": "Kubernetes", "kubernetesConfig": { "useManagedIdentity": false } }, "masterProfile": { "count": 1, "dnsPrefix": "", "vmSize": "Standard_D2_v3", "cosmosEtcd": true }, "agentPoolProfiles": [ { "name": "agent", "count": 1, "vmSize": "Standard_D2_v3", "availabilityProfile": "AvailabilitySet" } ], "linuxProfile": { "adminUsername": "azureuser", "ssh": { "publicKeys": [ { "keyData": "" } ] } } } }
そして、AKS Engineの展開を行います。ドキュメントには--resource-group
がないのですが、指定しないとどうも`--dns-prefix=で指定した値が使われてしまいうまく動かなかったので指定しました。
./aks-engine deploy \ --subscription-id <subscriptionID> \ --client-id <メモしたappId> \ --client-secret <メモしたpassword> \ --dns-prefix <適当な一意なDNS prefix> \ --location centralus \ --api-model <apiModel.jsonのフルパス> \ --force-overwrite \ --resource-group <作成したリソースグループ名>
正常に展開できると、こんな感じにあっさりとしたログが表示されます。
動作確認
リソースグループを見るとこんな風に構成されています。
また、_output
というディレクトリの下に各種証明書や設定ファイルが出力されているので、これでkubectl
を使うことができます。
KUBECONFIG=_output/kubeconfig/kubeconfig.centralus.json kubectl get nodes
etcdへの接続を検証したいので、etcdctlをインストールします。
Release v3.3.13 · etcd-io/etcd · GitHub
--prefix --keys-only
をつけて実行しようとするとError: rpc error: code = Unimplemented desc = etcdserver: Range operation with KeysOnly is not supported on Cosmos Etcd
と怒られます。しょうがないので、keys-only
を外して実行しましょう。
ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --cert=_output/etcdclient.crt --key=_output/etcdclient.key --endpoints=https://<CosmosDBの名前>.etcd.cosmosdb.azure.com:2379 get /registry --prefix
値も出力されるのですごい量が出力されますが、etcdの中身も確認することができました。 気になるのは、CosmosDBのお値段ですが、少し様子を見てみたいと思います。