fbpx

Mirantis Kubernetes Engine (MKE)でCiliumとHubbleを使ってみよう #kubernetes #k8s #cilium #hubble #mirantis

Mirantis Kubernete Engine (MKE)(旧Docker Enterprise)とは、エンタープライズ向けKubernetes/Swarmオーケストレータ製品です。

本稿ではこのMKEでKubernetes環境を構築してみるのですが、この際にネットワークプラグインをMKEデフォルトのCalicoではなくCiliumを使うようにし、Hubbleで可視化を行ってみます。

Cilium・Hubbleとは

デフォルトのKubernetesではkube-proxyを用いてPod間通信を行っています。しかしkube-proxyはPodの数が増えるとパフォーマンスに劣るという難点があります。
CiliumはLinuxカーネル機能のeBPFを用いた実装で、このkube-proxyを置き換えることでパフォーマンスの改善をはかっています。
HubbleはCiliumが提供するオブザバビリティレイヤーです。Podの依存関係やネットワークポリシーの可視化を行います。

MKEでのCiliumの利用

MKEにはデフォルトのkube-proxyを無効化するインストールオプションが存在します。本稿では実施していませんが、インストール後にCilium利用に切り替えることも可能のようです。一方、Cilium側でもMKEとの統合をうたっています。

VMの準備

まず、VM環境はVagrant + VirtualBoxで準備しました。操作用兼ローカルDNS用VMを1つ(node1)、コントロールプレーン用VMを1つ(node2)、ワーカーノード用VMを3つ(node3 〜 node5)です。

# -*- mode: ruby -*-
# vi: set ft=ruby :

base_install =<<-_shell_ timedatectl set-timezone Asia/Tokyo cat < /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.201 node1
192.168.56.202 node2
192.168.56.203 node3
192.168.56.204 node4
192.168.56.205 node5
EOF

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl enable docker
systemctl start docker
usermod -aG docker vagrant
_shell_

node1_install =<<-_shell_ yum install -y dnsmasq cat < /etc/dnsmasq.conf
domain-needed
bogus-priv
conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig
EOF
systemctl enable dnsmasq
systemctl restart dnsmasq

cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubectl
_shell_

node2345_install =<<-_shell_ cat < /etc/resolv.conf
nameserver 192.168.56.201
EOF

cat < /etc/NetworkManager/NetworkManager.conf
[main]
dns=none
[logging]
EOF
systemctl restart NetworkManager
_shell_

Vagrant.configure("2") do |config|
config.vm.box = "rockylinux/8"
config.vm.box_version = "5.0.0"
config.vm.box_check_update = false
config.vm.synced_folder '.', '/vagrant', disabled: true
config.vm.disk :disk, size: "20GB", primary: true

config.vm.define "node1" do |cf|
cf.vm.hostname = "node1"
cf.vm.network "private_network", ip: "192.168.56.201"
cf.vm.provision "shell", inline: base_install + node1_install
cf.vm.provider "virtualbox" do |vb|
vb.memory = 4096
end
end

( 2..5 ).each do |i|
config.vm.define "node#{i}" do |cf|
cf.vm.hostname = "node#{i}"
cf.vm.network "private_network", ip: "192.168.56.20#{i}"
cf.vm.provision "shell", inline: base_install + node2345_install
cf.vm.provider "virtualbox" do |vb|
vb.memory = 4096
end
end
end
end

イメージにはrockylinux/8 v5.0.0を利用します。本稿執筆時点の最新版v7.0.0はなぜか起動しなかったのでバージョンを下げています(
Vagrant box rockylinux/8 fails for virtualbox provider with error VBOX_E_OBJECT_NOT_FOUND
)。
また、rockylinux/8 v5.0.0はディスクサイズが5GBと小さすぎるため、実験的機能のResizing your primary diskを利用しています。環境変数 VAGRANT_EXPERIMENTAL="disks" を指定して vagrant up を行い、VM起動後に cfdisk /dev/sda コマンドおよび xfs_growfs /dev/sda1 コマンドで5GBから20GBにリサイズしましょう。
なお、centos/7ではCiliumのPodが nsenter: cannot open /hostproc/1/ns/cgroup: No such file or directory となって起動に失敗するので利用できません。

MKEのインストール

公式ドキュメントを参考に、node2てMKEコントロールプレーンのインストールを開始します。

