こんにちは、サイオステクノロジー技術部 武井です。今回は、Azureで提供されているKubernetesのマネージド・サービス「Azure Kubernetes Service」(以降AKS)で、Kubernetesを動かしてみたいと思います。
Azure Kubernetes Serviceとは?
Kubernetesを構築するにはたくさんのサーバーを構築しなければなりません。クラスタ全体を管理するMaster、コンテナが稼働するNodeなどです。その管理はとても大変なのは容易に想像ができると思いますが、MasterやNodeを構築することなく、さらにその運用管理までやってくれるのが、Azure Kubernetes Serviceです。我々がやることは、kubectlコマンドでyamlなどの設定ファイルを投げるだけです。楽ちん。
早速実践!!
では、早速やってみましょう。
Azure Container Registryの構築
まずはKubernetesがコンテナを作成するためのイメージを持ってくるレジストリを作成します。通常はDockerHubなどの公開レポジトリを使うのではなく、クローズドなレポジトリを使います。Azure Container Registryはそんなクローズドなレポジトリを提供してくれます。
Azureポータルにアクセスして、「リソースの作成」をクリックします。
「container」と入力すると、「Container Registry」が表示されますので、それをクリックします。
「作成」をクリックします。
「レジストリ名」はレジストリを一意に識別する任意の名称を入力します。後ほどこの値は、レジストリのホスト名の一部になりますので、よく考えて変な名前をつけないようにしましょう。「管理者ユーザー」は有効にしておいて下さい。詳細は後ほど説明します。SKUはとりあえず「Standard」にして下さい。後は、環境に合わせて適宜入力して、最後に「作成」をクリックします。
Azure Container Registryのリソースの作成が完了したら、左部メニューの「アクセスキー」をクリックして、「ログインサーバー」「ユーザー名」「パスワード(2つあるうちのいずれか)」をメモして下さい。ちなみにこのユーザーはテスト用に利用する管理用ユーザーです。本番用途では別途サービスプリンシパルを作成して、適切な権限(Azure Container Registryへの読み取り権限のみ)を割り当てて下さい。
Azure Kubernetes Serviceの構築
では、いよいよAzure Kubernetes Serviceの構築です。
Azureポータルにアクセスして、「リソースの作成」をクリックします。
「Kubernetes」と入力すると「Kubernetes Service」が表示されますので、クリックします。
「作成」をクリックします。
「クラスター名」はKubernetesクラスターを一意に識別する任意の名称を入力して下さい。「ノードサイズ」は、コンテナが稼働するNodeの仮想マシンのサイズです。なるべくサイズの小さいのを選んでおいたほうがお財布に優しいです。検証用ですし。後はご自分の環境に合わせて適宜入力して、最後に「確認および作成」をクリックします。
入力項目を確認して「作成」をクリックします。しばらくかかるので、気長に待ちましょう。
kubectlコマンドをインストールします。その前にまず、Azure CLIをインストールしましょう。Macを想定しております。他の環境はここを参考にインストールしてくらはい。
$ brew update && brew install azure-cli
次にkubectlをインストールします。
$ az aks install-cli
kubectlコマンドを動かすための認証情報を作成します。noriaksはAzure Kubernetes Serviceを作成したリソースグループ、norichan-aksはKubernetesクラスター名です。
$ az aks get-credentials --resource-group noriaks --name norichan-aks
これで準備は整いました。では、まずKubernetesにデプロイするコンテナを作成します。
アプリケーションとしては、定番のハロワをPHPで表示するWebアプリにします。以下のPHPを作成します。
<?php echo "はろわ"; ?>
同じディレクトリに以下のDockerfileを作成します。PHPのイメージをpullしてきて、DocumentRootに先程のPHPファイルを入れています。
FROM php:7.3.11-apache ADD test.php /var/www/html
ビルドします。
$ docker build -t web .
タグ付けをします。noriacr.azurecr.ioはAzure Container Registryを作成したときにメモしたログインサーバーを指定します。その後は、イメージ名:バージョンの形式で記述します。必ずこの形式で記述して下さい。
$ docker tag web noriacr.azurecr.io/web:1.0
ではAzure Container RegistryにDockerイメージをpushしましょう。その前にAzure Container Registryにログインしましょう。
$ docker login -u noriacr -p XXXXXX noriacr.azurecr.io
Azure Container RegistryにDockerイメージをpushしましょう。
$ docker push noriacr.azurecr.io/web:1.0
Azure Kubernetes ServiceがAzure Container Registryにアクセスできるようになるために、Azure Container Registryへの認証情報を作成します。docker-reg-credentialは認証情報を一意に識別する任意の名称、noriacr.azurecr.ioはAzure Container Registryを作成したときにメモしたログインサーバー、noriacrは同じくAzure Container Registryを作成したときにメモしたユーザー名、XXXXXXは同じくAzure Container Registryを作成したときにメモしたパスワード、ntakei@exmaple.comは任意のメールアドレスです。
$ kubectl create secret docker-registry \ > acr-credential \ > --docker-server=noriacr.azurecr.io \ > --docker-username=noriacr \ > --docker-password=XXXXXX \ > --docker-email=ntakei@example.com
成功すると以下のように表示されます。
secret/acr-credential created
ではいよいよKubernetesにデプロイです。以下の設定ファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-example spec: replicas: 3 selector: matchLabels: app: deployment-example template: metadata: labels: app: deployment-example spec: containers: - name: webapp image: noriacr.azurecr.io/web:1.0 ports: - containerPort: 80 imagePullSecrets: - name: acr-credential
お馴染の以下のコマンドでデプロイします。
$ kubectl apply -f deployment.yml
ちゃんとpodが動いているかどうか確認してみます。
$ kubectl get pods NAME READY STATUS RESTARTS AGE deployment-example-74575f9cbc-2n8ll 1/1 Running 0 97s deployment-example-74575f9cbc-6bh67 1/1 Running 0 97s deployment-example-74575f9cbc-fh5v2 1/1 Running 0 97s
キターーー。きちんと動いてます。念の為port forwardingで確認してみます。
$ kubectl port-forward deployment-example-74575f9cbc-2n8ll 8080:80 $ curl https://localhost:8080/test.php はろわ
キターーー。きちんと動いてます。
外部からアクセスできるようにしてみよう
さっきまでの設定では外部からアクセスできません。外部からアクセスできるようにパブリックIPアドレスを持ったAzure Load Balancerを作成し、Podにリクエスを振り分けましょう。イメージは以下のような感じです。
まずazコマンドでパブリックIPアドレスのリソースを作成します。
$ az network public-ip create \ --resource-group [MCから始まるAKSクラスターが格納されているリソースグループの名前] \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static
次に以下のマニフェストでAzure Load Balancerを作成します。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: [MCから始まるAKSクラスターが格納されているリソースグループの名前] name: azure-load-balancer spec: loadBalancerIP: [先程のコマンドで作成されたパブリックIPアドレス] type: LoadBalancer ports: - port: 80 selector: app: deployment-example # 先程Podに付与したラベルと同じものを指定します。
お馴染の以下のコマンドでデプロイします。
$ kubectl apply -f alb.yml
ちゃんとAzure Load Balancerが出来ているかどうか確認してみます。「EXTERNAL-IP」のところに、先程作成したパブリックIPアドレスが表示されていれば成功です。
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE azure-load-balancer LoadBalancer 10.0.28.96 XX.XX.XX.XX 80:30638/TCP 5h18m kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 4d2h
確認してみましょう。
$ curl https://[先程作成したパブリックIPアドレス]/test.php はろわ
キターーー。できてます。
まとめ
とっても簡単にKubernetesを動かすことが出来ました。ServiceとかIngressとか他のリソースは今後試してみることとします。