AKSでCNIを自由に変更できるようになったのでCilium入れてみた

Pocket

AKSでCNIを自由に変更できるようになったのでCilium入れてみた

2022/9/4に機能がGAされたので早速試してみる。

事前準備

以下のツールをインストールする。

  • kubectl
  • kubelogin
  • azcli

新規クラスタをCNIなしで構築する

az aks create \
  -l japaneast -g xxxxxxxxxxxxxx -n yyyyyyyyyyyyy \
  --network-plugin none \
  --enable-managed-identity \
  --enable-aad \
  --enable-azure-rbac \
  --kubernetes-version 1.24.3 \
  --ssh-key-value ~/.ssh/id_rsa.pub \
  --zones 1 2 3

AzurePortalから別途いくつか設定する

画面 項目
設定 > クラスター構成 認証と認可 Kubernetes RBAC を使用した Azure AD Authentication
設定 > クラスター構成 クラスター管理 ClusterRoleBinding のための AAD グループの選択 cluster-admin 権限をつけるAADグループ
設定 > クラスター構成 Kubernetes ローカル アカウント true
設定 > ネットワーク HTTP アプリケーション ルーティングの有効化 true
設定 > ネットワーク 承認された IP 範囲の設定 true
設定 > ネットワーク IP 範囲の指定 xxx.xxx.xxx.xxx/xx

クラスタにログインする。

az account set --subscription XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
az aks get-credentials -g xxxxxxxxxxxxxx -n yyyyyyyyyyyyy

CiliumCLIとHubbleClientをセットアップする

https://docs.cilium.io/en/latest/gettingstarted/k8s-install-default/

CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/master/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

https://docs.cilium.io/en/latest/gettingstarted/hubble_setup/#install-the-hubble-client

export HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt)
HUBBLE_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum
sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin
rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}

AKSにCiliumとHubbleをインストールする

cilium install --azure-resource-group kimura20220915
cilium status --wait
cilium hubble enable --ui
cilium status --wait

Network/Security監視プラットフォーム – Hubble をセットアップする

https://docs.cilium.io/en/latest/gettingstarted/hubble_setup/#hubble-setup

お試し

準備

test2 ネームスペースに nginx2 デプロイメントを作成

kubectl create ns test2
kubectl create deployment -n test2 nginx2 --image=nginx

Ciliumネットワークポリシーをお試し – Layer3

https://docs.cilium.io/en/latest/security/policy/

test1 ネームスペースに nginx1 デプロイメントを作成

kubectl create ns test1
kubectl create deployment -n test1 nginx1 --image=nginx
kubectl label pod nginx1-585f98d7bf-d6vcc role=backend

test1 ネームスペースに l3-rule

cat <<EOF | kubectl apply -f -
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "l3-rule-1"
spec:
  # ネットワークポリシーを適用するPodを選択する。
  endpointSelector:
    matchLabels:
      role: backend
  # アクセス元を選択する。
  egress:
    # 許可するFQDN
    - toFQDNs:
        - matchName: "example.com"
    # DNS(kube-dns)への通信を許可する
    - toEndpoints:
      - matchLabels:
          "k8s:io.kubernetes.pod.namespace": kube-system
          "k8s:k8s-app": kube-dns
      toPorts:
        - ports:
           - port: "53"
             protocol: ANY
          rules:
            dns:
              - matchPattern: "*"
EOF
kc exec -it nginx1-585f98d7bf-d6vcc -- bash
# ---
root@nginx1-585f98d7bf-d6vcc:/# curl -L example.com
~~~
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
* Connection #0 to host example.com left intact
# ---
 curl -v google.com 
*   Trying 142.250.199.110:80...
*   Trying 2404:6800:4004:81d::200e:80...
* Immediate connect fail for 2404:6800:4004:81d::200e: Network is unreachable
~~~
TIMEOUT -> 許可していないので正常動作

FQDNで外部接続を部分的に許可できた。
通常のNetworkPolicyやAKSのkubenetで使用できるCalicoV1等ではできない設定なので今後構築するならこちらを使いたい。
AKSで共通クラスタを立てた場合、ホワイトリストプロキシではEgress通信を制御できない(ソースIPが共通NodeのIPになるため。)のでFQDN制御は非常に有効。

hubble-uiによる通信状況の可視化

cilium hubble ui

ブラウザが立ち上がって Hubble UI が表示される。
google.comへのアクセスは許可していないので線が少しだけ赤くなっている。

upgrade

cilium-cliにupgradeコマンドがあったため、これでアップグレードしようとすると「–azure-resource-group」を指定せよとエラーが出た。
指定したらそんなフラグないよ、とエラーになった。
ドキュメントにもcilium-cliによるupgrade方法は記載がないため、今のところはhelmでインストールしてhelmでupgradeするのが良さそうだ。

まとめ

非常にさくっとインストール完了した。
アップグレードが不安なのでhelm templateでインストール用のyamlを作成する方式でインストールするのが良いかもしれない。
今後そのあたりのやり方を検証してみたいと思う。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です