[vagrant@node2 ~]$ docker container run --rm -it --name ucp \
-v /var/run/docker.sock:/var/run/docker.sock \
mirantis/ucp:3.6.3 install \
--host-address 192.168.56.202 \
--admin-username admin \
--admin-password adminadmin \
--force-minimums \
--default-node-orchestrator=kubernetes \
--pod-cidr 172.31.0.0/16 \
--san=192.168.56.202 \
--san=node2 \
--unmanaged-cni \
--kube-proxy-disabled \
--kube-default-drop-masq-bits
(中略)
INFO[0135] All Installation Steps Completed
[vagrant@node2 ~]$

ここで注目すべきは公式ドキュメントで指定されている次の 3つのオプションです。MKEでCiliumを使う際にはこれらのオプションを付与してインストールする必要があります。

  • --unmanaged-cni
  • --kube-proxy-disabled
  • --kube-default-drop-masq-bits

MKEのWebUIに管理者権限でログインし、Client Bundleをダウンロード、操作用ノードである node1 にて設定を行います。

[vagrant@node1 ~]$ source env.sh
Cluster "ucp_192.168.56.202:6443_admin" set.
User "ucp_192.168.56.202:6443_admin" set.
Context "ucp_192.168.56.202:6443_admin" created.
[vagrant@node1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node2 NotReady master 7m7s v1.24.6-mirantis-1
[vagrant@node1 ~]$

MKEコントロールプレーンのインストールが完了しました。ネットワークプラグインをインストールしていないため、STATUSはNotReadyです。

Ciliumのインストール

続けて操作用ノードnode1から、Ciliumのインストールを行います。手順はk0でCiliumをインストールした場合と同じです。まず、Cilium管理用CLIのインストールです。

[vagrant@node1 ~]$ CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/master/stable.txt)
[vagrant@node1 ~]$ echo $CILIUM_CLI_VERSION
v0.14.2
[vagrant@node1 ~]$ CLI_ARCH=amd64
[vagrant@node1 ~]$ curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
(中略)
[vagrant@node1 ~]$ sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
cilium-linux-amd64.tar.gz: OK
[vagrant@node1 ~]$ sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
cilium
[vagrant@node1 ~]$ rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
[vagrant@node1 ~]$ cilium version
cilium-cli: v0.14.2 compiled with go1.20.2 on linux/amd64
cilium image (default): v1.13.2
cilium image (stable): v1.13.2
cilium image (running): unknown. Unable to obtain cilium version, no cilium pods found in namespace "kube-system"
[vagrant@node1 ~]$

次に、Cilium管理用CLIを使って、MKEのKubernetesクラスタにCiliumをインストールします。この際 --cluster-name default というオプションを指定しています。MKEではこれがない場合、クラスタ名の自動検出に失敗するからです。

[vagrant@node1 ~]$ cilium install --cluster-name default
Flag --cluster-name has been deprecated, This can now be overridden via `helm-set` (Helm value: `cluster.name`).
ℹ️ Using Cilium version 1.13.2
Auto-detected datapath mode: tunnel
Auto-detected kube-proxy has not been installed
ℹ️ Cilium will fully replace all functionalities of kube-proxy
ℹ️ helm template --namespace kube-system cilium cilium/cilium --version 1.13.2 --set bpf.masquerade=true,cluster.id=0,cluster.name=default,encryption.nodeEncryption=false,k8sServiceHost=192.168.56.202,k8sServicePort=6443,kubeProxyReplacement=strict,operator.replicas=1,serviceAccounts.cilium.name=cilium,serviceAccounts.operator.name=cilium-operator,tunnel=vxlan
ℹ️ Storing helm values file in kube-system/cilium-cli-helm-values Secret
Created CA in secret cilium-ca
Generating certificates for Hubble...
Creating Service accounts...
Creating Cluster roles...
Creating ConfigMap for Cilium version 1.13.2...
Creating Agent DaemonSet...
Creating Operator Deployment...
⌛ Waiting for Cilium to be installed and ready...
♻️ Restarting unmanaged pods...
♻️ Restarted unmanaged pod node-feature-discovery/ucp-node-feature-discovery-nsqvx
✅ Cilium was successfully installed! Run 'cilium status' to view installation health
[vagrant@node1 ~]$

インストールに成功しました。指示通り、ステータスを確認してみましょう。

[vagrant@node1 ~]$ cilium status
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Hubble Relay: disabled
\__/¯¯\__/ ClusterMesh: disabled
\__/

Deployment cilium-operator Desired: 1, Ready: 1/1, Available: 1/1
DaemonSet cilium Desired: 1, Ready: 1/1, Available: 1/1
Containers: cilium Running: 1
cilium-operator Running: 1
Cluster Pods: 4/4 managed by Cilium
Image versions cilium quay.io/cilium/cilium:v1.13.2@sha256:85708b11d45647c35b9288e0de0706d24a5ce8a378166cadc700f756cc1a38d6: 1
cilium-operator quay.io/cilium/operator-generic:v1.13.2@sha256:a1982c0a22297aaac3563e428c330e17668305a41865a842dec53d241c5490ab: 1
[vagrant@node1 ~]$

