自宅のk3sクラスタをAzure Arcに接続してみた【初期設定編】
はじめに
こんにちは、Azure楽しんでいますか?
今回は、自宅のPCで動かしている軽量Kubernetesのk3sクラスタを、「Azure Arc enabled Kubernetes」を使ってAzureに接続してみました。その際の手順やポイントをまとめておこうと思います。
「オンプレミスのKubernetesをAzureから管理したい」あるいは「Azureの各種サービスと連携させたい」と考えている方の参考になれば幸いです。
今回のゴール
最終的に、Azure Portalから自宅のk3sクラスタが認識され、リソースとして管理できる状態を目指します。
背景
自宅の検証環境としてk3sを動かしているのですが、「これをAzureに繋いだらどうなるんだろう?」とふと思ったのがきっかけです。
Azure Arcを使えば、オンプレミスや他社クラウド上にあるKubernetesクラスタなどを、Azureネイティブのリソースと同じように管理できるようになります。例えば、Azure Policyで統一的な構成管理を行ったり、Azure Monitorで監視したり、といった活用が考えられます。
このあたりを試してみるための第一歩として、まずは接続に挑戦しました。
local pcにk3sをインストール
まず、接続対象となるk3sクラスタをローカルPCに準備します。
k3sはインストールが非常に簡単なのが良いところですね。
公式サイトにあるコマンドから、今回は一般ユーザでもk3sの操作が行えるように「--write-kubeconfig-mode」を追加した以下のコマンドを実行します。
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
これで、シングルノードのk3sクラスタが構築されます。
あっという間ですね。
k3sの動作確認
インストール後、クラスタが正常に動作しているか確認します。
まずは、基本的なコマンドでノードとシステムPodの状態を見てみましょう。
# ノードの状態を確認
k3s kubectl get nodes
# システムPodの稼働状況を確認
k3s kubectl get pods -A
実行例です。
$ k3s kubectl get nodes
NAME STATUS ROLES AGE VERSION
gumi Ready control-plane,master 2m3s v1.32.6+k3s1
$ k3s kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5688667fd4-rndw2 1/1 Running 0 2m28s
kube-system helm-install-traefik-crd-k6sb8 0/1 Completed 0 2m28s
kube-system helm-install-traefik-dxph4 0/1 Completed 2 2m28s
kube-system local-path-provisioner-774c6665dc-vbmlt 1/1 Running 0 2m28s
kube-system metrics-server-6f4c6675d5-cjdl7 1/1 Running 0 2m28s
kube-system svclb-traefik-e5db28d1-snwhn 2/2 Running 0 2m3s
kube-system traefik-c98fdf6fb-gdr78 1/1 Running 0 2m3s
ノードのSTATUS
がReady
になっていれば、正常に起動しています。
さらに、実際にアプリケーションをデプロイして、クラスタが機能していることを確認します。
ここでは、定番のnginxをマニフェストファイルを使ってデプロイしてみましょう。
まず、以下のようなマニフェストファイル (nginx-deployment.yaml
) を作成します。
DeploymentでnginxのPodを1つ作成し、Service (NodePort) で外部からアクセスできるようにします。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
マニフェストファイルが準備できたら、kubectl apply
コマンドでリソースを作成します。
k3s kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
と service/nginx-service created
と表示されれば成功です。
最後に、curl
コマンドでnginxのデフォルトページにアクセスできるか確認します。
NodePort
で公開されているポート番号(30000番台のいずれか)に対してリクエストを送ります。
# NodePortのポート番号を取得
NODE_PORT=$(k3s kubectl get service nginx-service -o=jsonpath='{.spec.ports[0].nodePort}')
# curlでアクセス確認
curl http://localhost:$NODE_PORT
Welcome to nginx!
というHTMLが返ってくれば、k3sクラスタは正常に動作しています。
これで、Azure Arcに接続する準備が整いました。
Local PCのAzure CLI設定
次に、Azureを操作するためにAzure CLIの準備をします。
未インストールの場合は、公式ドキュメントを参考にインストールを済ませておいてください。
インストール後、以下のコマンドでAzureにログインします。
az login
ブラウザが起動し認証画面が表示されるので、画面の指示に従いログインを完了させます。
Azure サブスクリプションの準備
「Azure Arc enabled Kubernetes」を利用するには、対象のサブスクリプションでいくつかのリソースプロバイダを有効化しておく必要があります。
以下のコマンドを実行し、必要なリソースプロバイダを登録します。
az provider register --namespace Microsoft.Kubernetes
az provider register --namespace Microsoft.KubernetesConfiguration
az provider register --namespace Microsoft.ExtendedLocation
登録が完了するまで数分かかる場合があります。az provider show -n [namespace]
でregistrationState
がRegistered
になっていることを確認しましょう。
Azure Arcへの接続設定
いよいよAzure Arcに接続します。
最初に、Azure Arcでクラスタを管理するためのリソースグループを作成します。
az group create --name rg-azure-arc --location japaneast
次に、k3sクラスタをAzure Arcに接続します。この操作には、Azure CLIの「connectedk8s」拡張機能が必要になるため、まずはこちらをインストールします。
# connectedk8s拡張機能をインストール
az extension add --name connectedk8s
拡張機能の準備ができたら、いよいよ接続コマンドを実行します。
「--kube-config」にはk3sのkube configが格納されている「/etc/rancher/k3s/k3s.yaml」を指定します。
# k3sクラスタをAzure Arcに接続
az connectedk8s connect --name ktkr-k3s-cluster --resource-group rg-azure-arc --kube-config /etc/rancher/k3s/k3s.yaml
このコマンドを実行すると、k3sクラスタ内にAzure Arc用のエージェントがデプロイされ、Azureとの接続が確立されます。
とりまポータルからの確認
最後に、Azure Portal上で接続が正常に完了したかを確認します。
Azure Portalで「Azure Arc」を検索し、Azure Arcの管理画面を開きます。左側のメニューから「Kubernetes」を選択します。
一覧に、先ほど接続したktkr-k3s-cluster
が表示されていれば成功です。
k3sクラスタ内にも新たなnamespace上に各種Podが追加されていますね。
k3s kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
azure-arc cluster-metadata-operator-6f8b6694d4-jwwsh 2/2 Running 0 9m4s
azure-arc clusterconnect-agent-8f7884667-7qxhs 3/3 Running 0 9m4s
azure-arc clusteridentityoperator-74775fb76d-fmd25 2/2 Running 0 9m4s
azure-arc config-agent-5cf555cc76-zr49g 2/2 Running 0 9m4s
azure-arc controller-manager-65b46c6cbc-qqxb2 2/2 Running 0 9m4s
azure-arc extension-events-collector-96995d676-ggp7d 2/2 Running 0 9m4s
azure-arc extension-manager-cb87fbc56-f9225 3/3 Running 0 9m4s
azure-arc flux-logs-agent-786756d4f5-ffbdd 1/1 Running 0 9m4s
azure-arc kube-aad-proxy-6d48786f8c-dr77z 2/2 Running 0 9m4s
azure-arc logcollector-84f9994f8b-8mcm2 1/1 Running 0 9m3s
azure-arc metrics-agent-5b96f888d4-65wpf 2/2 Running 0 9m4s
azure-arc resource-sync-agent-86ddbf48cf-dgqhw 2/2 Running 0 9m4s
default nginx-deployment-96b9d695-4spxt 1/1 Running 0 16m
kube-system coredns-5688667fd4-6q777 1/1 Running 0 17m
(snip)
ポータルの概要ページはこんな感じ。
ただし、kubernetesリソース回りの確認をポータルから行うには、サービスアカウントベアラートークンの設定を行う必要があります。
サービスアカウントの作成と設定
k3s上でサービスアカウントを作成して、Azure Arcに設定します。
k3s kubectl create serviceaccount admin-user
k3s kubectl create clusterrolebinding admin-user-binding --clusterrole cluster-admin --serviceaccount default:admin-user
以下は実行例
$ k3s kubectl create serviceaccount admin-user
serviceaccount/admin-user created
$ k3s kubectl create clusterrolebinding admin-user-binding --clusterrole cluster-admin --serviceaccount default:admin-user
clusterrolebinding.rbac.authorization.k8s.io/admin-user-binding created
サービスアカウントトークンを作成します。
k3s kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: admin-user-secret
annotations:
kubernetes.io/service-account.name: admin-user
type: kubernetes.io/service-account-token
EOF
TOKEN=$(k3s kubectl get secret admin-user-secret -o jsonpath='{$.data.token}' | base64 -d | sed 's/$/\n/g')
echo $TOKEN
表示されたトークンをポータルに張り付けて「サインイン」します。
名前空間などのKubernetesリソースが表示できるようになりましたね!
気になる料金は?
さて、便利なAzure Arcですが、気になるのはやはり料金ですよね。
結論から言うと、KubernetesクラスタをAzure Arcに接続するだけでは、追加の料金は発生しません。
Azure Arcの基本的な管理機能(インベントリ管理やタグ付けなど)は無料で利用できます。
ただし、Azure Arcを介して追加のAzureサービスを利用する場合は、そのサービスの利用料が別途発生します。例えば、以下のようなサービスです。
- Microsoft Defender for Cloud
- Azure Monitor
- Azure Policy
- GitOps を使用したクラスター構成
これらのサービスは、Azure Arcに接続したクラスタに対しても適用でき、その際に各サービスの価格体系に基づいた料金がかかる、という仕組みです。
詳細な料金体系については、必ず公式サイトをご確認ください。
まとめ
今回は、自宅のk3sクラスタをAzure Arcに接続する手順を紹介しました。思った以上にスムーズに接続できることが分かりました。
Azure Arcを入り口として、Azureの様々な管理・監視サービスとオンプレミス環境を連携させることが可能になります。次は「Azure Monitor for Containers」を有効にして、監視周りを試してみようと思います。
Discussion