fbpx

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を無効化し、任意のネットワークプラグインを利用することができます。CalicoWeave 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を動作させることができるので、この機会に是非お試しください。

Author

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

Daisuke Higuchiの記事一覧

新規CTA