AKSでCNIを自由に変更できるようになったのでCilium入れてみた
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を作成する方式でインストールするのが良いかもしれない。 今後そのあたりのやり方を検証してみたいと思う。
この記事が気に入ったらサポートをしてみませんか?