Azure Kubernetes Serviceで最速k8s

こんにちは、サイオステクノロジー技術部 武井です。今回は、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ポータルにアクセスして、「リソースの作成」をクリックします。

Screen Shot 2019-11-21 at 21.26.30

 

「container」と入力すると、「Container Registry」が表示されますので、それをクリックします。

Screen Shot 2019-11-21 at 21.28.01

 

「作成」をクリックします。

Screen Shot 2019-11-21 at 21.29.43

 

「レジストリ名」はレジストリを一意に識別する任意の名称を入力します。後ほどこの値は、レジストリのホスト名の一部になりますので、よく考えて変な名前をつけないようにしましょう。「管理者ユーザー」は有効にしておいて下さい。詳細は後ほど説明します。SKUはとりあえず「Standard」にして下さい。後は、環境に合わせて適宜入力して、最後に「作成」をクリックします。

Screen Shot 2019-11-21 at 21.32.15

 

Azure Container Registryのリソースの作成が完了したら、左部メニューの「アクセスキー」をクリックして、「ログインサーバー」「ユーザー名」「パスワード(2つあるうちのいずれか)」をメモして下さい。ちなみにこのユーザーはテスト用に利用する管理用ユーザーです。本番用途では別途サービスプリンシパルを作成して、適切な権限(Azure Container Registryへの読み取り権限のみ)を割り当てて下さい。

Screen Shot 2019-11-21 at 21.37.12

Azure Kubernetes Serviceの構築

では、いよいよAzure Kubernetes Serviceの構築です。

Azureポータルにアクセスして、「リソースの作成」をクリックします。

Screen Shot 2019-11-21 at 21.26.30

 

「Kubernetes」と入力すると「Kubernetes Service」が表示されますので、クリックします。

Screen Shot 2019-11-21 at 21.42.16

 

「作成」をクリックします。

Screen Shot 2019-11-21 at 21.46.10

 

「クラスター名」はKubernetesクラスターを一意に識別する任意の名称を入力して下さい。「ノードサイズ」は、コンテナが稼働するNodeの仮想マシンのサイズです。なるべくサイズの小さいのを選んでおいたほうがお財布に優しいです。検証用ですし。後はご自分の環境に合わせて適宜入力して、最後に「確認および作成」をクリックします。

Screen Shot 2019-11-21 at 21.48.29

 

入力項目を確認して「作成」をクリックします。しばらくかかるので、気長に待ちましょう。

Screen Shot 2019-11-21 at 21.49.25

 

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とか他のリソースは今後試してみることとします。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です