👻

Kubernetes を簡単にインストールできる AKS Edge Essential を試してみる

2022/12/24に公開

TL;DR

  • 3 分で Kubernetes をインストールできる
  • 4GB のメモリ、2 vCPU のハードウェアのような低スペックのマシンでも動く
  • Azure Arc で統合することでホスト、k8s の両方を Azure の一つのリソースとして管理できる
  • Wi-Fi でも使える

今回紹介する AKS Edge Essential は Kubernetes の実行環境をシングルノードで簡単に展開できるようにしたパッケージで、主に IoT のエッジで動かすようなことを目的とした製品です。要は OSS の kubeadm や kind、k3s と同じようなものです。

実行環境としては、Windows 10/11 もしくは Windows Server ですが、その上のハイパーバイザー上で動くためネイティブの Linux 上にコンテナが展開されます。

Project Haven として Microsoft Build 2022 で発表され、その後 Ignite 2022 では AKS Lite として名を改めて登場したものが、AKS Edge Essentials としてプレビューで出てきたので試してみました。

プレビューは以下の記事の 12/9 の更新で発表されていました。
https://techcommunity.microsoft.com/t5/internet-of-things-blog/taking-azure-arc-and-kubernetes-to-the-edge/ba-p/3650599

概要

以下のページを参照してもらえれば一通りのことがわかります。
AKS Edge Essentials (プレビュー)

ざっくりと以下特徴です。

  • 4GB のメモリ、2 vCPU のハードウェアのように低スペックのマシンでも動く
  • Azure Arc で統合することでホスト、k8s の両方を Azure の一つのリソースとして管理できる
  • 複数ノードの展開ができる
  • Windows ノードを使うことで Windows コンテナも展開できる

以下は実行イメージです。

コンテナは Microsoft 製 Linux の Mariner 上で起動されます。

インストールしてみる

必要なもの

Windows 10/11 もしくは Windows Server です。

仮想マシン上でも頑張ればできるかもしれませんが、今回は ThinkCentre M90n-1 Nano IoT という IoT 向けの小型デバイスを手に入れることができたので物理マシンで試してみました。

https://twitter.com/tsubasaxZZZ/status/1606327323342827520

CPU/メモリはこんな感じです。

OS は Windows 10 IoT Enterprise 1809 LTSC です。

以下製品仕様です。
https://www.lenovo.com/jp/ja/jpoutlet/desktops-jp-outlet/thinkcentre/thinkcentre-m-series/ThinkCentre-M90n-IoT/p/11TC1TMM900

手順

とにかく簡単です。一番面倒なのが環境に合わせたコンフィグの IP アドレスの設定というくらい簡単です。
基本的にドキュメント通りの手順に従えば展開ができるのですが簡単に紹介します。

0. デプロイモードと k8s or k3s の選択

まずはデプロイモードを選択します。single machine deploymentfull deployment があります。
とりあえず AKS の展開を試したいという場合は、GitHub 上で公開されている JSON をそのまま使って、single machine deployment を選択します。
https://learn.microsoft.com/en-us/azure/aks/hybrid/aks-edge-howto-single-node-deployment

ただ、single machine deployment では、Hyper-V の内部ネットワークで展開されるため、外部から接続したい場合は、full deployment を選択します。
https://learn.microsoft.com/en-us/azure/aks/hybrid/aks-edge-howto-multi-node-deployment

デプロイモードは設定ファイルで変更できます。SingleMachineClusterfalse にすると full deployment になります。
https://github.com/Azure/AKS-Edge/blob/b5fbcbe28ec50cb7aaa1d9066ba455a0668604ad/tools/aksedge-config.json#L9

あとは、k8s か k3s でインストーラーが違うのでどちらを使うか選択します。今回はまず single machine deployment で k8s を使ってみます。

1. ホスト環境のセットアップ

基本的に Hyper-V のインストールと .msi によるパッケージのインストールです。.msi でインストールするあたり Windows っぽいですね。それにしても .msi をダブルクリックするだけで k8s がインストールできるのすごくないですか。。。
https://learn.microsoft.com/en-us/azure/aks/hybrid/aks-edge-howto-setup-machine

2. クラスタの展開

k8s の展開はインストールしたパッケージに含まれている PowerShell を使います。GitHub で公開されているバッチファイルを実行すると必要なモジュールがインポートされた PowerShell が立ち上がってきます。

