🚀

自宅の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クラスタが構築されます。

img

あっという間ですね。

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

ノードのSTATUSReadyになっていれば、正常に起動しています。

さらに、実際にアプリケーションをデプロイして、クラスタが機能していることを確認します。
ここでは、定番のnginxをマニフェストファイルを使ってデプロイしてみましょう。

まず、以下のようなマニフェストファイル (nginx-deployment.yaml) を作成します。
DeploymentでnginxのPodを1つ作成し、Service (NodePort) で外部からアクセスできるようにします。

nginx-deployment.yaml
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 createdservice/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]registrationStateRegisteredになっていることを確認しましょう。

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」を選択します。

img

一覧に、先ほど接続した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)

ポータルの概要ページはこんな感じ。

img

ただし、kubernetesリソース回りの確認をポータルから行うには、サービスアカウントベアラートークンの設定を行う必要があります。

img

サービスアカウントの作成と設定

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

表示されたトークンをポータルに張り付けて「サインイン」します。

img

名前空間などのKubernetesリソースが表示できるようになりましたね!

img

気になる料金は?

さて、便利な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