平台特定先決條件
本文件涵蓋在 Ambient 模式下安裝 Istio 的任何平台或環境特定先決條件。
平台
某些 Kubernetes 環境需要您設定各種 Istio 設定選項才能支援它們。
Google Kubernetes Engine (GKE)
在 GKE 上,具有 system-node-critical priorityClassName
的 Istio 元件只能安裝在定義了 ResourceQuota 的命名空間中。預設情況下,在 GKE 中,只有 kube-system
為 node-critical
類別定義了 ResourceQuota。Istio CNI 節點代理程式和 ztunnel
都需要 node-critical
類別,因此在 GKE 中,這兩個元件必須
- 安裝到
kube-system
中(不是istio-system
) - 安裝到另一個已手動建立 ResourceQuota 的命名空間中(例如
istio-system
),例如
apiVersion: v1
kind: ResourceQuota
metadata:
name: gcp-critical-pods
namespace: istio-system
spec:
hard:
pods: 1000
scopeSelector:
matchExpressions:
- operator: In
scopeName: PriorityClass
values:
- system-node-critical
Amazon Elastic Kubernetes Service (EKS)
如果您使用 EKS
- 使用 Amazon 的 VPC CNI
- 啟用 Pod ENI 中繼的情況下
- 且您正在透過 SecurityGroupPolicy 使用 EKS pod-attached SecurityGroups
POD_SECURITY_GROUP_ENFORCING_MODE
必須明確設定為 standard
,否則 pod 健康探測(預設情況下,VPC CNI 會靜默地將其排除在所有策略強制執行之外)將會失敗。這是因為 Istio 為 kubelet 健康探測使用了連結本機 SNAT 位址,而 Amazon 的 VPC CNI 並不了解這一點,且 VPC CNI 沒有選項可將連結本機位址排除在策略強制執行之外。
您可以執行以下指令來檢查您是否已啟用 pod ENI 中繼
$ kubectl set env daemonset aws-node -n kube-system --list | grep ENABLE_POD_ENI
您可以執行以下指令來檢查您的叢集中是否有任何 pod-attached 安全群組
$ kubectl get securitygrouppolicies.vpcresources.k8s.aws
您可以執行以下指令並重新啟動受影響的 pod 來設定 POD_SECURITY_GROUP_ENFORCING_MODE=standard
$ kubectl set env daemonset aws-node -n kube-system POD_SECURITY_GROUP_ENFORCING_MODE=standard
k3d
當使用預設 Flannel CNI 的 k3d 時,您必須將正確的 platform
值附加到您的安裝命令,因為 k3d 對於 CNI 設定和二進位檔使用了非標準位置,這需要一些 Helm 覆寫。
建立一個禁用 Traefik 的叢集,這樣它就不會與 Istio 的 ingress 閘道衝突
$ k3d cluster create --api-port 6550 -p '9080:80@loadbalancer' -p '9443:443@loadbalancer' --agents 2 --k3s-arg '--disable=traefik@server:*'
在安裝 Istio 圖表時設定
global.platform=k3d
。例如$ helm install istio-cni istio/cni -n istio-system --set profile=ambient --set global.platform=k3d --wait
$ istioctl install --set profile=ambient --set values.global.platform=k3d
K3s
當使用 K3s 及其其中一個捆綁的 CNI 時,您必須將正確的 platform
值附加到您的安裝命令,因為 K3s 對於 CNI 設定和二進位檔使用了非標準位置,這需要一些 Helm 覆寫。對於預設的 K3s 路徑,Istio 根據 global.platform
值提供內建的覆寫。
$ helm install istio-cni istio/cni -n istio-system --set profile=ambient --set global.platform=k3s --wait
$ istioctl install --set profile=ambient --set values.global.platform=k3s
然而,這些位置可能會在 K3s 中被覆寫,根據 K3s 文件。如果您使用具有自訂非捆綁 CNI 的 K3s,您必須手動指定這些 CNI 的正確路徑,例如 /etc/cni/net.d
- 請參閱 K3s 文件了解詳細資訊。例如
$ helm install istio-cni istio/cni -n istio-system --set profile=ambient --wait --set cniConfDir=/var/lib/rancher/k3s/agent/etc/cni/net.d --set cniBinDir=/var/lib/rancher/k3s/data/current/bin/
$ istioctl install --set profile=ambient --set values.cni.cniConfDir=/var/lib/rancher/k3s/agent/etc/cni/net.d --set values.cni.cniBinDir=/var/lib/rancher/k3s/data/current/bin/
MicroK8s
如果您在 MicroK8s 上安裝 Istio,您必須將正確的 platform
值附加到您的安裝命令,因為 MicroK8s 對於 CNI 設定和二進位檔使用了非標準位置。例如
$ helm install istio-cni istio/cni -n istio-system --set profile=ambient --set global.platform=microk8s --wait
$ istioctl install --set profile=ambient --set values.global.platform=microk8s
minikube
如果您使用具有 Docker 驅動程式的 minikube,您必須將正確的 platform
值附加到您的安裝命令,因為使用 Docker 的 minikube 對於容器使用了非標準的綁定掛載路徑。例如
$ helm install istio-cni istio/cni -n istio-system --set profile=ambient --set global.platform=minikube --wait"
$ istioctl install --set profile=ambient --set values.global.platform=minikube"
Red Hat OpenShift
OpenShift 要求 ztunnel
和 istio-cni
組件安裝在 kube-system
命名空間中,並且您必須為所有圖表設定 global.platform=openshift
。
如果您使用 helm
,您可以直接設定目標命名空間和 global.platform
值。
如果您使用 istioctl
,您必須使用名為 openshift-ambient
的特殊設定檔來完成相同的事情。
$ helm install istio-cni istio/cni -n kube-system --set profile=ambient --set global.platform=openshift --wait
$ istioctl install --set profile=openshift-ambient --skip-confirmation
CNI 外掛程式
當使用特定的 Cilium Cilium 目前預設會主動刪除其他 CNI 外掛程式及其設定,且必須將 Cilium 的 BPF 偽裝目前預設為停用,且 Istio 對於 Kubernetes 健康檢查使用連結本機 IP 時會出現問題。目前不支援透過 由於 Cilium 如何管理節點身分並在內部允許將節點層級健康探測列入 pod 的允許清單,因此在 Cilium CNI 安裝中,在 ambient 模式下於 Istio 下方套用任何預設拒絕 (default-DENY) 這可以透過套用以下 除非您的叢集中已套用其他預設拒絕 (default-deny) 的 請參閱 issue #49277 和 CiliumClusterWideNetworkPolicy 以取得更多詳細資訊。cni.exclusive = false
設定為才能正確支援鏈結。有關更多詳細資訊,請參閱 Cilium 文件。bpf.masquerade=true
啟用 BPF 偽裝,且會導致 Istio ambient 中 pod 健康檢查無法運作。Cilium 的預設 iptables 偽裝實作應繼續正常運作。NetworkPolicy
,將導致 kubelet
健康探測(預設情況下,Cilium 會靜默地將其排除在所有策略強制執行之外)被封鎖。這是因為 Istio 為 kubelet 健康探測使用了連結本機 SNAT 位址,而 Cilium 並不了解這一點,且 Cilium 沒有選項可將連結本機位址排除在策略強制執行之外。CiliumClusterWideNetworkPolicy
來解決apiVersion: "cilium.io/v2"
kind: CiliumClusterwideNetworkPolicy
metadata:
name: "allow-ambient-hostprobes"
spec:
description: "Allows SNAT-ed kubelet health check probes into ambient pods"
enableDefaultDeny:
egress: false
ingress: false
endpointSelector: {}
ingress:
- fromCIDR:
- "169.254.7.127/32"
NetworkPolicies
或 CiliumNetworkPolicies
,否則不需要此策略覆寫。