寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。

AKSのクイックスタートなぞってみた(Azure)

AKSのクイックスタートなぞってみた

まず、はじめるには

クイックスタートでは Azure Cloud Shell を利用する雰囲気で書いてある。
GCPばっかり使っていたので Cloud Shell は無料かと思いきや、Azureの場合にはストレージ領域分課金されるとのこと。
がっかりしたのでmacにインストールしたコマンドで実行することにした。

Azure Clientのバージョン確認

Cloud Shellを使わなくても、Azure Clientから実行ができる。
ただし、AKSのサンプルを試すにはバージョン 2.0.27 以降である必要があるので、以下のコマンドでバージョンを確認する。

az --version
azure-cli (2.0.35)
~~ snip ~~

という感じで表示されたのでバージョン的には問題なしなのでそのまま進めよう。

Azure Clientでのログイン

Azure Clientのログインを事前に行う必要がある。
コマンドは

az login

ターミナル上にURLが表示されるのでそのURLをブラウザに貼り付けて実行し、ターミナル上に表示されたキーをブラウザに貼り付ける。
ブラウザ側の処理が完了するとターミナル側の処理が進む(json形式のレスポンスが返ってくる)のでそれを待ちましょう。

AKSプレビューの有効化

必要なサービスプロバイダーが有効になっているかのチェックを実施。

az provider register -n Microsoft.Network
az provider register -n Microsoft.Storage
az provider register -n Microsoft.Compute
az provider register -n Microsoft.ContainerService

リソースグループを作成する

リソースグループとはリソースを任意のかたまりにまとめ、ライフサイクルや権限を一括して管理するための仕組み。というもののようです。
検証用の環境としてリソースグループ単位でゴソッと用意し、要らなくなったら一気に消す、などのようなことができるっぽい。 フロントのwebサーバグループ、裏側のDBグループ、のようなものではなく、webサーバ、DBサーバ、バッチサーバという感じでアプリケーション一式の塊をグループ化するのがお作法のようだ。

とりあえず作成してみる。
2018/06/12 現在、AKSは東京リージョンに来ていないので、 centralus を使ってみることにする。

az group create --name ${RESOURCE_GROUP_NAME} --location centralus

"provisioningState": "Succeeded" のような値を含むjsonレスポンスが返ってくれば成功だろう。

AKSクラスターを作成する

タイトルの通り。コマンドを実行してAKSクラスタを作成します。
クイックスタートの例ではnode1台ですが、欲張って2台にしてみます。1台で良いという方は1にしましょう。

az aks create --resource-group ${RESOURCE_GROUP_NAME} --name ${CLUSTER_NAME} --node-count 2 --generate-ssh-keys

クラスタの作成はそこそこ時間がかかります。(20分程度??)
完了後にjsonのレスポンスが返ってくるのでそれまでのんびり待ちましょう。

クラスターへの接続

k8sクラスタへの接続には kubectl を利用します。
私はすでにインストール済みだったのでスキップしていますが、各自適当な方法でインストールしてください。

ex. Azure CLIでインストールするには

az aks install-cli

クレデンシャルの取得

kubectl用のクレデンシャルの設定を行います。

az aks get-credentials --resource-group ${RESOURCE_GROUP_NAME} --name ${CLUSTER_NAME}

ノードの一覧を取得してみる

kubectl get nodes

こんな感じの応答が返ってくる

kubectl get nodes
NAME                       STATUS    ROLES     AGE       VERSION
aks-nodepool1-38601818-0   Ready     agent     41m       v1.9.6
aks-nodepool1-38601818-1   Ready     agent     41m       v1.9.6

アプリケーションの実行

以下のようなマニフェストファイルを作成し、デプロイを行います。
pythonアプリケーションとredisインスタンスが定義されています。

azure-vote.yaml ファイル

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: azure-vote-back
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: azure-vote-back
    spec:
      containers:
      - name: azure-vote-back
        image: redis
        ports:
        - containerPort: 6379
          name: redis
---
apiVersion: v1
kind: Service
metadata:
  name: azure-vote-back
spec:
  ports:
  - port: 6379
  selector:
    app: azure-vote-back
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: azure-vote-front
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: azure-vote-front
    spec:
      containers:
      - name: azure-vote-front
        image: microsoft/azure-vote-front:v1
        ports:
        - containerPort: 80
        env:
        - name: REDIS
          value: "azure-vote-back"
---
apiVersion: v1
kind: Service
metadata:
  name: azure-vote-front
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: azure-vote-front

アプリケーションの実行

kubectl create -f azure-vote.yaml

以下のような出力がなされれば完了

deployment "azure-vote-back" created
service "azure-vote-back" created
deployment "azure-vote-front" created
service "azure-vote-front" created

アプリケーションをテストする

アプリケーションが実行されたあとに、アプリケーションフロントエンドを公開するための kubernetesサービス が作成されますが、数分かかります。
状況を監視するには以下のコマンドを利用します。

kubectl get service azure-vote-front --watch

EXTERNAL-IP が <pending> の状態ではまだ完了していません。
EXTERNAL-IPが確定したら、 ctrl+c を実行してwatchを停止します。

外部アドレスで接続し、アプリの動作を確認する

ブラウザに先程のEXTERNAL-IPを入力し、アクセスします。

→ Cats & Dogs の投票ができました。

(注:実行するとリソースグループごと消えます)クラスターを削除する

クイックスタートで実行したクラスタをリソースグループごと削除します。 (このコマンドを実行すると作成したクラスタが、最初に作成したリソースグループごと消えます)

az group delete --name ${RESOURCE_GROUP_NAME} --yes --no-wait

結構簡単に利用することができた。
一番しんどかったのはAKSクラスタを作成する az aks create コマンドを実行したときでした。(1時間近く待ちました・・・)

とはいえ、コンテナも作成してあり、yamlの記述に不安がなければ比較的かんたんに利用できそうです。

enjoy!