問題なさそうです。Ciliumのインストールはこれで成功です。

ワーカーノードの参加

node3 〜 node5をMKEのKubernetesクラスタに参加させましょう。MKEのWebUIからクラスタ参加用コマンドを取得し、各ノードで実行します。

[vagrant@node3 ~]$ docker swarm join --token SWMTKN-1-30pqu7cngzmgc4a01oc61pe0unt6jdab3h96ua4lq6adpxob4s-2dnt26xieo8ruqfuf4w5u2idg 192.168.56.202:2377
This node joined a swarm as a worker.
[vagrant@node3 ~]$
[vagrant@node4 ~]$ docker swarm join --token SWMTKN-1-30pqu7cngzmgc4a01oc61pe0unt6jdab3h96ua4lq6adpxob4s-2dnt26xieo8ruqfuf4w5u2idg 192.168.56.202:2377
This node joined a swarm as a worker.
[vagrant@node4 ~]$
[vagrant@node5 ~]$ docker swarm join --token SWMTKN-1-30pqu7cngzmgc4a01oc61pe0unt6jdab3h96ua4lq6adpxob4s-2dnt26xieo8ruqfuf4w5u2idg 192.168.56.202:2377
This node joined a swarm as a worker.
[vagrant@node5 ~]$

node1で状態を確認します。