あとは以下のコマンドを 1 つ実行するだけです。

New-AksEdgeDeployment -JsonConfigFilePath .\aksedge-config-single.json

※LoadBalancer のサービスを作るために"ServiceIPRangeSize": 5にしています。メモリ容量に応じて 4096 から変更します。

こんな感じで自動的にインストールされていきます。
https://gist.github.com/tsubasaxZZZ/e369a949cd651c7afd92edecd9ccab78#file-install-md

以上で完了です。展開は2,3分で完了します。

デプロイ後の確認

コンテナのデプロイ

適当にコンテナとサービスを展開してみます。

PS C:\temp\AKS-Edge-main\tools> kubectl.exe run nginx --image nginx
pod/nginx created
PS C:\temp\AKS-Edge-main\tools> kubectl.exe get po -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE                    NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          11s   10.244.0.5   desktop-l33fu7f-ledge   <none>           <none>
PS C:\temp\AKS-Edge-main\tools> kubectl.exe expose pod nginx --type LoadBalancer --port 80 --target-port 80
service/nginx exposed
PS C:\temp\AKS-Edge-main\tools> kubectl.exe get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1      <none>        443/TCP        112s
nginx        LoadBalancer   10.96.33.190   192.168.0.4   80:31387/TCP   4s

ブラウザでアクセスしてみると nginx の画面が表示されます。

仮想スイッチ

aksedgesw-int という内部スイッチが自動的に作成されます。

クラスタの情報

PS C:\temp\AKS-Edge-main\tools> Get-AksEdgeDeploymentInfo

[12/24/2022 14:23:47] Acquiring 'AKS Edge Essentials - K8s (Public Preview)' deployment information


[12/24/2022 14:23:49] Querying IP and MAC addresses from virtual machine (desktop-l33fu7f-ledge)

 - Virtual machine MAC: 00:15:5d:86:df:c8
 - Virtual machine IP : 192.168.0.2 retrieved directly from virtual machine


SingleMachineCluster : True
VnetType             : Internal
VnetName             : aksedgesw-int
LinuxNodeConfig      : @{Name=desktop-l33fu7f-ledge; Addr=System.Collections.Hashtable; VnetName=desktop-l33fu7f-ledgeI
                       nterface; CpuCount=4; MemoryInMB=4096; PowerState=Running; Gateway=192.168.0.1; Ip4PrefixLength=
                       24; DnsServers=192.168.2.2, 1.1.1.1; ControlPlaneEndpointIp=192.168.0.2; ControlPlaneEndpointPor
                       t=6443; ServiceIpRange=}
WindowsNodeConfig    :
Arc                  : @{Status=Not Connected; ClusterName=}

PS C:\temp\AKS-Edge-main\tools> (Get-AksEdgeDeploymentInfo).LinuxNodeConfig

[12/24/2022 14:24:48] Acquiring 'AKS Edge Essentials - K8s (Public Preview)' deployment information


[12/24/2022 14:24:50] Querying IP and MAC addresses from virtual machine (desktop-l33fu7f-ledge)

 - Virtual machine MAC: 00:15:5d:86:df:c8
 - Virtual machine IP : 192.168.0.2 retrieved directly from virtual machine


Name                     : desktop-l33fu7f-ledge
Addr                     : {IpAddress, MacAddress}
VnetName                 : desktop-l33fu7f-ledgeInterface
CpuCount                 : 4
MemoryInMB               : 4096
PowerState               : Running
Gateway                  : 192.168.0.1
Ip4PrefixLength          : 24
DnsServers               : 192.168.2.2, 1.1.1.1
ControlPlaneEndpointIp   : 192.168.0.2
ControlPlaneEndpointPort : 6443
ServiceIpRange

full deployment モードで展開してみる

先ほど展開したサービスは、内部ネットワークのスイッチを使っていたのであくまでも展開したサーバー内からのアクセスだけが出来る状態でした。画像処理などバッチ的な処理だけであれば十分ですが外部から接続できるアプリケーションを展開する場合は、外部ネットワークのスイッチを使う必要があります。

そこで、full deployment モードで展開します。

といっても、設定ファイルを少し変更するだけです。

{
    "SchemaVersion": "1.1",
    "Version": "1.0",
    "DeployOptions": {
        "ControlPlane": true,
        "Headless": false,
        "JoinCluster": false,
        "NetworkPlugin": "calico",
        "SingleMachineCluster": false, <--- full deployment にしたいため false にする
        "TimeoutSeconds": 900,
        "NodeType": "Linux",
        "ServerTLSBootstrap": true
    },
    "EndUser": {
        "AcceptEula": true,
        "AcceptOptionalTelemetry": false
    },
    "LinuxVm": {
        "CpuCount": 4,
        "MemoryInMB": 2048,
        "DataSizeinGB": 20,
        "Ip4Address": "192.168.2.90" <--- コンテナが起動する Linux VM の IP アドレス
    },
    "Network": {
        "VSwitch": {
            "Name": "AKSEdgeSwitch", <--- 外部ネットワークのスイッチ名
            "Type": "External", <--- External を指定
            "AdapterName": "Wi-Fi" <--- 外部ネットワークのアダプタ名
        },
        "ControlPlaneEndpointIp": "192.168.2.91",
        "Ip4GatewayAddress": "192.168.2.2",
        "Ip4PrefixLength": 24,
        "ServiceIPRangeSize": 4,
        "ServiceIPRangeStart": "192.168.2.92",
        "ServiceIPRangeEnd": "192.168.2.95",
        "DnsServers": [
            "1.1.1.1"
        ],
        "InternetDisabled": false,
        "Proxy": {
            "Http": "",
            "Https": "",
            "No": ""
        }
    }
}

Network.VSwitch.Name は Hyper-V の仮想スイッチを設定します。
Network.VSwitch.AdapterName は、以下の Name を設定します。

PS C:\temp\AKS-Edge-main\tools> Get-NetAdapter -Physical | Where-Object { $_.Status -eq 'Up' }

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Wi-Fi                     Intel(R) Wireless-AC 9462                     2 Up           50-E0-85-7B-6B-0A     433.3 Mbps

ネットワークの設定は AKS Edge Essentials key concepts のページにある以下の図を見ると分かりやすいです。

それでは展開してみましょう。始めに、先ほど展開したクラスタを削除します。

mydeployconfig-WiFi.json
PS C:\temp\AKS-Edge-main\tools> Remove-AksEdgeDeployment

[12/24/2022 14:40:55] AksEdge - removing Linux node(s).

 - Skipping safe node removal - tearing the single machine cluster down.
 - Removing Linux node

[12/24/2022 14:40:59] Deleting virtual machine

 - Removing vnic (name: desktop-l33fu7f-ledgeInterface)
 - Removing storage vhd (file: AzureIoTEdgeForLinux-v1-ledge)

[12/24/2022 14:41:00] Virtual machine removed successfully


[12/24/2022 14:41:00] Attempting to remove hcs single machine cluster network

 - Cleaning up single machine cluster HNS network 'aksedgesw-int' ...

[12/24/2022 14:41:01] AksEdge - node(s) successfully removed.

OK
PS C:\temp\AKS-Edge-main\tools>

これだけでクラスタと自動的に作成された仮想スイッチも削除されます。仮想スイッチが残ってしまった場合は再起動すると消えます。

ではまた展開してみましょう。

PS C:\temp\AKS-Edge-main\tools> New-AksEdgeDeployment -JsonConfigFilePath .\mydeployconfig-WiFi.json`

以下のような実行結果になります。
https://gist.github.com/tsubasaxZZZ/e369a949cd651c7afd92edecd9ccab78#file-install-full-md

nginx をデプロイしてみます。

PS C:\temp\AKS-Edge-main\tools> kubectl.exe get po,svc -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP               NODE                    NOMINATED NODE   READINESS GATES
pod/nginx   1/1     Running   0          33s   10.244.220.135   desktop-l33fu7f-ledge   <none>           <none>

NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE     SELECTOR
service/kubernetes   ClusterIP      10.96.0.1       <none>         443/TCP        3m27s   <none>
service/nginx        LoadBalancer   10.100.194.32   192.168.2.92   80:31305/TCP   10s     run=nginx

EXTERNAL-IP が ServiceIPRangeStartServiceIPRangeEnd の範囲内の 192.168.2.92 で展開されたことが分かります。これで外部からもアクセスできるようになります。

まとめ

k8s の展開が簡単に出来ることが分かって頂けたかと思います。今後の展開に期待です。

  • 次にやってみること
    • Azure Arc との統合
    • マルチノード展開
    • GitOps
    • Windows コンテナの展開

Discussion