Cilium & Grafana / Kubernetes IN Docker

KIND(Kubernetes IN Docker)を使ってマルチノードクラスタの構築し、Ciliumを観測している事例をみつけたので、これのテストをしてみました。

「Cilium Grafana Observability Demo」
https://github.com/isovalent/cilium-grafana-observability-demo

git clone https://github.com/isovalent/cilium-grafana-observability-demo.git

ここで使われているOSSは、ここ最近興味があるものばかりなので、たくさんの要素がありますが、まずは動作させてその構造を調べようと思っています。

環境) Ubuntu 20.04 (リアルPC)
インストールは事例どおりではうまくいかないことがあり、思考錯誤しました。
(Timeoutでかえってこない場合は、Timeoutを伸ばすことをしたり(helm)、それでもうまくいかない場合はパッケージのバージョンを変えたりしています。)

docker, kubectl, kind, yq, helm, cilium-cli のインストール(バージョンを調べたりchecksumをとったりしている部分は参考)

dockerはサーバですが、あとはクライアントツールです。
dockerでkubernetesのマルチノードを実現できるのは、とても便利!
(helm はkubernetesのパッケージマネージャー)

久しぶりのCiliumなので以下で復習も。
https://decode.red/blog/tag/bpf/

kind-config.yaml書き換え(kubeletが立ち上がらないエラーのため)

image: kindest/node:v1.24.15@sha256:7db4f8bea3e14b82d12e044e25e34bd53754b7f2b0e9d56df21774e6f66a70ab

クラスタの作成

kind create cluster –name cidemo –config kind-config.yaml -v10

リポジトリの追加

helm repo add cilium https://helm.cilium.io
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo add minio https://operator.min.io
helm repo add grafana https://grafana.github.io/helm-charts
helm repo add strimzi https://strimzi.io/charts
helm repo add elastic https://helm.elastic.co

Prometheus-operator CRDs インストール

helm template kube-prometheus prometheus-community/kube-prometheus-stack –include-crds \
| yq ‘select(.kind == “CustomResourceDefinition”) * {“metadata”: {“annotations”: {“meta.helm.sh/release-name”: “kube-prometheus”, “meta.helm.sh/release-namespace”: “monitoring”}}}’ \
| kubectl create -f –

ネームスペース作成

kubectl create ns monitoring

Ciliumインストール

# masterIP is needed for kubeProxyReplacement
MASTER_IP=”$(docker inspect cidemo-control-plane | jq ‘.[0].NetworkSettings.Networks.kind.IPAddress’ -r)”
helm upgrade cilium cilium/cilium \
–version 1.13.4 \
–install \
–wait \
–namespace kube-system \
–values helm/cilium-values.yaml \
–set kubeProxyReplacement=strict \
–set k8sServiceHost=”${MASTER_IP}” \
–set k8sServicePort=6443

ステータス確認

kubectl get pods -n kube-system
cilium status –wait

Ingressインストール

helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
–install \
–wait \
–namespace ingress-nginx –create-namespace \
–version 4.1.4 \
–values helm/ingress-nginx-values.yaml

OpenTelemetry operator and collectorインストール (インストールしわすれて、uiも表示させたあと実行)

helm upgrade opentelemetry-operator open-telemetry/opentelemetry-operator \
–install \
–wait \
–namespace opentelemetry-operator –create-namespace \
–version 0.15.0 \
-f helm/opentelemetry-operator-values.yaml
kubectl apply -n opentelemetry-operator -f manifests/otel-collector.yaml

Tempoインストール

helm upgrade tempo grafana/tempo \
–install \
–wait \
–namespace tempo –create-namespace \
–create-namespace \
–version 0.16.2 \
-f helm/tempo-values.yaml

Prometheus & Grafanaインストール

helm upgrade kube-prometheus prometheus-community/kube-prometheus-stack \
–install \
–wait \
–namespace monitoring –create-namespace \
–version 40.3.1 \
–values helm/prometheus-values.yaml

jobs-app インストール

helm dep build ./helm/jobs-app
helm upgrade jobs-app ./helm/jobs-app \
–install \
–wait \
–create-namespace \
–namespace tenant-jobs \
-f helm/jobs-app-values.yaml

CiliumNetworkPolicy確認

kubectl get ciliumnetworkpolicy -n tenant-jobs -o yaml

※取得内容は末尾

pod、serviceや、grafanaの画面など確認

下記のservice,deployは後で確認


また下記でもやったようにUIツールを起動してみました。

Cilium / Container Network Interface

hubble-uiインストール

helm upgrade cilium cilium/cilium –version 1.13.4 –namespace kube-system –reuse-values –set hubble.relay.enabled=true –set hubble.ui.enabled=true

hubble-ui 起動

cilium hubble ui –port-forward 8080

yamlファイルで簡単に構築できてしまうので、何がどのようにつながっているかを把握するためには、動かしてみてからいろんな状態を調べるのがよいと思い、ここまで進めました。

(docker ps), (kubectl get node) で、cidemo-control-plane が、(kind get clusters) で cidemo がひとつあるだけなので、管理はとてもすっきりしています。
(デフォルトで”kind”となるため、名前をあえてつけました)
psコマンドでは、多数のプロセスを表示しますが、podの内外で実行してみて、コンテナは名前空間が違うだけでプロセスなんだ、ということを実感できます。
いろんなコマンドを実行してみることで、理解が深まります。

—————————-
CiliumNetworkPolicy