銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Azure Kubernetes with Azure Cosmos DB (preview) を試してみた

//Buildで発表されたAzure Kubernetes with Azure Cosmos DB (preview)を試してみた記録です。

docs.microsoft.com

これは何かというと、kubernetesの必須コンポーネントであるetcdを通常etcd clusterではなく、代わりにマネージドサービスであるAzure Cosmos DBのetcdAPI機能を使うというものです。

docs.microsoft.com

ちなみに発表されたのはBuild期間中なのですが、元になるGitHubのドキュメントは半年くらい前から見える状態でした。

目次

kubernetesにおけるetcdとは

etcdというのは、一貫性を持った分散型のkey-valueストアです。kubernetesを構成する複数のノードのどこからアクセスしても、どこからアップデートしても、一貫性をもって同じデータが取得できる仕組みを支えています。kubernetesクラスターが持つ情報はetcdに保存されます。

kubernetes.io

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で賄おうをいうのがこの機能となります。具体的に何がうれしいかというのはここに書いてあります。

docs.microsoft.com

大規模なクラスターを組んだとき(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を指定します。appIdpasswordをメモしておきます。

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 <作成したリソースグループ名>

正常に展開できると、こんな感じにあっさりとしたログが表示されます。 f:id:tanaka733:20190508184146p:plain

動作確認

リソースグループを見るとこんな風に構成されています。 f:id:tanaka733:20190508184300p:plain

また、_outputというディレクトリの下に各種証明書や設定ファイルが出力されているので、これでkubectlを使うことができます。

KUBECONFIG=_output/kubeconfig/kubeconfig.centralus.json kubectl get nodes

f:id:tanaka733:20190508184647p:plain

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のお値段ですが、少し様子を見てみたいと思います。