APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Kubernetes ServiceのCNIとしてCiliumが使えるようになりました(プレビュー)

はじめに

こんにちは、ACS事業部の吉川です。
以下のドキュメントにて、Azure Kubernetes Service(AKS)のCNIとして、Ciliumを利用するオプションのプレビュー機能が公開されました。

learn.microsoft.com

さっそく試してみました。

Ciliumとは?

cilium.io

Cilium はeBPFというカーネルの機構を通じてネットワークルーティングを行うプログラムです。
Kubernetesの他のCNIではiptablesを使ってPodへの通信をルーティングするのが一般的ですが、特に大規模な環境におけるオーバーヘッドが近年問題視されています。
Ciliumはカーネルに通信処理を行うバイトコードを挿入することで、処理のオーバーヘッドを少なくすることができるのが特徴です。

Ciliumを有効にしたAKSクラスターを作成する

さっそくCiliumを有効にしたAKSクラスターを作成してみましょう。

# Azure CLIの拡張機能の追加
az extension add --name aks-preview

# 既に拡張機能を導入済みの場合は以下コマンドで更新する
az extension update --name aks-preview

# サブスクリプションでCiliumDataplanePreviewを有効化
az feature register --namespace "Microsoft.ContainerService" --name "CiliumDataplanePreview"

# 有効化に数分かかるので以下のコマンドで状況確認。State が Registered となればOK。
az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/CiliumDataplanePreview')].{Name:name,State:properties.state}"

# リソース名などの変数定義
rgName=rg-sample
vnetName=vnet-cilium
nodeSubnetName=snet-node
podSubnetName=snet-pod
aksName=aks-cilium
location=japaneast

# リソースグループ作成
az group create -l $location -n $rgName

# VNet/サブネット作成
az network vnet create -n $vnetName -g $rgName -l $location \
  --address-prefixes 192.168.0.0/16
az network vnet subnet create -n $nodeSubnetName \
  --vnet-name $vnetName -g $rgName \
  --address-prefixes 192.168.0.0/24
az network vnet subnet create -n $podSubnetName \
  --vnet-name $vnetName -g $rgName \
  --address-prefixes 192.168.1.0/24

# Ciliumを有効化したAKSクラスター作成
NODE_SUBNET_ID=$(az network vnet subnet show -n $nodeSubnetName \
  --vnet-name $vnetName -g $rgName --query id -o tsv)
POD_SUBNET_ID=$(az network vnet subnet show -n $podSubnetName \
  --vnet-name $vnetName -g $rgName --query id -o tsv)
az aks create -g $rgName -n $aksName -l $location \
  --node-count 1 --network-plugin azure \
  --vnet-subnet-id $NODE_SUBNET_ID \
  --pod-subnet-id $POD_SUBNET_ID \
  --enable-cilium-dataplane

確認

AKSクラスターができあがったら簡単に状態を確認してみましょう。

# AKSクラスターの認証情報を取得
az aks get-credentials -g $rgName -n $aksName

# Podを表示
kubectl get pod -A

kube-system名前空間配下にCilium関連のPodが存在することが確認できます。

NAMESPACE     NAME                                  READY   STATUS    RESTARTS   AGE
kube-system   azure-cns-qjnm9                       1/1     Running   0          6m27s
kube-system   cilium-operator-c69fd4946-vz9jh       1/1     Running   0          5m48s
kube-system   cilium-swphv                          1/1     Running   0          5m48s
kube-system   cloud-node-manager-r78ks              1/1     Running   0          6m27s
kube-system   coredns-autoscaler-5589fb5654-94bd7   1/1     Running   0          7m29s
kube-system   coredns-b4854dd98-km4cg               1/1     Running   0          7m29s
kube-system   coredns-b4854dd98-s7ww5               1/1     Running   0          5m14s
kube-system   csi-azuredisk-node-kmztf              3/3     Running   0          6m27s
kube-system   csi-azurefile-node-hkbbj              3/3     Running   0          6m27s
kube-system   konnectivity-agent-7f645864f6-cd6bv   1/1     Running   0          3m57s
kube-system   konnectivity-agent-7f645864f6-p2rgv   1/1     Running   0          3m53s
kube-system   metrics-server-f77b4cd8-5bsg2         1/1     Running   0          7m28s
kube-system   metrics-server-f77b4cd8-gngdr         1/1     Running   0          7m28s

