はじめに
こんにちは、ACS事業部の吉川です。
以下のドキュメントにて、Azure Kubernetes Service(AKS)のCNIとして、Ciliumを利用するオプションのプレビュー機能が公開されました。
さっそく試してみました。
Ciliumとは?
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を紹介しました。
現状ではプレビューということもあってか制約がいくつか存在します。詳細は以下リンク先に記載されています。
また、構成のカスタマイズはできず、そういったシーンではBYO CNIオプションを使って手動でインストールする必要があるようです。
個人的には通信可視化ツールの Hubble が無効化されているのが残念…。今後オプションで有効化できるようになればいいなと思っています。
CiliumをはじめとしたeBPFを利用したプロダクトは昨今注目されているジャンルなので、今後の発展も要チェックですね!