microk8sでネットワークポリシーCNIのCiliumを使ってみました。 CiliumはKubernetes CNIの一つで、導入するとコンテナーでBPFを使うことができます。
Ciliumはスリアムと呼ぶのが一般的だそうです。ちょっと前までクリアムとかシリウムだと思っていました。 OSSの製品の呼び方って正しいのが何なのか見つけるのが大変ですね。
もともと、Kubernetesで何らかのアドオンを追加する場合、用意されたYAMLファイルを使って kubectl apply -f 〜
するだけなのですが、microk8sはこのブログでも何度かご紹介しているように、 micro8ks.enable
コマンドを使っていくつかの機能を簡単に有効化することができます。
そうそう、コマンドの最初の microk8s
は次のようにエイリアスを張ると、kubectlコマンドだけで済みます。以降の内容ではmicrok8sを付加してコマンド実行していますが、何度もmicrok8sの入力が辛ければ、エイリアスを張ってkubectlコマンドで実行してください。
% sudo snap alias microk8s.kubectl kubectl
インストール
microk8sでCiliumを使いたい場合は、次のように実行するだけですが、最低限5GB以上のメモリーが実装されている必要があるようです。
% microk8s.enable cilium
使う
インストールが終わったら、早速使ってみましょう。 Kubernetes公式ドキュメントの「Declare Network Policy」をもとに、有効化したCiliumをKubernetesで使ってみましょう。
まずNGINXを起動して、サービスとして公開します。
% microk8s.kubectl create deployment nginx --image=nginx % microk8s.kubectl expose deployment nginx --port=80
次のように実行して、起動したNGINXにアクセスしてみます。 まだ、アクセス制御を投入していないため、「Connecting to nginx」と表示されるはずです。メッセージにあるように、接続できています。確認が終わったら「exit」でコンテナーから抜けます。
% microk8s.kubectl run --generator=run-pod/v1 busybox --rm -ti --image=busybox -- /bin/sh If you don't see a command prompt, try pressing enter. / # wget --spider --timeout=1 nginx Connecting to nginx (10.152.183.226:80) remote file exists / #
次のようなアクセス制限を定義してみます。この定義を適用することで、nginxサービスへのアクセスが制限され、ラベル「access: true」を持つ場合にのみアクセスが許可されるようになります。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: access-nginx spec: podSelector: matchLabels: app: nginx ingress: - from: - podSelector: matchLabels: access: "true"
先に作成した定義を次のようなコマンドを実行して適用します。
% microk8s.kubectl apply -f nginx-policy.yaml
もう一度コンテナーを起動して、NGINXアプリケーションにアクセスしてみます。タイムアウトになるはずです。何度実行したとしてもタイムアウトになります。確認が終わったら「exit」でコンテナーから抜けます。
% microk8s.kubectl run --generator=run-pod/v1 busybox --rm -ti --image=busybox -- /bin/sh If you don't see a command prompt, try pressing enter. / # wget --spider --timeout=1 nginx Connecting to nginx (10.152.183.226:80) wget: download timed out / #
もう一度コンテナーを起動して、NGINXアプリケーションにアクセスしてみます。今回はコンテナー起動時に「access=true」というラベルを指定しています。これはNetworkPolicyのYAMLで定義したラベルを指定しています。
次のようにNGINXにアクセスできるのが確認できます。
% microk8s.kubectl run --generator=run-pod/v1 busybox --rm -ti --labels="access=true" --image=busybox -- /bin/sh If you don't see a command prompt, try pressing enter. / # wget --spider --timeout=1 nginx Connecting to nginx (10.152.183.226:80) remote file exists / #
定義したネットワークポリシーが不要になったとします。その場合は delete
します。
% microk8s.kubectl delete -f nginx-policy.yaml
ネットワークポリシーを削除したあとは、特にタグを指定することなくアクセスができるようになっていることが確認できます。
% microk8s.kubectl run --generator=run-pod/v1 busybox --rm -ti --image=busybox -- /bin/sh If you don't see a command prompt, try pressing enter. / # wget --spider --timeout=1 nginx Connecting to nginx (10.152.183.226:80) remote file exists