Azureで遊び始める


GCPの1年の試用期間が終了、AWSと違い3万円くらいのクレジットが配布されるたので全くお金かからずに楽しめましたが、低コスト運用ばかり考えてがっつり余ってしまいました。もっと攻めておけば良かったと反省しています。

Azure

AWS,GCPと触ったので次はAzureの試用期間を楽しみます。AzureはKubernetesが使えるAKSと、無料枠でもmacOSが使えるAzure pipeline、SQL Databaseを主に触る予定です。Kubernetesはどの程度コストがかかるのか良くわかっていないので不安ながら楽しみです。

今回はアカウント取得からAKSで簡単なWebページの公開までやってみます。

アカウント登録とCLIツールのインストール

Azureアカウントを取得、登録にはクレジットカードが必要でした。登録が終わったらAzure CLIツールをインストール。セットアップ手順は変わる可能性があるので公式をみてください。以下は参考程度。kubernetes-cliはインストールしていなければインストール

macOS での Azure CLI のインストール

brew update && brew install azure-cli
brew install kubernetes-cli
az login

Azure Container Regsitryの作成

ブラウザからACR管理画面で作成しました。色々終わった後に気づきましたが、非公開イメージを作らないならACR作成しなくてもまずはdockerhubで良かった気がします。

  • レジストリ名:任意
  • リソースグループ: 任意
  • 場所:西日本
  • SKU: basic

SKUはレジストリの性能を決めるようです、一番安いbasicを選択。場所は日本在住なら日本が良いと思います。

pythonのアップデート

dockerイメージをACRレジストリに登録しようとしたところ、pythonのエラーが出ました。cffiが必要とエラーが出ていたのでインストール。pythonは人それぞれ設定があるため環境によってエラーの修正内容は変わると思います。pythonインストールの正解はいまだに良くわかっていません。以下はmacデフォルトのpython2とは別にpython3を導入しているのでpython3になっています。

python3 -m pip install cffi

kubernetes クラスターの作成(AKS)

料金シミュレーションだとB1sが非常に低コストで使えそうだったのですが・・・選択できませんでした。アカウントが試用版だからでしょうか。無料クレジットがあるのでとりあえず月額4500円くらいのStandardB2sを選択。クラスター名とDNSプレフィックスをmyaksclusterと設定。リージョンは東日本。ここは西日本なかったので、Containerレジストリも東日本にした方が良かったかもしれません。

  • 認証:新規サービスプリンシパル、RBAC使用する
  • ネットワーク:HTTPアプリケーションのルーティングだけ”はい”にして他は初期値
  • タグ:設定なし

デプロイ待ち

上記設定を終えて作成を押すとkubernetesクラスターのデプロイが始まります。おおよそ11分程度で完了しました。

dashboardに入る

クラスター作成後にクラスター用の管理画面ができています。そこに入り、Kubernetesダッシュボードへアクセスというカードをクリックすると色々コマンドがコピーでき、それをローカルで実行します。

ブラウザが立ち上がりローカルの8001ポートにて良く見るKubernetes画面にアクセス可能になりました。RBACを使用している場合はアクセス前に下記コマンドを使用するとpodなどを見ることができます。

Azure Kubernetes Service (AKS) で Kubernetes Web ダッシュボードにアクセスする

kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard

AKSとACR

AKSがACRからimageをpullするには許可が必要です。許可を入れないとpullに失敗してpodのstatusがImagePullBackOffになります。許可の入れ方は下記です。ここまでの手順で作成したAKSとACRの情報が必要です。

https://docs.microsoft.com/en-us/azure/container-registry/container-registry-auth-aks

これも管理画面からできそうですが上記に従ってコマンドで行いました。

実際に使ってみる

kubernetesが使える状態になったので、イメージを作成して登録し、deployment.yamlとservice.yamlを登録します。今回は過去記事にあるgatsbyで作成したwebサイトとGoのファイルを扱ったdockerfileをACRに登録します。

Golangのウェブサーバーで静的サイトを配信する

上記で作成した構成です。main.goのポートは8080から80に変更しています。dockerfileと同じ階層にmain.goを配置してACRにイメージを登録します。下記コマンドの最後の.はdockerfileの位置で、dockerfileがある階層でコマンド打つなら.になります。

チュートリアル:Azure Container Registry タスクを使用して、クラウドでコンテナー イメージをビルドしてデプロイする

ACR_NAME=登録したACR名
az acr build --registry $ACR_NAME --image gfront:v1.0 .

ACR_NAMEはACR作成時につけた名前です。エラーがなければイメージ登録されており、ACRダッシュボードで確認できます。

deployment.yaml

イメージが登録できたらkubernetesに登録するためdeployment.yamlを作成。今更ですが普通にdockerhubから引っ張っても良かったような気がします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gfront-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: gfront
  template:
    metadata:
      labels:
        app: gfront
        env: stage
    spec:
      containers:
      - heroImage: ACR名:image名:v1.0
        name: gfront
        ports:
        - containerPort: 80

imageのところは、例えばACRにつけた名前がsampleなら sample.azurecr.io/gront:v1.0 になります。

kubectl apply -f deployment.yaml

Service.yaml

Service.yamlを登録して外からアクセスできるようにします。

apiVersion: v1
kind: Service
metadata:
  name: webserver
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    app: gfront

下記コマンドで登録。

kubectl apply -f service.yaml

公開

失敗していなければ上記手順でひとまずウェブサイトが公開できています。

kubectl get svc

このコマンドでEXTERNAL-IPで表示される数値をアドレスバーに入れればアクセスできます。数値が出るまで少し時間がかかります。 ちなみに自分が今回作成したものは以下です

Account Manager

まだ名前だけでコンテンツは何もありません。何もなさすぎて寂しいので意味もなくカレンダーだけ表示しました。今月中に(Azureのクレジットなくなる前に)大雑把にでもkubernetes上で機能実装できたらと考え中。

感想

途中設定で引っかかる場所はいくつかあったものの、1日かからないくらいでkubernetesとdockerのレジストリが作成でき、グローバルIPとはいえサイト公開までたどり着ける。サーバーレス恐るべし。

AWSやGCPでkubernetes使ったことがないので他社サービスと比較した感想は出せませんが、今のところストレスなく使えておりちょっと感動しているくらいです。いつものkubernetes画面が出てしまえばAzureというよりKubernetesですしね。

コスト考えるとVPSなど固定料金のサービス系が個人利用だとまだまだ強くはありますが、サーバーレスのこのアプリケーションへすぐ到達できる感じは堪りません。

次はdatabase

ウェブサイト以外にちょっとしたpodは立てたので、次はdatabaseと繋ぐ予定です。databaseはAKS上ではなくAzureのSQL Databaseを使ってみます。kubernetes使いつつdatabaseだけ外に出す話を最近記事で見たのでそれを真似してみたいという理由と、最小スペックなら月額630円とか書いてあるのでAKS関係なしにこの低コストに興味津々です。