istio ambient Mode
安裝 Gateway API CRD
Ref: https://gateway-api.sigs.k8s.io/guides/#installing-a-gateway-controller
Kubernetes Gateway 介紹 https://gateway-api.sigs.k8s.io/
$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
{ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v0.6.1" | kubectl apply -f -; }
安裝 istio ambient
安裝 istio 使用 ambient
istioctl install --set profile=ambient --skip-confirmation
安裝後檢查pod是否正常
$ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-cni-node-hp8fz 1/1 Running 0 82m
istio-cni-node-qxxqk 1/1 Running 0 82m
istio-cni-node-vhw8r 1/1 Running 0 82m
istiod-f5b64fbc5-qvnnq 1/1 Running 0 83m
ztunnel-d74d6 1/1 Running 0 83m
ztunnel-kjx9m 1/1 Running 0 83m
ztunnel-w4ths 1/1 Running 0 83m
$ kubectl get daemonset -n istio-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
istio-cni-node 3 3 3 3 3 kubernetes.io/os=linux 86m
ztunnel 3 3 3 3 3 <none> 87m
從官方的 github 下載範例
git clone https://github.com/istio/istio.git --single-branch
安裝 kiali 和 prometheus
$ cd istio/samples/addons
$ kubectl apply -f kiali.yaml
$ kubectl apply -f prometheus.yaml
請將 kiali 的 svc 改為 nodeport,方便查看
部署 sleep 和 notsleep,方便等等透過進入pod 使用 curl 測試
建立 Kubernetes Gateway 和 HTTPRoute
Gateway 和 HTTPRoute 內容如下
使用sleep 和 notsleep pod 內的 curl cmd 到 gateway 或是內部的 productpage 存取服務,應該都要正常
進入 Kiali console ,查看 Graph,此時沒有看到服務之間的關聯,因為沒有把 default 的 namespace 啟用 istio ambient
將 default 的 namespace 啟用 ambient,因為 bookinfo 範例建在 default namespace
和之前sidecar模式比,ambient不需要重新部署服務
啟用後,再次從 pod 打API,回到 Kaili Graph,可以看到流量走向了(左方display 選取Security,可以看到有 mTLS加密了)
採用安全覆蓋層從 sleep 到 productpage 以及從 productpage 到 reviews 的進入請求
下面的 policy 只允許 sleep pod 和 istio ingress gateway 存取 productpage。 (從下面的principals可以看到允許得serviceaccount)
測試 policy
在 sleep pod 呼叫 api,從 istio-ingress-gateway 進入 成功回應,符合預期
在 sleep pod 呼叫 api,從 productpage 進入 成功回應,符合預期
在 notsleep pod 呼叫 api,從 productpage 進入 失敗,符合預期
使用 Gateway API 為 productpage服務部署一個waypoint proxy,並使用bookinfo-productpage的服務帳戶。 所有經過productpage服務的流量將受到L7 proxy 的調解、執行和監視。
建立 waypoint porxy 給 productpage 服務
上述指令其實就是在 bookinfo-productpage 的 gateway 新增 annotations,並指定 service acount
更新剛剛設定的 L4 授權政策,加上 只允許用 GET 方法存取 productpage 服務
在 sleep pod 呼叫 api,從 istio-ingress-gateway 進入,並使用 DELETE 的 方法,失敗,因為只能使用 GET 方法,符合預期
在 notsleep pod 呼叫 api,從 productpage,進入,並使用 GET 的 方法,失敗,因為沒有允許notsleep sa的權限
在 sleep pod 呼叫 api ,從 istio-ingress-gateway 進入,並使用 GET 的 方法,成功,符合預期
使用 bookinfo-review service account 為 review 服務部署 waypoint proxy,因此流向 review 服務的所有流量都將由 waypoint proxy 進行調整。
建立 reviews DestinationRule 和 virtual-service以控制 90% 流量到 reviews v1,而 10% 流量到 reviews v2
VirtualService 內容如下
DestinationRule 內容如下
確認 100 個請求中大致有 10% 流量流向 reviews-v2