概要
kubernetesを導入する際にCNIをCalicoやFlannelなどを用いることが多いかと思いますが、その中でもCilium(読みは、おそらくシリアム)が気になったので、色々試してみようかと思いました。
CKAの勉強も兼ねているので、やるならkubernetesの構築からやってみます。
今後はラインタイムであるdockershimが削除されるのもあり、containerdもあわせて導入しました。
記事が長くなるので、今回は導入と動作確認のみとします。
Ciliumとは
以下、公式から引用
Ciliumは、Kubernetesクラスタやその他のコンテナオーケストレーションプラットフォームなどのクラウドネイティブ環境向けに、ネットワーク、セキュリティ、観測性を提供するオープンソースプロジェクトです。
Ciliumの基盤となっているのは、eBPFと呼ばれる新しいLinuxカーネル技術で、強力なセキュリティ、可視性、ネットワーク制御ロジックをLinuxカーネルに動的に挿入することができます。eBPFは、高性能ネットワーキング、マルチクラスタおよびマルチクラウド機能、高度な負荷分散、透過的暗号化、幅広いネットワークセキュリティ機能、透過的観測性などの提供に使用されています。
eBPFをフルに使って、Kubernetesのネットワークに関するセキュリティや可視化を実現できているようです。
またCiliumにはHubbleというCilium上の通信を可視化するツールがあります。
より分かりやすい解説ページがありますので、詳しくは下記参照が良いかと思います。
https://blog.framinal.life/entry/2021/02/20/222728
https://thinkit.co.jp/article/18836
では、環境構築を始めていきたいと思います。
環境
aws + kubeadm + containerd + cilium
kubeadm + containerdを導入します。
※細かい設定なしでシンプルに導入します。
環境用意
- aws環境でUbuntu20.04を2台起動します。
今回は、インスタンスサイズ:t3.mediumとしました。 - 分かりやすいようにコントロールプレーン(cp)側のホスト名を変更します。
sudo hostnamectl set-hostname k8scp
- ワーカーノード(worker)側のホスト名を変更します。
sudo hostnamectl set-hostname k8swork
cp側、worker側のいずれに対しても下記の手順を実施
- k8s公式のkubeadmのインストールにある手順の「ランタイムのインストール」の手前まで進めます。
- containerdの手順を実施し、「kubeadmのインストール」の手順にまた戻ります。
- 「kubeadm、kubelet、kubectlのインストール」手順を実施します。
- kubeletが使用するcgroupドライバーを設定します。
- /etc/default/kubeletのファイルに
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
を記入します。
- /etc/default/kubeletのファイルに
- kubeletをリスタートし、
systemctl status kubelet
で起動できていることを確認します。- 設定の不備で失敗することがあります。
- その場合は、ここを参照してみてください インストール中にkubeadmがコントロールプレーンを待ち続けて止まる
- 設定の不備で失敗することがあります。
コントロールプレーン(cp)側の作業
kubeadm init
を実行します。
もし、ここでinitが失敗した場合はissueに従い、containerdの設定ファイルを削除すると上手くいくかと思います。
rm /etc/containerd/config.toml
systemctl restart containerd
kubeadm init
kubeadm initが成功した際のメッセージに従い、
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
を実行することで、kubectlコマンドが実行できるようになります。
そして、kubeadm joinのメッセージも忘れず、メモしておきます。
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
ワーカーノード(worker)側の作業
cp側でメモしたコマンドを実行することで、workernodeとして参加することができます。
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
成功したメッセージが出たら、ぜひcp側でkubectl get node
を実行して動作していることを確認してみましょう。
ubuntu@k8scp:~$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8scp Ready control-plane,master 21h v1.21.1
k8swork Ready <none> 21h v1.21.1
ciliumを導入
事前にhelmをインストールします。
公式の手順に従い、ciliumをデプロイします。
cilium status
コマンドで結果が出れば、導入完了です。
このまま、可視化ツールであるhubbleも導入していきましょう。
公式手順でhubbleをインストールします。
ここまで導入できた場合は、cilium statusでhubbleのステータスもOKと表示されていると思います。
cilium用の接続テストpodをデプロイして、hubbleで確認してみます。
公式手順に従い、デプロイします。
cp側でhubbleを起動してみます。
# 接続用のIPアドレスを確認
curl ifconfig.io
# 外部公開する
kubectl port-forward -n kube-system svc/hubble-ui --address 0.0.0.0 --address :: 12000:80
ブラウザでIPアドレス:12000
に接続します。
下記の画面が表示されていれば、完了です。
初回画面
cilium-testを選択した時の画面
まとめ
今回はciliumの導入からhubbleの起動まで行いました。
まだまだciliumの機能を使い倒していないので、これから色々試してみたいと思います。
ここまで見ていただきありがとうございました。
その他
ciliumについて簡単に学習する方法があるので、下記のURLを参照してみてください。
(「Cilium getting started」をやってみましたが、かなりわかりやすかったです。)
https://play.instruqt.com/isovalent