1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

はじめての AKS によるサービス公開

Posted at

はじめに

自分メモです。
AKS を使って、ちゃちゃっと whoami サービスを立てる流れを記載しています。

実行環境

本記事では、以下の環境を使用しました。
異なるバージョンでは、同じ結果が得られない場合がありますが、ご了承ください。

Component Version
OS macOS Big Sur 11.3.1
TOOL Kubernetes (AKS) 1.19.9
TOOL kubectl 1.19.7
TOOL Azure CLI 2.21.0
TOOL kubectx, kubens 0.9.3
TOOL Helm 3.5.3
CHART traefik 9.19.0
CHART whoami 2.2.0
DOMAIN freenom

:
記事中の kc コマンドは、kubectl コマンドのエイリアスです。

Newbernetes: kubectl the Kubernetes CLI - Cory O'Daniel
を参考にしました。

Kubernetesクラスターのセットアップ

まずは、Azure Kubernetes Service (AKS) を使って、Kubernetesクラスターを準備します。

1. Kubernetesクラスターを準備する

Azure Portal にログインし、Kubernetesクラスターを作っていきます。

1.リソースの作成から コンテナー > Kubernetes Service > 作成 を選びます。
image.png

2.Kubenetes クラスターを作成基本項目を設定します。
image.png

リソース グループKubernetes クラスター名は、今後のステップでも頻繁に出てきますので、分かり易い名前にしておくと良いでしょう。

ノード サイズは、必要なスペックのものを選んでください。ここでは、エントリー向けのAv2シリーズを選びました。

  • プロジェクトの詳細
    • リソース グループ: aks-learning
  • クラスターの詳細
    • Kubernetes クラスター名: try-traefik-https
    • 地域: 東日本
    • 可用性ゾーン: ゾーン 1, 2, 3
    • Kubernetes バージョン: 1.19.9
  • プライマリ ノード プール
    • ノード サイズ: Standard A2 v2
    • ノード数: 3

3.Kubenetes クラスターを作成ノードプール認証ネットワーク項目はデフォルト値のまま使用しました。

4.Kubenetes クラスターを作成統合項目を設定します。
image.png

今回のシナリオで、必要なものはありません。

  • Azure Container Registry
    • コンテナー レジストリ: なし
  • Azure Monitor
    • コンテナーの監視: 無効
  • Azure Policy
    • Azure Policy: 無効

5.Kubenetes クラスターを作成タグ項目を必要に応じて設定します。

6.作成ボタンを押して、リソースがデプロイされるまで待ちます。
image.png

2. Kubernetesクラスターに接続する

Azure CLI を使用して操作していきます。
image.png

先ほど、作成したKubernetesサービスリソースを開き、接続メニューを押すと表示される**{クラスター名} に接続**の手順に従って進めます。

1.Cloud Shell を開く または Azure CLI

# Azure へサインイン (Webブラウザーが立ち上がります)
$ az login
⥤ ...

2.次のコマンドを実行します

# 既定のディレクトリを設定する
$ az account set --subscription SUBSCRIPTION_ID

# 資格情報の取得
$ az aks get-credentials --resource-group RESOURCE_GROUP_NAME --name K8S_CLUSTER_NAME
ex
$ az account set --subscription xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
$ az aks get-credentials --resource-group aks-learning --name try-traefik-https
⥤ Merged "try-traefik-https" as current context in /Users/eternity1984/.kube/config

3. whoami をデプロイ

whoami は、OS情報とHTTPリクエストを出力できるウェブサーバーです。クラスターの動作確認に便利です。

ここでは、クラスターの動作確認が目的なので、kubectx, kubensや、helm を使って、サクッと構築してしまいましょう。

1.クラスターの準備が整っているか事前に確認します。

複数のクラスターを扱うときに、雑にしていると大惨事になるかもしれないので、癖をつけておきましょう。

# 使用中のコンテキスト
$ kubectx
⥤   docker-desktop
⥤ * try-traefik-https

# 間違ったコンテキストが選ばれている場合は、切り替えます
$ kubectx try-traefik-https
⥤ Switched to context "try-traefik-https".

# 名前空間のリスト
$ kubens
⥤ * default
⥤   kube-node-lease
⥤   kube-public
⥤   kube-system

2.whoami用の名前空間を作ります。

# 名前空間の作成
$ kc create ns whoami
⥤ namespace/whoami created

# 名前空間の切り替え
$ kubens whoami
⥤ Context "try-traefik-https" modified.
⥤ Active namespace is "whoami".

3.helm を使って、whoami をインストールします。

# リポジトリの追加
$ helm repo add cowboysysop https://cowboysysop.github.io/charts/
⥤ "cowboysysop" has been added to your repositories

# cowboysysop/whoami のインストール
# バージョン指定する場合は、--version 2.2.0 をつけてください
$ helm install whoami cowboysysop/whoami
⥤ NAME: whoami
⥤ LAST DEPLOYED: Sat May  8 13:17:17 2021
⥤ NAMESPACE: whoami
⥤ STATUS: deployed
⥤ REVISION: 1
⥤ ...