CiliumのCLIツールを使って状態を確認してみましょう。

# Cilium CLIのインストール(https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#install-the-cilium-cli)
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/master/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

# Ciliumのステータス表示
cilium status --wait

以下のようにアスキーアートのロゴ付きで状態を表示してくれます。

また、CLIツールを使って接続試験を行うことができます。
以下のコマンドを実行すると、AKSクラスター上にテスト用のPodをデプロイして、複数Pod間の通信などいくつかのシナリオを自動的にテストしてくれます。

cilium connectivity test

以下のように絵文字を使った表示で進捗が表示されます。

ℹ️  Single-node environment detected, enabling single-node connectivity test
ℹ️  Monitor aggregation detected, will skip some flow validation steps
✨ [aks-cilium] Creating namespace cilium-test for connectivity check...
✨ [aks-cilium] Deploying echo-same-node service...
✨ [aks-cilium] Deploying DNS test server configmap...
✨ [aks-cilium] Deploying same-node deployment...
✨ [aks-cilium] Deploying client deployment...
✨ [aks-cilium] Deploying client2 deployment...
⌛ [aks-cilium] Waiting for deployments [client client2 echo-same-node] to become ready...
⌛ [aks-cilium] Waiting for deployments [] to become ready...
⌛ [aks-cilium] Waiting for CiliumEndpoint for pod cilium-test/client-55bb4798db-2pnn9 to appear...
⌛ [aks-cilium] Waiting for CiliumEndpoint for pod cilium-test/client2-bb57d9bb4-6hwz9 to appear...
⌛ [aks-cilium] Waiting for pod cilium-test/client-55bb4798db-2pnn9 to reach DNS server on cilium-test/echo-same-node-67567dc98-rzcqb pod...
⌛ [aks-cilium] Waiting for pod cilium-test/client2-bb57d9bb4-6hwz9 to reach DNS server on cilium-test/echo-same-node-67567dc98-rzcqb pod...
⌛ [aks-cilium] Waiting for pod cilium-test/client-55bb4798db-2pnn9 to reach default/kubernetes service...
⌛ [aks-cilium] Waiting for pod cilium-test/client2-bb57d9bb4-6hwz9 to reach default/kubernetes service...
⌛ [aks-cilium] Waiting for CiliumEndpoint for pod cilium-test/echo-same-node-67567dc98-rzcqb to appear...
⌛ [aks-cilium] Waiting for Service cilium-test/echo-same-node to become ready...
⌛ [aks-cilium] Waiting for NodePort 192.168.0.4:30964 (cilium-test/echo-same-node) to become ready...
ℹ️  Skipping IPCache check
🔭 Enabling Hubble telescope...
⚠️  Unable to contact Hubble Relay, disabling Hubble telescope and flow validation: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:4245: connect: connection refused"
ℹ️  Expose Relay locally with:
   cilium hubble enable
   cilium hubble port-forward&
ℹ️  Cilium version: 1.12.2
🏃 Running tests...

[=] Test [no-policies]
......................
~中略~
✅ All 22 tests (98 actions) successful, 8 tests skipped, 0 scenarios skipped.

テストも無事通過したので大丈夫そうですね!

おわりに

eBPFを利用したCNI、Ciliumを紹介しました。
現状ではプレビューということもあってか制約がいくつか存在します。詳細は以下リンク先に記載されています。

learn.microsoft.com

また、構成のカスタマイズはできず、そういったシーンではBYO CNIオプションを使って手動でインストールする必要があるようです。

learn.microsoft.com

個人的には通信可視化ツールの Hubble が無効化されているのが残念…。今後オプションで有効化できるようになればいいなと思っています。

CiliumをはじめとしたeBPFを利用したプロダクトは昨今注目されているジャンルなので、今後の発展も要チェックですね!

本記事の投稿者: 吉川 俊甫
AKS/ACAをメインにインフラ系のご支援を担当しています。
Shunsuke Yoshikawa - Credly