仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

microk8sでネットワークポリシーCNIのCiliumを使ってみた

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