4.正常に動作しているか確認します。

# ポッドの状態
$ kc get po
⥤ NAME                     READY   STATUS    RESTARTS   AGE
⥤ whoami-6d648779d-kn6k6   1/1     Running   0          21s

# サービスの状態
$ kc get svc
⥤ NAME     TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
⥤ whoami   ClusterIP   10.0.85.25   <none>        80/TCP    35s

5.whoamiサービスはEXTERNAL-IPをもっていないため、ポートフォワードを使ってサービスのポート:80にアクセスできるようにします。

$ kc port-forward svc/whoami 8080:80
⥤ Forwarding from 127.0.0.1:8080 -> 80
⥤ Forwarding from [::1]:8080 -> 80

6.Webブラウザから http://localhost:8080/ にアクセスしてみます。

image.png

お疲れ様でした!!
Kubernetesクラスターでサービスが動くことを確認できました。

ドメインを使ってサービスにアクセスする

次に、ドメインを使ってサービスにアクセスできるようにしていきます。
本記事では、freenomでドメインを取ってAzure DNSでホスティングします。

1. ドメインの取得

1.freenomにアクセスして、アカウントにサインインしましょう。
※アカウント作成については省略します。

2.Services > Register a New Domain を選びます。
image.png

3.使いたいドメイン名が利用可能かチェックします。
使えそうなドメインがあれば、今すぐ入手!を押して、選択状態にして、チェックアウトを押します。ここでは、try0ut.mlを選びました。

image.png

4.Periodは、12 Months @ FREEを選び、Continueを押します。
お金を払えば、長期的に確保することもできます。
image.png

5.I have read and agree to the Terms & Conditionsにチェックを入れ、Complete Orderを押します。

image.png

6.この画面が表示されたら、ひとまずokです。
image.png
すぐに Azure DNS ゾーンのネームサーバーに書き換えるので、ページはそのまま置いておきましょう。

2. Azure DNS ゾーンを準備する

Azure Portalに戻り、Azure DNS ゾーンのリソースを作ります。

1.リソースグループのリストから、Kubernetesクラスターをデプロイしたリソース グループを開きます。
image.png

2.リソースグループ概要 > 追加 > Marketplace を選択します。
image.png

3.検索窓dnszoneと入力します。DNS ゾーンが表示されたら、作成 > DNS ゾーン を選びましょう。
image.png

4.DNS ゾーンの作成基本項目を設定します。
image.png

  • プロジェクトの詳細
    • リソース グループ: aks-learning
  • インスタンスの詳細
    • 名前: try0ut.ml (取得したドメイン名を指定)

5.確認および作成に進み、リソースがデプロイされるまで待ちます。

6.DNS ゾーン概要を選択し、ネーム サーバーを確認します。
image.png

このDNS ゾーンでは、以下のようになっていました。

ネームサーバー
1 ns1-04.azure-dns.com.
2 ns2-04.azure-dns.net.
3 ns3-04.azure-dns.org.
4 ns4-04.azure-dns.info.

3. ネーム サーバーを指定する

開いたままにしている freenom のページに戻り、カスタム ネーム サーバーの設定をしていきます。

1.TOP から Services > My Domains に進み、取得したドメインの Manage Domain を選択します。
image.png

2.Management Tools > Nameservers を選びます。
image.png

3.Use custom nameservers (enter below) にチェックを入れ、DNS ゾーンに表示されていたネーム サーバーを入力します。
image.png

4.Change Nameserversを押して、freenom での作業は完了です。
image.png

後は、1年おきにドメインの更新をどうするか気にする程度です。

4. 静的 IP アドレスを確保する

Azure Portalに戻り、パブリック IP アドレスのリソースを作ります。

サービス タイプLoadBalancer にして loadBalancerIP を設定しなければクラウド プロバイダー側で IP アドレスを割り当ててくれますが、何かの拍子に変わっても面倒なので、自分で パブリック IP アドレス をデプロイするようにしました。

1.リソースグループのリストから、AKSクラスターが格納されている(MC_ から始まる)リソース グループを開きます。

2.概要 > 追加 > Marketplace を選んでリソースの作成に移動し、パブリック IP アドレス を追加します。
image.png

3.パブリック IP アドレスの作成の項目を設定します。
image.png

  • IP バージョン: IPv4
  • SKU: Standard
  • レベル: 地域
  • IPv4 IP アドレスの構成:
    • 名前: try0ut.ml (DNS Zone と同じ名前だと分かり易い)
    • ルーティングの優先順位: Microsoft ネットワーク
  • サブスクリプション: *** (使用中のサブスクリプション)
  • リソース グループ: MC_*** (クラスターのリソースグループ)
  • 場所: 東日本
  • 可用性: ゾーン冗長

