平台特定先決條件

本文件涵蓋在 Ambient 模式下安裝 Istio 的任何平台或環境特定先決條件。

平台

某些 Kubernetes 環境需要您設定各種 Istio 設定選項才能支援它們。

Google Kubernetes Engine (GKE)

在 GKE 上,具有 system-node-critical priorityClassName 的 Istio 元件只能安裝在定義了 ResourceQuota 的命名空間中。預設情況下,在 GKE 中,只有 kube-systemnode-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 覆寫。

  1. 建立一個禁用 Traefik 的叢集,這樣它就不會與 Istio 的 ingress 閘道衝突

    $ k3d cluster create --api-port 6550 -p '9080:80@loadbalancer' -p '9443:443@loadbalancer' --agents 2 --k3s-arg '--disable=traefik@server:*'
    
  2. 在安裝 Istio 圖表時設定 global.platform=k3d。例如

    $ helm install istio-cni istio/cni -n istio-system --set profile=ambient --set global.platform=k3d --wait
    

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

然而,這些位置可能會在 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/

MicroK8s

如果您在 MicroK8s 上安裝 Istio,您必須將正確的 platform 值附加到您的安裝命令,因為 MicroK8s 對於 CNI 設定和二進位檔使用了非標準位置。例如

$ helm install istio-cni istio/cni -n istio-system --set profile=ambient --set global.platform=microk8s --wait

minikube

如果您使用具有 Docker 驅動程式minikube,您必須將正確的 platform 值附加到您的安裝命令,因為使用 Docker 的 minikube 對於容器使用了非標準的綁定掛載路徑。例如

$ helm install istio-cni istio/cni -n istio-system --set profile=ambient --set global.platform=minikube --wait"

Red Hat OpenShift

OpenShift 要求 ztunnelistio-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

CNI 外掛程式

當使用特定的 Cilium

  1. Cilium 目前預設會主動刪除其他 CNI 外掛程式及其設定,且必須將 cni.exclusive = false 設定為才能正確支援鏈結。有關更多詳細資訊,請參閱 Cilium 文件

  2. Cilium 的 BPF 偽裝目前預設為停用,且 Istio 對於 Kubernetes 健康檢查使用連結本機 IP 時會出現問題。目前不支援透過 bpf.masquerade=true 啟用 BPF 偽裝,且會導致 Istio ambient 中 pod 健康檢查無法運作。Cilium 的預設 iptables 偽裝實作應繼續正常運作。

  3. 由於 Cilium 如何管理節點身分並在內部允許將節點層級健康探測列入 pod 的允許清單,因此在 Cilium CNI 安裝中,在 ambient 模式下於 Istio 下方套用任何預設拒絕 (default-DENY) 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"
    

    除非您的叢集中已套用其他預設拒絕 (default-deny) 的 NetworkPoliciesCiliumNetworkPolicies,否則不需要此策略覆寫。

    請參閱 issue #49277CiliumClusterWideNetworkPolicy 以取得更多詳細資訊。

此資訊是否有用?
您有任何改進建議嗎?

感謝您的回饋!