Mirantis Kubernetes Engine (MKE)でCiliumとHubbleを使ってみよう #kubernetes #k8s #cilium #hubble #mirantis
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
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クラスタの環境の一つとして是非ご検討ください。