はじめに
自分メモです。
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
> 作成
を選びます。
2.Kubenetes クラスターを作成の基本
項目を設定します。
リソース グループ、Kubernetes クラスター名は、今後のステップでも頻繁に出てきますので、分かり易い名前にしておくと良いでしょう。
ノード サイズは、必要なスペックのものを選んでください。ここでは、エントリー向けのAv2
シリーズを選びました。
-
プロジェクトの詳細
- リソース グループ:
aks-learning
- リソース グループ:
-
クラスターの詳細
- Kubernetes クラスター名:
try-traefik-https
- 地域:
東日本
- 可用性ゾーン:
ゾーン 1, 2, 3
- Kubernetes バージョン:
1.19.9
- Kubernetes クラスター名:
-
プライマリ ノード プール
- ノード サイズ:
Standard A2 v2
- ノード数:
3
- ノード サイズ:
3.Kubenetes クラスターを作成のノードプール
、認証
、ネットワーク
項目はデフォルト値のまま使用しました。
4.Kubenetes クラスターを作成の統合
項目を設定します。
今回のシナリオで、必要なものはありません。
-
Azure Container Registry
- コンテナー レジストリ:
なし
- コンテナー レジストリ:
-
Azure Monitor
- コンテナーの監視:
無効
- コンテナーの監視:
-
Azure Policy
- Azure Policy:
無効
- Azure Policy:
5.Kubenetes クラスターを作成のタグ
項目を必要に応じて設定します。
6.作成
ボタンを押して、リソースがデプロイされるまで待ちます。
2. Kubernetesクラスターに接続する
Azure CLI を使用して操作していきます。
先ほど、作成した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
$ 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/ にアクセスしてみます。
お疲れ様でした!!
Kubernetesクラスターでサービスが動くことを確認できました。
ドメインを使ってサービスにアクセスする
次に、ドメインを使ってサービスにアクセスできるようにしていきます。
本記事では、freenomでドメインを取ってAzure DNSでホスティングします。
1. ドメインの取得
1.freenomにアクセスして、アカウントにサインインしましょう。
※アカウント作成については省略します。
2.Services
> Register a New Domain
を選びます。
3.使いたいドメイン名が利用可能かチェックします。
使えそうなドメインがあれば、今すぐ入手!
を押して、選択
状態にして、チェックアウト
を押します。ここでは、try0ut.ml
を選びました。
4.Period
は、12 Months @ FREE
を選び、Continue
を押します。
お金を払えば、長期的に確保することもできます。
5.I have read and agree to the Terms & Conditions
にチェックを入れ、Complete Order
を押します。
6.この画面が表示されたら、ひとまずokです。
すぐに Azure DNS ゾーンのネームサーバーに書き換えるので、ページはそのまま置いておきましょう。
2. Azure DNS ゾーンを準備する
Azure Portalに戻り、Azure DNS ゾーンのリソースを作ります。
1.リソースグループのリストから、Kubernetesクラスターをデプロイしたリソース グループを開きます。
2.リソースグループの 概要
> 追加
> Marketplace
を選択します。
3.検索窓にdnszone
と入力します。DNS ゾーンが表示されたら、作成
> DNS ゾーン
を選びましょう。
-
プロジェクトの詳細
- リソース グループ:
aks-learning
- リソース グループ:
-
インスタンスの詳細
- 名前:
try0ut.ml
(取得したドメイン名を指定)
- 名前:
5.確認および作成
に進み、リソースがデプロイされるまで待ちます。
6.DNS ゾーンの概要
を選択し、ネーム サーバーを確認します。
この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
を選択します。
2.Management Tools
> Nameservers
を選びます。
3.Use custom nameservers (enter below)
にチェックを入れ、DNS ゾーンに表示されていたネーム サーバーを入力します。
4.Change Nameservers
を押して、freenom での作業は完了です。
後は、1年おきにドメインの更新をどうするか気にする程度です。
4. 静的 IP アドレスを確保する
Azure Portalに戻り、パブリック IP アドレスのリソースを作ります。
サービス タイプ を LoadBalancer
にして loadBalancerIP
を設定しなければクラウド プロバイダー側で IP アドレスを割り当ててくれますが、何かの拍子に変わっても面倒なので、自分で パブリック IP アドレス をデプロイするようにしました。
1.リソースグループのリストから、AKSクラスターが格納されている(MC_
から始まる)リソース グループを開きます。
2.概要
> 追加
> Marketplace
を選んでリソースの作成に移動し、パブリック IP アドレス を追加します。
- IP バージョン:
IPv4
- SKU:
Standard
- レベル:
地域
-
IPv4 IP アドレスの構成:
- 名前:
try0ut.ml
(DNS Zone と同じ名前だと分かり易い) - ルーティングの優先順位:
Microsoft ネットワーク
- 名前:
- サブスクリプション:
***
(使用中のサブスクリプション) - リソース グループ:
MC_***
(クラスターのリソースグループ) - 場所:
東日本
- 可用性:
ゾーン冗長
ここでは、パブリック IP アドレス リソースとして、20.48.10.146
が割り当てられました。
4.作成したリソースの 構成
> エイリアス レコードの作成
を選択します。
5.エイリアス レコードの作成で、Aレコードを 2つ 作ります。
- DNS ゾーン:
try0ut.ml
(作成済みの DNS ゾーンを指定) - 名前:
@
.try0ut.ml,*
.try0ut.ml
6.dig
コマンドを使って、名前解決できているか確認します。
$ dig try0ut.ml +short
⥤ 20.48.10.146
5. Traefik v2 を導入する
nginx
か traefik
か迷いましたが、色々できそうだったので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
の設定を書き換えます。
# 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/ にアクセスします。
理由はよく分かりませんが、最後の/
がついていないとつながりません。
6. IngressRoute で whoami を公開する
http://whoami.try0ut.ml/ で、whoami
サービスにアクセスできるようにしていきます。
1.適当なフォルダに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/ にアクセスしてみます。
4.https://whoami.try0ut.ml/ でアクセスしたときの証明書を確認してみます。
おわりに
whoami サービスを公開することができました!!
マニフェストを自分で書けることも大事ですが、誰かに触ってもらうときには抵抗感の排除が必須かなと思います。helm は、そういった抵抗感をグッと抑えてくれる気がしました。