ここでは、パブリック IP アドレス リソースとして、20.48.10.146 が割り当てられました。

4.作成したリソースの 構成 > エイリアス レコードの作成 を選択します。
image.png

5.エイリアス レコードの作成で、Aレコードを 2つ 作ります。
image.png

  • DNS ゾーン: try0ut.ml (作成済みの DNS ゾーンを指定)
  • 名前: @.try0ut.ml, *.try0ut.ml

6.digコマンドを使って、名前解決できているか確認します。

$ dig try0ut.ml +short
⥤ 20.48.10.146

5. Traefik v2 を導入する

nginxtraefik か迷いましたが、色々できそうだったのでtraefikを選びました。

1.traefik用の名前空間を作ります。

# 名前空間の作成
$ kc create ns traefik
⥤ namespace/traefik created

# 名前空間の切り替え
$ kubens traefik
⥤ Context "try-traefik-https" modified.
⥤ Active namespace is "traefik".

3.helm を使って、traefik をインストールの準備をします。

# リポジトリの追加
$ helm repo add traefik https://helm.traefik.io/traefik
⥤ "traefik" has been added to your repositories

# 必要に応じて、ワークスペースへ移動
$ cd /path/to/workspace

# values.yaml へ書き出し
$ helm inspect values traefik/traefik > values.yaml

4.values.yamlの設定を書き換えます。

values.yaml
# Options for the main traefik service, where the entrypoints traffic comes
# from.
service:
  enabled: true
  type: LoadBalancer
  # Additional annotations (e.g. for cloud provider specific config)
  annotations: {}
  # Additional service labels (e.g. for filtering Service by custom labels)
  labels: {}
  # Additional entries here will be added to the service spec. Cannot contains
  # type, selector or ports entries.
-   spec: {}
+   spec:
+     loadBalancerIP: "20.48.10.146"
    # externalTrafficPolicy: Cluster
    # loadBalancerIP: "1.2.3.4"
    # clusterIP: "2.3.4.5"
  loadBalancerSourceRanges: []
    # - 192.168.0.1/32
    # - 172.16.0.0/16
  externalIPs: []
    # - 1.2.3.4

5.values.yaml を使って、traefik をインストールします。

# traefik/traefik のインストール
$ helm install traefik traefik/traefik -f values.yaml
⥤ W0509 08:03:03.104875    1336 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
⥤ ...
⥤ NAME: traefik
⥤ LAST DEPLOYED: Sun May  9 08:03:07 2021
⥤ NAMESPACE: traefik
⥤ STATUS: deployed
⥤ REVISION: 1
⥤ TEST SUITE: None

Warning:
apiextensions.k8s.io/v1beta1 is DEPRECIATED... は、 チャートのバージョンが上がれば、改善されるかもしれません。
traefik/traefik-helm-chart #313

6.指定したパブリック IP アドレス20.48.10.146が使用されているか確認します。

# サービスの状態
$ kc get svc
⥤ NAME      TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)                      AGE
⥤ traefik   LoadBalancer   10.0.50.250   20.48.10.146   80:32292/TCP,443:30555/TCP   95s

7.ダッシュボードを開いてみましょう。
traefikのダッシュボードを使うには、deploymentまたはpodに対してポートフォワードします。

$ kc port-forward deploy/traefik 9000
⥤ Forwarding from 127.0.0.1:9000 -> 9000
⥤ Forwarding from [::1]:9000 -> 9000

8.Webブラウザで、http://localhost:9000/dashboard/ にアクセスします。
image.png

理由はよく分かりませんが、最後の/がついていないとつながりません。

6. IngressRoute で whoami を公開する

http://whoami.try0ut.ml/ で、whoamiサービスにアクセスできるようにしていきます。

1.適当なフォルダにwhoami-ingress.yamlを作成します。

whoami-ingress.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: whoami
spec:
  entryPoints:
    - web
    - websecure
  routes:
    - match: Host(`whoami.try0ut.ml`)
      kind: Rule
      services:
        - name: whoami
          namespace: whoami
          port: 80

Information:
IngressRoute は、Service などと違い、ポートにポート名を指定することはできません。素直にポート番号を指定します。

2.whoami 名前空間にリソースを作ります。

# 名前空間の切り替え
$ kubens whoami
⥤ Context "try-traefik-https" modified.
⥤ Active namespace is "whoami".

$ kc apply -f whoami-ingress.yaml
⥤ ingressroute.traefik.containo.us/whoami created

3.Webブラウザから、http://whoami.try0ut.ml/ にアクセスしてみます。
image.png

4.https://whoami.try0ut.ml/ でアクセスしたときの証明書を確認してみます。
image.png

おわりに

whoami サービスを公開することができました!!

マニフェストを自分で書けることも大事ですが、誰かに触ってもらうときには抵抗感の排除が必須かなと思います。helm は、そういった抵抗感をグッと抑えてくれる気がしました。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?