k0sでCiliumとHubbleを使ってみよう #kubernetes #k8s #cilium #hubble #k0s #mirantis
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
k0sとは、軽量かつ使いやすい、100%オープンソースのKubernetesディストリビューションです。主な特徴としては、
- フル機能のKubernetesを構築するために必要なすべてを単一バイナリに同梱
- k0s特有の改変を加えていない、CNCF認定の純正なKubernetesをデプロイ
- 最低必要リソース1vCPU・1GBメモリ・2GBストレージのシングルノードから、HA構成の大規模クラスタまでサポート
- Konnectivityをデフォルトで有効化
などが挙げられます。より詳しい情報は公式ドキュメントをご覧ください。
本稿ではこのk0sを使ってKubernetesをインストールしてみるのですが、この際にネットワークプラグインをデフォルトのKube-RouterではなくCiliumを使うようにし、Hubbleで可視化を行ってみます。
Cilium・Hubbleとは
デフォルトのKubernetesではkube-proxyを用いてPod間通信を行っています。しかしkube-proxyはPodの数が増えるとパフォーマンスに劣るという難点があります。
CiliumはLinuxカーネル機能のeBPFを用いた実装で、このkube-proxyを置き換えることでパフォーマンスの改善をはかっています。
HubbleはCiliumが提供するオブザバビリティレイヤーです。Podの依存関係やネットワークポリシーの可視化を行います。
k0sでのCiliumの利用
k0sはデフォルトのkube-routerを無効化し、任意のネットワークプラグインを利用することができます。CalicoやWeave Netの例はこちらの過去記事をご覧ください。
さらにk0sではkube-proxyを無効化することもできるので、Ciliumを利用する準備は整っていると言えます。
では公式ドキュメントを参考に、早速構築していきましょう。環境はVagrant + VirtualBoxで準備しました。コントロールプレーン用VMを1つ、ワーカーノード用VMを2つです。
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.box = "ubuntu/focal64" config.vm.box_check_update = false config.vm.define "master" do |cf| cf.vm.hostname = "master" cf.vm.network "private_network", ip: "192.168.56.101" cf.vm.provider "virtualbox" do |vb| vb.memory = 4096 end end ( 1..2 ).each do |i| config.vm.define "node0#{i}" do |cf| cf.vm.hostname = "node0#{i}" cf.vm.network "private_network", ip: "192.168.56.20#{i}" cf.vm.provider "virtualbox" do |vb| vb.memory = 4096 end end end end
k0sのインストール
VMが準備できたらk0sをインストールしましょう。Ciliumの公式ドキュメントではk0sctlコマンドを使用していますが、ここではVagrantを利用している都合上、簡単のためにk0sコマンドでのインストールを行います。
k0sリリースページからバイナリをダウンロードし、3つのVMすべてに設置します。執筆時のバージョンは v1.26.0+k0s.0 でした。
vagrant@master:~$ /usr/local/bin/k0s version v1.26.0+k0s.0
コントロールプレーン用VMで設定ファイルの雛形を生成・編集します。
vagrant@master:~$ k0s config create > k0s.yaml.orig vagrant@master:~$ cp -a k0s.yaml.orig k0s.yaml vagrant@master:~$ vi k0s.yaml
変更箇所は、
- コントロールプレーン用VMのIPアドレス(192.168.56.101)への変更
- kube-proxyを無効化
- kube-routerを無効化
となります。差分は次の通りです。
vagrant@master:~$ diff -u k0s.yaml.orig k0s.yaml --- k0s.yaml.orig 2023-02-07 02:14:33.621139234 +0000 +++ k0s.yaml 2023-02-07 02:16:19.961141860 +0000 @@ -5,11 +5,10 @@ name: k0s spec: api: - address: 10.0.2.15 + address: 192.168.56.101 k0sApiPort: 9443 port: 6443 sans: - - 10.0.2.15 - 192.168.56.101 - fe80::54:6bff:feb1:a9f4 - fe80::a00:27ff:fe44:7550 @@ -71,18 +70,7 @@ clusterDomain: cluster.local dualStack: {} kubeProxy: - iptables: - masqueradeAll: true - minSyncPeriod: 0s - syncPeriod: 0s - ipvs: - minSyncPeriod: 0s - syncPeriod: 0s - tcpFinTimeout: 0s - tcpTimeout: 0s - udpTimeout: 0s - metricsBindAddress: 0.0.0.0:10249 - mode: iptables + disabled: true kuberouter: autoMTU: true hairpin: Enabled @@ -100,13 +88,13 @@ konnectivityServerBindPort: 7132 type: EnvoyProxy podCIDR: 10.244.0.0/16 - provider: kuberouter + provider: custom serviceCIDR: 10.96.0.0/12 scheduler: {} storage: etcd: externalCluster: null - peerAddress: 10.0.2.15 + peerAddress: 192.168.56.101 type: etcd telemetry: enabled: true vagrant@master:~$
設定ファイルを設定ディレクトリに設置し、k0sをインストールします。
vagrant@master:~$ sudo mkdir /etc/k0s vagrant@master:~$ sudo mv k0s.yaml /etc/k0s/ vagrant@master:~$ sudo k0s install controller -c /etc/k0s/k0s.yaml vagrant@master:~$ sudo k0s start vagrant@master:~$ sudo k0s status Version: v1.26.0+k0s.0 Process ID: 6313 Role: controller Workloads: false SingleNode: false vagrant@master:~$
ワーカーノード参加用トークンを払い出します。
vagrant@master:~$ sudo k0s token create --role=worker /etc/k0s/k0s.yaml > join-token vagrant@master:~$
参加用トークンをワーカーノードVMにコピーし、k0sをインストールします。2つあるワーカーノードVMの両方で行いますが --node-ip のIPアドレスをそれぞれに合わせることをお忘れなく。
vagrant@node01:~$ sudo mkdir /etc/k0s vagrant@node01:~$ sudo mv join-token /etc/k0s/ vagrant@node01:~$ sudo k0s install worker --token-file /etc/k0s/join-token --kubelet-extra-args '--node-ip=192.168.56.201' vagrant@node01:~$ sudo k0s start vagrant@node01:~$ sudo k0s status Version: v1.26.0+k0s.0 Process ID: 7064 Role: worker Workloads: true SingleNode: false Kube-api probing successful: true Kube-api probing last error: vagrant@node01:~$
ワーカーノードを2つとも参加させたら、コントロールプレーン側で確認してみましょう。
vagrant@master:~$ sudo cp /var/lib/k0s/pki/admin.conf kubeconfig.cfg vagrant@master:~$ sudo chown $USER kubeconfig.cfg vagrant@master:~$ export KUBECONFIG=~/kubeconfig.cfg vagrant@master:~$ source <(k0s completion bash) vagrant@master:~$ k0s kubectl get nodes E0207 02:46:18.988467 8328 memcache.go:255] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request E0207 02:46:18.997674 8328 memcache.go:106] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request E0207 02:46:19.005031 8328 memcache.go:106] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request E0207 02:46:19.009013 8328 memcache.go:106] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request NAME STATUS ROLES AGE VERSION node01 NotReady <none> 10m v1.26.0+k0s node02 NotReady <none> 3m53s v1.26.0+k0s vagrant@master:~$
ちょっと見慣れないエラーが出ていますが、Kubernetesクラスタの設定が完了していないためなので、ここでは一旦無視します。node01もnode02もSTATUSがNotReadyなので、クラスタに参加しているものの、まだワークロードを受け付ける準備ができていないこともわかります。
Ciliumのインストール
それではCiliumの公式ドキュメントに従い、Ciliumコマンドのインストールを行いましょう。
vagrant@master:~$ CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/master/stable.txt) vagrant@master:~$ echo $CILIUM_CLI_VERSION v0.12.12 vagrant@master:~$ CLI_ARCH=amd64 vagrant@master:~$ 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@master:~$ sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum cilium-linux-amd64.tar.gz: OK vagrant@master:~$ sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin cilium vagrant@master:~$ rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum} vagrant@master:~$ cilium version cilium-cli: v0.12.12 compiled with go1.19.4 on linux/amd64 cilium image (default): v1.12.5 cilium image (stable): v1.12.6 cilium image (running): unknown. Unable to obtain cilium version, no cilium pods found in namespace "kube-system" vagrant@master:~$
これでCiliumコマンドのインストールが完了しました。最後にエラーが出ていましたが、Ciliumの設定ができていないためなのでここでは一旦無視します。ではいよいよCiliumをKubernetesクラスタにインストールしましょう。
vagrant@master:~$ cilium install ℹ️ Using Cilium version 1.12.5 Auto-detected cluster name: local Auto-detected datapath mode: tunnel Auto-detected kube-proxy has been installed ⚠️ Unable to list kubernetes api resources, try --api-versions if needed: %!w(*fmt.wrapError=&{failed to list api resources: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request 0xc00063eea0}) ℹ️ helm template --namespace kube-system cilium cilium/cilium --version 1.12.5 --set cluster.id=0,cluster.name=local,encryption.nodeEncryption=false,kubeProxyReplacement=disabled,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.12.5... Creating Agent DaemonSet... Creating Operator Deployment... ⌛ Waiting for Cilium to be installed and ready... ♻️ Restarting unmanaged pods... ♻️ Restarted unmanaged pod kube-system/coredns-9864b985-gtfhl ✅ Cilium was successfully installed! Run 'cilium status' to view installation health
Ciliumのインストールが完了しました。指示通り、Ciliumの状態を確認してみましょう。
vagrant@master:~$ cilium status --wait /¯¯\ /¯¯\__/¯¯\ Cilium: OK \__/¯¯\__/ Operator: OK /¯¯\__/¯¯\ Hubble: disabled \__/¯¯\__/ ClusterMesh: disabled \__/ DaemonSet cilium Desired: 2, Ready: 2/2, Available: 2/2 Deployment cilium-operator Desired: 1, Ready: 1/1, Available: 1/1 Containers: cilium Running: 2 cilium-operator Running: 1 Cluster Pods: 5/5 managed by Cilium Image versions cilium-operator quay.io/cilium/operator-generic:v1.12.5@sha256:b296eb7f0f7656a5cc19724f40a8a7121b7fd725278b7d61dc91fe0b7ffd7c0e: 1 cilium quay.io/cilium/cilium:v1.12.5@sha256:06ce2b0a0a472e73334a7504ee5c5d8b2e2d7b72ef728ad94e564740dd505be5: 2 vagrant@master:~$
問題なさそうです。接続性テストも行ってみましょう。なお、これは結構時間がかかります。
vagrant@master:~$ cilium connectivity test ℹ️ Monitor aggregation detected, will skip some flow validation steps ✨ [local] Creating namespace cilium-test for connectivity check... ✨ [local] Deploying echo-same-node service... ✨ [local] Deploying DNS test server configmap... ✨ [local] Deploying same-node deployment... ✨ [local] Deploying client deployment... ✨ [local] Deploying client2 deployment... ✨ [local] Deploying echo-other-node service... ✨ [local] Deploying other-node deployment... ⌛ [local] Waiting for deployments [client client2 echo-same-node] to become ready... ⌛ [local] Waiting for deployments [echo-other-node] to become ready... ⌛ [local] Waiting for CiliumEndpoint for pod cilium-test/client-6f6788d7cc-2mnjz to appear... ⌛ [local] Waiting for CiliumEndpoint for pod cilium-test/client2-bc59f56d5-v79dw to appear... ⌛ [local] Waiting for pod cilium-test/client-6f6788d7cc-2mnjz to reach DNS server on cilium-test/echo-same-node-9f8754876-j7lmt pod... ⌛ [local] Waiting for pod cilium-test/client2-bc59f56d5-v79dw to reach DNS server on cilium-test/echo-same-node-9f8754876-j7lmt pod... ⌛ [local] Waiting for pod cilium-test/client-6f6788d7cc-2mnjz to reach DNS server on cilium-test/echo-other-node-5c58b8cf8b-zbtnx pod... ⌛ [local] Waiting for pod cilium-test/client2-bc59f56d5-v79dw to reach DNS server on cilium-test/echo-other-node-5c58b8cf8b-zbtnx pod... ⌛ [local] Waiting for pod cilium-test/client-6f6788d7cc-2mnjz to reach default/kubernetes service... ⌛ [local] Waiting for pod cilium-test/client2-bc59f56d5-v79dw to reach default/kubernetes service... ⌛ [local] Waiting for CiliumEndpoint for pod cilium-test/echo-other-node-5c58b8cf8b-zbtnx to appear... ⌛ [local] Waiting for CiliumEndpoint for pod cilium-test/echo-same-node-9f8754876-j7lmt to appear... ⌛ [local] Waiting for Service cilium-test/echo-same-node to become ready... ⌛ [local] Waiting for Service cilium-test/echo-other-node to become ready... ⌛ [local] Waiting for NodePort 192.168.56.202:30073 (cilium-test/echo-other-node) to become ready... ⌛ [local] Waiting for NodePort 192.168.56.202:31588 (cilium-test/echo-same-node) to become ready... ⌛ [local] Waiting for NodePort 192.168.56.201:30073 (cilium-test/echo-other-node) to become ready... ⌛ [local] Waiting for NodePort 192.168.56.201:31588 (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.5 Running tests... [=] Test [no-policies] ................................ [=] Test [allow-all-except-world] .............. [=] Test [client-ingress] .. [=] Test [all-ingress-deny] ........ [=] Test [all-egress-deny] ................ [=] Test [all-entities-deny] ........ [=] Test [cluster-entity] .. [=] Test [host-entity] .... [=] Test [echo-ingress] .... [=] Test [client-ingress-icmp] .. [=] Test [client-egress] .... [=] Test [client-egress-expression] .... [=] Test [client-egress-to-echo-service-account] .... [=] Test [to-entities-world] ...... [=] Test [to-cidr-1111] .... [=] Test [echo-ingress-from-other-client-deny] ...... [=] Test [client-ingress-from-other-client-icmp-deny] ...... [=] Test [client-egress-to-echo-deny] ...... [=] Test [client-ingress-to-echo-named-port-deny] .... [=] Test [client-egress-to-echo-expression-deny] .... [=] Test [client-egress-to-echo-service-account-deny] .... [=] Test [client-egress-to-cidr-deny] .... [=] Test [client-egress-to-cidr-deny-default] .... [=] Test [health] .. [=] Test [echo-ingress-l7] ............ [=] Test [echo-ingress-l7-named-port] ............ [=] Test [client-egress-l7-method] ............ [=] Test [client-egress-l7] .......... [=] Test [client-egress-l7-named-port] .......... [=] Test [dns-only] .......... [=] Test [to-fqdns] ........ ✅ All 31 tests (228 actions) successful, 0 tests skipped, 1 scenarios skipped. vagrant@master:~$
すべてのテストをパスしました。クラスタの状態を確認してみましょう。
vagrant@master:~$ k0s kubectl get nodes NAME STATUS ROLES AGE VERSION node01 Ready <none> 30m v1.26.0+k0s node02 Ready <none> 23m v1.26.0+k0s vagrant@master:~$
エラーが消え、node01とnode02の両方のSTATUSがReadyになっているので、ワークロードを受け付けられる状態になっています。
動作テスト
デモアプリケーションとしてお馴染みのSock Shopをデプロイします。
vagrant@master:~$ k0s kubectl create -f https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/kubernetes/complete-demo.yaml vagrant@master:~$ k0s kubectl get pod -n sock-shop NAME READY STATUS RESTARTS AGE carts-db-9f479f97d-vvr89 1/1 Running 0 7m29s carts-f97d4b77b-kl679 1/1 Running 0 7m29s catalogue-b879d7855-dbr96 1/1 Running 0 7m28s catalogue-db-6f8f687666-7hc5g 1/1 Running 0 7m28s front-end-64c558644d-7mj2c 1/1 Running 0 7m28s orders-975b98f6d-dq94m 1/1 Running 0 7m28s orders-db-7b9776477b-pffhv 1/1 Running 0 7m28s payment-5479985fc6-4pctv 1/1 Running 0 7m28s queue-master-5f47c5967-chtqs 1/1 Running 0 7m28s rabbitmq-7d58795496-2ggk6 2/2 Running 0 7m28s session-db-6b78bc9658-nvg6g 1/1 Running 0 7m28s shipping-b7967ddb-x8ck6 1/1 Running 0 7m28s user-5c8564b446-c5d7t 1/1 Running 0 7m27s user-db-6979dbc4cd-xtznf 1/1 Running 0 7m27s vagrant@master:~$
ブラウザで http://192.168.56.201:30001 あるいは http://192.168.56.202:30001 にアクセスし、Sock ShopのUIが表示されれば正常に動作しています。
ところで、本当にkube-proxyが動作していないのでしょうか?確認してみましょう。
vagrant@master:~$ ps auxwwwf | grep '[ k]ube-proxy' vagrant@master:~$ vagrant@node01:~$ ps auxwwwf | grep '[ k]ube-proxy' vagrant@node01:~$ vagrant@node02:~$ ps auxwwwf | grep '[ k]ube-proxy' vagrant@node02:~$
3つのノードすべてでkube-proxyが動作していないことが確認できました。
k0sでのHubbleの利用
引き続き、HubbleをKubernetesクラスタにインストールしてみましょう。公式ドキュメントに従い、Hubbleを有効化します。
vagrant@master:~$ cilium hubble enable Found CA in secret cilium-ca ℹ️ helm template --namespace kube-system cilium cilium/cilium --version 1.12.5 --set cluster.id=0,cluster.name=local,encryption.nodeEncryption=false,hubble.enabled=true,hubble.relay.enabled=true,hubble.tls.ca.cert=(中略),hubble.tls.ca.key=[--- REDACTED WHEN PRINTING TO TERMINAL (USE --redact-helm-certificate-keys=false TO PRINT) ---],kubeProxyReplacement=disabled,operator.replicas=1,serviceAccounts.cilium.name=cilium,serviceAccounts.operator.name=cilium-operator,tunnel=vxlan ✨ Patching ConfigMap cilium-config to enable Hubble... Creating ConfigMap for Cilium version 1.12.5... ♻️ 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... ⌛ Waiting for Hubble to be installed... ℹ️ Storing helm values file in kube-system/cilium-cli-helm-values Secret ✅ Hubble was successfully enabled! vagrant@master:~$
Hubbleのインストールが完了しました。状態を確認してみましょう。
vagrant@master:~$ cilium status /¯¯\ /¯¯\__/¯¯\ Cilium: OK \__/¯¯\__/ Operator: OK /¯¯\__/¯¯\ Hubble: OK \__/¯¯\__/ ClusterMesh: disabled \__/ DaemonSet cilium Desired: 2, Ready: 2/2, Available: 2/2 Deployment hubble-relay Desired: 1, Ready: 1/1, Available: 1/1 Deployment cilium-operator Desired: 1, Ready: 1/1, Available: 1/1 Containers: cilium Running: 2 hubble-relay Running: 1 cilium-operator Running: 1 Cluster Pods: 24/24 managed by Cilium Image versions cilium-operator quay.io/cilium/operator-generic:v1.12.5@sha256:b296eb7f0f7656a5cc19724f40a8a7121b7fd725278b7d61dc91fe0b7ffd7c0e: 1 cilium quay.io/cilium/cilium:v1.12.5@sha256:06ce2b0a0a472e73334a7504ee5c5d8b2e2d7b72ef728ad94e564740dd505be5: 2 hubble-relay quay.io/cilium/hubble-relay:v1.12.5@sha256:22039a7a6cb1322badd6b0e5149ba7b11d35a54cf3ac93ce651bebe5a71ac91a: 1 vagrant@master:~$
クラスタへのインストールが完了しました。引き続き、Hubbleの管理コマンドをインストールします。
vagrant@master:~$ HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt) vagrant@master:~$ echo $HUBBLE_VERSION v0.11.1 vagrant@master:~$ HUBBLE_ARCH=amd64 vagrant@master:~$ curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} vagrant@master:~$ sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum hubble-linux-amd64.tar.gz: OK vagrant@master:~$ sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin hubble vagrant@master:~$ rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} vagrant@master:~$
管理コマンドのインストールはこれで完了です。
CUIでのHubbleの利用
Hubbleを利用してCUIでクラスタの状態を可視化してみましょう。Hubbleにアクセスするためにはポートフォワードが必要になります。
vagrant@master:~$ cilium hubble port-forward ❌ Unable to execute "kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:80": Error: Unable to port forward: unable to execute "kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:80": exec: "kubectl": executable file not found in $PATH vagrant@master:~$
ところがHubbleはkubectlコマンドが単独で存在していることを前提としているため、そのままでは動きません。親切にも失敗したkubectlコマンドが表示されているので、k0sコマンドを前置して実行しましょう。
vagrant@master:~$ k0s kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:80 & [1] 11544 vagrant@master:~$ Forwarding from 127.0.0.1:4245 -> 4245
無事ポートフォワードが設定されたので、Hubbleにアクセスして状態を確認してみましょう。
vagrant@master:~$ hubble status Handling connection for 4245 Healthcheck (via localhost:4245): Ok Current/Max Flows: 8,190/8,190 (100.00%) Flows/s: 71.79 Connected Nodes: 2/2 vagrant@master:~$ hubble observe Handling connection for 4245 Feb 7 03:30:13.526: sock-shop/user-5c8564b446-c5d7t:52782 (ID:38028) <- kube-system/coredns-9864b985-bhlbr:53 (ID:263) to-overlay FORWARDED (UDP) Feb 7 03:30:13.526: sock-shop/user-5c8564b446-c5d7t:35319 (ID:38028) <- kube-system/coredns-9864b985-bhlbr:53 (ID:263) to-overlay FORWARDED (UDP) Feb 7 03:30:13.545: 10.0.0.216:50824 (remote-node) <> 10.0.1.248:4240 (health) to-overlay FORWARDED (TCP Flags: ACK) Feb 7 03:30:13.697: 10.0.0.216:48702 (host) -> cilium-test/echo-same-node-9f8754876-j7lmt:8080 (ID:18341) to-endpoint FORWARDED (TCP Flags: SYN) Feb 7 03:30:13.697: 10.0.0.216:48702 (host) <- cilium-test/echo-same-node-9f8754876-j7lmt:8080 (ID:18341) to-stack FORWARDED (TCP Flags: SYN, ACK) Feb 7 03:30:13.697: 10.0.0.216:48702 (host) -> cilium-test/echo-same-node-9f8754876-j7lmt:8080 (ID:18341) to-endpoint FORWARDED (TCP Flags: ACK) Feb 7 03:30:13.697: 10.0.0.216:48702 (host) -> cilium-test/echo-same-node-9f8754876-j7lmt:8080 (ID:18341) to-endpoint FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:13.697: 10.0.0.216:60310 (host) -> cilium-test/echo-same-node-9f8754876-j7lmt:8181 (ID:18341) to-endpoint FORWARDED (TCP Flags: SYN) Feb 7 03:30:13.697: 10.0.0.216:60310 (host) <- cilium-test/echo-same-node-9f8754876-j7lmt:8181 (ID:18341) to-stack FORWARDED (TCP Flags: SYN, ACK) Feb 7 03:30:13.697: 10.0.0.216:60310 (host) -> cilium-test/echo-same-node-9f8754876-j7lmt:8181 (ID:18341) to-endpoint FORWARDED (TCP Flags: ACK) Feb 7 03:30:13.697: 10.0.0.216:60310 (host) -> cilium-test/echo-same-node-9f8754876-j7lmt:8181 (ID:18341) to-endpoint FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:13.698: 10.0.0.216:60310 (host) <- cilium-test/echo-same-node-9f8754876-j7lmt:8181 (ID:18341) to-stack FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:13.699: 10.0.0.216:60310 (host) -> cilium-test/echo-same-node-9f8754876-j7lmt:8181 (ID:18341) to-endpoint FORWARDED (TCP Flags: ACK, FIN) Feb 7 03:30:13.699: 10.0.0.216:60310 (host) <- cilium-test/echo-same-node-9f8754876-j7lmt:8181 (ID:18341) to-stack FORWARDED (TCP Flags: ACK, FIN) Feb 7 03:30:13.699: 10.0.0.216:60310 (host) -> cilium-test/echo-same-node-9f8754876-j7lmt:8181 (ID:18341) to-endpoint FORWARDED (TCP Flags: ACK) Feb 7 03:30:13.701: 10.0.0.216:48702 (host) <- cilium-test/echo-same-node-9f8754876-j7lmt:8080 (ID:18341) to-stack FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:13.701: 10.0.0.216:48702 (host) -> cilium-test/echo-same-node-9f8754876-j7lmt:8080 (ID:18341) to-endpoint FORWARDED (TCP Flags: ACK, FIN) Feb 7 03:30:13.702: 10.0.0.216:48702 (host) <- cilium-test/echo-same-node-9f8754876-j7lmt:8080 (ID:18341) to-stack FORWARDED (TCP Flags: ACK, FIN) Feb 7 03:30:13.702: 10.0.0.216:48702 (host) -> cilium-test/echo-same-node-9f8754876-j7lmt:8080 (ID:18341) to-endpoint FORWARDED (TCP Flags: ACK) Feb 7 03:30:13.947: sock-shop/orders-975b98f6d-dq94m:36794 (ID:12724) -> sock-shop/orders-db-7b9776477b-pffhv:27017 (ID:21253) to-endpoint FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:14.253: 10.0.1.123:40884 (host) -> cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8080 (ID:10684) to-endpoint FORWARDED (TCP Flags: SYN) Feb 7 03:30:14.253: 10.0.1.123:40884 (host) <- cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8080 (ID:10684) to-stack FORWARDED (TCP Flags: SYN, ACK) Feb 7 03:30:14.253: 10.0.1.123:40884 (host) -> cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8080 (ID:10684) to-endpoint FORWARDED (TCP Flags: ACK) Feb 7 03:30:14.253: 10.0.1.123:42814 (host) -> cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8181 (ID:10684) to-endpoint FORWARDED (TCP Flags: SYN) Feb 7 03:30:14.253: 10.0.1.123:42814 (host) <- cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8181 (ID:10684) to-stack FORWARDED (TCP Flags: SYN, ACK) Feb 7 03:30:14.253: 10.0.1.123:42814 (host) -> cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8181 (ID:10684) to-endpoint FORWARDED (TCP Flags: ACK) Feb 7 03:30:14.253: 10.0.1.123:40884 (host) -> cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8080 (ID:10684) to-endpoint FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:14.253: 10.0.1.123:42814 (host) -> cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8181 (ID:10684) to-endpoint FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:14.253: 10.0.1.123:42814 (host) <- cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8181 (ID:10684) to-stack FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:14.253: 10.0.1.123:42814 (host) <- cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8181 (ID:10684) to-stack FORWARDED (TCP Flags: ACK, FIN) Feb 7 03:30:14.254: 10.0.1.123:42814 (host) -> cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8181 (ID:10684) to-endpoint FORWARDED (TCP Flags: ACK, FIN) Feb 7 03:30:14.254: 10.0.1.123:40884 (host) <- cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8080 (ID:10684) to-stack FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:14.255: 10.0.1.123:40884 (host) -> cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8080 (ID:10684) to-endpoint FORWARDED (TCP Flags: ACK, FIN) Feb 7 03:30:14.255: 10.0.1.123:40884 (host) <- cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8080 (ID:10684) to-stack FORWARDED (TCP Flags: ACK, FIN) Feb 7 03:30:14.255: 10.0.1.123:40884 (host) -> cilium-test/echo-other-node-5c58b8cf8b-zbtnx:8080 (ID:10684) to-endpoint FORWARDED (TCP Flags: ACK) Feb 7 03:30:14.263: kube-system/konnectivity-agent-cs9t7:42498 (ID:60151) <- 192.168.56.101:8132 (ID:16777218) to-endpoint FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:14.263: kube-system/konnectivity-agent-cs9t7:42498 (ID:60151) -> 192.168.56.101:8132 (ID:16777218) to-stack FORWARDED (TCP Flags: ACK) Feb 7 03:30:14.264: kube-system/konnectivity-agent-cs9t7:43308 (ID:60151) -> 192.168.56.202:10250 (host) to-stack FORWARDED (TCP Flags: ACK, PSH) Feb 7 03:30:14.266: kube-system/konnectivity-agent-cs9t7:43308 (ID:60151) <- 192.168.56.202:10250 (host) to-endpoint FORWARDED (TCP Flags: ACK) Feb 7 03:30:14.266: kube-system/hubble-relay-7566d4f4fd-8mg25:54798 (ID:20308) -> 192.168.56.202:4244 (host) to-stack FORWARDED (TCP Flags: ACK) vagrant@master:~$
このように通信状態を確認することができました。
GUIでのHubbleの利用
HubbleはGUIでも状態を確認することができます。公式ドキュメントに従って、GUIを有効にしてみましょう。
vagrant@master:~$ cilium hubble enable --ui Found CA in secret cilium-ca ℹ️ helm template --namespace kube-system cilium cilium/cilium --version 1.12.5 --set cluster.id=0,cluster.name=local,encryption.nodeEncryption=false,hubble.enabled=true,hubble.relay.enabled=true,hubble.tls.ca.cert=(中略),hubble.tls.ca.key=[--- REDACTED WHEN PRINTING TO TERMINAL (USE --redact-helm-certificate-keys=false TO PRINT) ---],hubble.ui.enabled=true,kubeProxyReplacement=disabled,operator.replicas=1,serviceAccounts.cilium.name=cilium,serviceAccounts.operator.name=cilium-operator,tunnel=vxlan ✨ Patching ConfigMap cilium-config to enable Hubble... Creating ConfigMap for Cilium version 1.12.5... ♻️ Restarted Cilium pods ⌛ Waiting for Cilium to become ready before deploying other Hubble component(s)... Creating Peer Service... Error: Unable to enable Hubble: services "hubble-peer" already exists vagrant@master:~$
エラーになってしまいました。これは前項でCUI版を有効にしたからなので、一旦無効にしましょう。
vagrant@master:~$ cilium hubble disable Deleting Hubble UI... Deleting Relay... Deleting Relay certificates... Deleting Peer Service... ✨ Patching ConfigMap cilium-config to disable Hubble... Creating ConfigMap for Cilium version 1.12.5... ♻️ Restarted Cilium pods ℹ️ Storing helm values file in kube-system/cilium-cli-helm-values Secret ✅ Hubble was successfully disabled. vagrant@master:~$
改めてGUI版を有効化します。
vagrant@master:~$ cilium hubble enable --ui Found CA in secret cilium-ca ℹ️ helm template --namespace kube-system cilium cilium/cilium --version 1.12.5 --set cluster.id=0,cluster.name=local,encryption.nodeEncryption=false,hubble.enabled=true,hubble.relay.enabled=true,hubble.tls.ca.cert=(中略),hubble.tls.ca.key=[--- REDACTED WHEN PRINTING TO TERMINAL (USE --redact-helm-certificate-keys=false TO PRINT) ---],hubble.ui.enabled=true,kubeProxyReplacement=disabled,operator.replicas=1,serviceAccounts.cilium.name=cilium,serviceAccounts.operator.name=cilium-operator,tunnel=vxlan ✨ Patching ConfigMap cilium-config to enable Hubble... Creating ConfigMap for Cilium version 1.12.5... ♻️ 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@master:~$
今度は成功しました。CUI版と同様、ポートフォワードを設定します。やはり単独のkubectlコマンドを必要としているので、同様にk0sコマンドを前置し、待ち受けIPアドレスもローカルではなくグローバルに変更して実行します。認証は行われないため、Vagrant + VirtualBox というローカルでのテスト目的として実施しています。
vagrant@master:~$ cilium hubble ui ❌ Unable to execute "kubectl port-forward -n kube-system svc/hubble-ui --address 127.0.0.1 12000:80": Error: Unable to port forward: unable to execute "kubectl port-forward -n kube-system svc/hubble-ui --address 127.0.0.1 12000:80": exec: "kubectl": executable file not found in $PATH vagrant@master:~$ vagrant@master:~$ k0s kubectl port-forward -n kube-system svc/hubble-ui --address 0.0.0.0 12000:80 & [1] 11872 vagrant@master:~$ Forwarding from 0.0.0.0:12000 -> 8081
ブラウザで http://192.168.56.101:12000/ を開くとHubbleのGUIが表示されます。次はsock-shopを可視化した画面です。Pod同士の関係や通信状態がわかります。
まとめ
本稿では、k0sデフォルトのkube-routerとkube-proxyを無効化してCiliumをインストールし、HubbleでKubernetesクラスタを可視化してみました。
Ciliumには今回紹介したkube-proxyの置き換えやオブザバビリティ機能のHubble以外にも、さまざまな機能が用意されています。本稿でのcilium statusで無効と表示されていた「Cluster Mesh」機能や、先進的なネットワークポリシーなどのセキュリティ機能も備えています。
k0sであればお手元で手軽にKubernetesクラスタを準備してCiliumを動作させることができるので、この機会に是非お試しください。