[vagrant@node1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node2 Ready master 19m v1.24.6-mirantis-1
node3 NotReady 58s v1.24.6-mirantis-1
node4 NotReady 63s v1.24.6-mirantis-1
node5 NotReady 68s v1.24.6-mirantis-1
[vagrant@node1 ~]$ cilium status
/¯¯\
/¯¯\__/¯¯\ Cilium: 1 errors, 3 warnings
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Hubble Relay: disabled
\__/¯¯\__/ ClusterMesh: disabled
\__/

Deployment cilium-operator Desired: 1, Ready: 1/1, Available: 1/1
DaemonSet cilium Desired: 4, Ready: 1/4, Available: 1/4, Unavailable: 3/4
Containers: cilium Pending: 3, Running: 1
cilium-operator Running: 1
Cluster Pods: 4/7 managed by Cilium
Image versions cilium quay.io/cilium/cilium:v1.13.2@sha256:85708b11d45647c35b9288e0de0706d24a5ce8a378166cadc700f756cc1a38d6: 4
cilium-operator quay.io/cilium/operator-generic:v1.13.2@sha256:a1982c0a22297aaac3563e428c330e17668305a41865a842dec53d241c5490ab: 1
Errors: cilium cilium 3 pods of DaemonSet cilium are not ready
Warnings: cilium cilium-hzjzs pod is pending
cilium cilium-mdljl pod is pending
cilium cilium-qw4qk pod is pending
[vagrant@node1 ~]$

CiliumのDaemonSetが参加してきたノードにCiliumのPodを起動しているようです。しばらく待つと、

[vagrant@node1 ~]$ cilium status
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Hubble Relay: disabled
\__/¯¯\__/ ClusterMesh: disabled
\__/

DaemonSet cilium Desired: 4, Ready: 4/4, Available: 4/4
Deployment cilium-operator Desired: 1, Ready: 1/1, Available: 1/1
Containers: cilium Running: 4
cilium-operator Running: 1
Cluster Pods: 4/7 managed by Cilium
Image versions cilium quay.io/cilium/cilium:v1.13.2@sha256:85708b11d45647c35b9288e0de0706d24a5ce8a378166cadc700f756cc1a38d6: 4
cilium-operator quay.io/cilium/operator-generic:v1.13.2@sha256:a1982c0a22297aaac3563e428c330e17668305a41865a842dec53d241c5490ab: 1
[vagrant@node1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node2 Ready master 20m v1.24.6-mirantis-1
node3 Ready 103s v1.24.6-mirantis-1
node4 Ready 108s v1.24.6-mirantis-1
node5 Ready 113s v1.24.6-mirantis-1
[vagrant@node1 ~]$

CiliumのステータスがOKになり、Kubernetesの全ノードのSTATUSがReadyになりました!

動作テスト

デモアプリケーションとしておなじみのSock Shopをデプロイします。MKEではNodePortとして利用できるポートに制限がかかっているため、少し編集が必要です。

[vagrant@node1 ~]$ curl -LO https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/kubernetes/complete-demo.yaml
[vagrant@node1 ~]$ cp -a complete-demo.yaml complete-demo.yaml.orig
[vagrant@node1 ~]$ diff -u complete-demo.yaml.orig complete-demo.yaml
--- complete-demo.yaml.orig 2023-05-19 12:58:29.159161921 +0900
+++ complete-demo.yaml 2023-05-19 12:59:02.645153143 +0900
@@ -314,7 +314,7 @@
ports:
- port: 80
targetPort: 8079
- nodePort: 30001
+ nodePort: 33333
selector:
name: front-end
---
[vagrant@node1 ~]$

ポートを変更したら、デプロイしましょう。

[vagrant@node1 ~]$ kubectl apply -f complete-demo.yaml
(中略)
[vagrant@node1 ~]$ kubectl -n sock-shop get pods
NAME READY STATUS RESTARTS AGE
carts-768b94d86d-r4ghh 1/1 Running 0 6m35s
carts-db-7d6bb49fdb-z86rl 1/1 Running 0 6m34s
catalogue-b4fb7fd4c-gbmvh 1/1 Running 0 6m34s
catalogue-db-5d6544f698-lht67 1/1 Running 0 6m33s
front-end-844cd696b-v6lqz 1/1 Running 0 6m33s
orders-5c69b64c58-4b8tl 1/1 Running 0 6m32s
orders-db-859f4bf5c4-x5q56 1/1 Running 0 6m32s
payment-74b7b766f6-7lt7r 1/1 Running 0 6m31s
queue-master-cd75d98c5-m2kdj 1/1 Running 0 6m31s
rabbitmq-689b569c86-bzsrx 2/2 Running 0 6m30s
session-db-55d67d6748-9zf8b 1/1 Running 0 6m30s
shipping-846cf8cd66-kk5wl 1/1 Running 0 6m29s
user-57f9764474-scsbm 1/1 Running 0 6m28s
user-db-7d5c5fdf76-hsftr 1/1 Running 0 6m27s
[vagrant@node1 ~]$

PodのSTATUSがすべてRunningになったので http://192.168.56.202:33333/ にアクセスしてみましょう。

無事Sock ShopのUIが表示されました。

Hubbleによる可視化

引き続き、HubbleをKubernetesクラスタにインストールし、状態を可視化してみます。

[vagrant@node1 ~]$ cilium hubble enable --ui
(中略)
✨ Patching ConfigMap cilium-config to enable Hubble...
Creating ConfigMap for Cilium version 1.13.2...
♻️ Restarted Cilium pods
⌛ Waiting for Cilium to become ready before deploying other Hubble component(s)...
Creating Peer Service...
✨ Generating certificates...
Generating certificates for Relay...
✨ Deploying Relay...
✨ Deploying Hubble UI and Hubble UI Backend...
⌛ Waiting for Hubble to be installed...
ℹ️ Storing helm values file in kube-system/cilium-cli-helm-values Secret
✅ Hubble was successfully enabled!
[vagrant@node1 ~]$

今回は Vagrant + VirtualBox というローカル環境でテストしているため、Hubble UIのClusterIPサービスをNodePortサービスに変更して、自由にアクセスできるようにします。

[vagrant@node1 ~]$ kubectl -n kube-system patch service hubble-ui -p '{"spec":{"type": "NodePort"}}'
service/hubble-ui patched
[vagrant@node1 ~]$ kubectl -n kube-system describe svc hubble-ui
Name: hubble-ui
Namespace: kube-system
Labels: app.kubernetes.io/name=hubble-ui
app.kubernetes.io/part-of=cilium
k8s-app=hubble-ui
Annotations:
Selector: k8s-app=hubble-ui
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.96.47.30
IPs: 10.96.47.30
Port: http 80/TCP
TargetPort: 8081/TCP
NodePort: http 34491/TCP
Endpoints: 10.0.1.55:8081
Session Affinity: None
External Traffic Policy: Cluster
Events:
[vagrant@node1 ~]$

http://192.168.56.202:34491/ にアクセスしてみると、HubbleのWebUIでsock-shopを可視化することができました。

まとめ

本稿では、MKEデフォルトのCalicoとkube-proxyを無効化してCiliumをインストールし、HubbleでKubernetesクラスタを可視化してみました。
Ciliumには今回紹介したkube-proxyの置き換えやオブザバビリティ機能のHubble以外にも、さまざまな機能が用意されています。本稿でのcilium statusで無効と表示されていた「Cluster Mesh」機能や、先進的なネットワークポリシーなどのセキュリティ機能も備えています。
MKEはこのように柔軟な設定も可能なので、Kubernetesクラスタの環境の一つとして是非ご検討ください。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA