Kubernetes を簡単にインストールできる AKS Edge Essential を試してみる
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 の更新で発表されていました。
概要
以下のページを参照してもらえれば一通りのことがわかります。
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 向けの小型デバイスを手に入れることができたので物理マシンで試してみました。
CPU/メモリはこんな感じです。
OS は Windows 10 IoT Enterprise 1809 LTSC です。
以下製品仕様です。
手順
とにかく簡単です。一番面倒なのが環境に合わせたコンフィグの IP アドレスの設定というくらい簡単です。
基本的にドキュメント通りの手順に従えば展開ができるのですが簡単に紹介します。
0. デプロイモードと k8s or k3s の選択
まずはデプロイモードを選択します。single machine deployment
と full deployment
があります。
とりあえず AKS の展開を試したいという場合は、GitHub 上で公開されている JSON をそのまま使って、single machine deployment
を選択します。
ただ、single machine deployment
では、Hyper-V の内部ネットワークで展開されるため、外部から接続したい場合は、full deployment
を選択します。
デプロイモードは設定ファイルで変更できます。SingleMachineCluster
を false
にすると full deployment
になります。
あとは、k8s か k3s でインストーラーが違うのでどちらを使うか選択します。今回はまず single machine deployment
で k8s を使ってみます。
1. ホスト環境のセットアップ
基本的に Hyper-V のインストールと .msi によるパッケージのインストールです。.msi でインストールするあたり Windows っぽいですね。それにしても .msi をダブルクリックするだけで k8s がインストールできるのすごくないですか。。。
2. クラスタの展開
k8s の展開はインストールしたパッケージに含まれている PowerShell を使います。GitHub で公開されているバッチファイルを実行すると必要なモジュールがインポートされた PowerShell が立ち上がってきます。
あとは以下のコマンドを 1 つ実行するだけです。
New-AksEdgeDeployment -JsonConfigFilePath .\aksedge-config-single.json
※LoadBalancer のサービスを作るために"ServiceIPRangeSize": 5
にしています。メモリ容量に応じて 4096 から変更します。
こんな感じで自動的にインストールされていきます。
以上で完了です。展開は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 のページにある以下の図を見ると分かりやすいです。
それでは展開してみましょう。始めに、先ほど展開したクラスタを削除します。
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`
以下のような実行結果になります。
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 が ServiceIPRangeStart
~ServiceIPRangeEnd
の範囲内の 192.168.2.92
で展開されたことが分かります。これで外部からもアクセスできるようになります。
まとめ
k8s の展開が簡単に出来ることが分かって頂けたかと思います。今後の展開に期待です。
- 次にやってみること
- Azure Arc との統合
- マルチノード展開
- GitOps
- Windows コンテナの展開
Discussion