平台特定先决条件

本文档涵盖了在 Ambient 模式下安装 Istio 的任何特定于平台或环境的先决条件。

平台

Google Kubernetes Engine(GKE)

  1. 在 GKE 上,具有 system-node-critical priorityClassName 的 Istio 组件只能被安装在定义了资源配额的命名空间中。 默认情况下,在 GKE 中,只有 kube-systemnode-critical 类定义了资源配额。istio-cniztunnel 都需要 node-ritic 类, 因此在 GKE 中,这两个组件需要:

    • 被安装到 kube-system不是 istio-system

    • 被安装到另一个已手动创建资源配额的命名空间中(如 istio-system),例如:

      1. apiVersion: v1
      2. kind: ResourceQuota
      3. metadata:
      4. name: gcp-critical-pods
      5. namespace: istio-system
      6. spec:
      7. hard:
      8. pods: 1000
      9. scopeSelector:
      10. matchExpressions:
      11. - operator: In
      12. scopeName: PriorityClass
      13. values:
      14. - system-node-critical

Minikube

  1. 如果您使用 Minikube 以及 Docker 驱动, 必须在 helm install 命令后追加 --set cni.cniNetnsDir="/var/run/docker/netns", 以便 istio-cni 节点代理能够正确管理和捕获节点上的 Pod。

MicroK8s

  1. 如果您使用的是 MicroK8s, 由于 MicroK8s 对于 CNI 配置和二进制文件使用了非标准位置, 则必须在 helm install 命令附加 --set values.cni.cniConfDir=/var/snap/microk8s/current/args/cni-network --set values.cni.cniBinDir=/var/snap/microk8s/current/opt/cni/bin

K3D

  1. 如果您使用 k3d 和默认的 flannel CNI, 则必须在您的 istioctl installhelm install 命令中附加 --set values.cni.cniConfDir=/var/lib/rancher/k3s/agent/etc/cni/net.d --set values.cni.cniBinDir=/bin/ 以使用 ambient 配置文件安装 Istio。

  2. 创建一个集群并禁用 Traefik,这样它就不会与 Istio 的入口网关冲突:

    1. $ k3d cluster create --api-port 6550 -p '9080:80@loadbalancer' -p '9443:443@loadbalancer' --agents 2 --k3s-arg '--disable=traefik@server:*'
  3. 使用 istioctl 通过 ambient 配置文件安装 Istio:

    1. $ istioctl install --set profile=ambient --skip-confirmation --set values.cni.cniConfDir=/var/lib/rancher/k3s/agent/etc/cni/net.d --set values.cni.cniBinDir=/bin

K3S

  1. 如果您使用 K3S 及其捆绑的 CNI 之一, 则必须在 helm install 命令中附加 --set values.cni.cniConfDir=/var/lib/rancher/k3s/agent/etc/cni/net.d --set values.cni.cniBinDir=/var/lib/rancher/k3s/data/current/bin/, 因为 K3S 使用非标准位置来存储 CNI 配置和二进制文件。 根据 K3S 文档这些非标准位置也可以被覆盖。 如果您将 K3S 与自定义的非捆绑 CNI 一起使用, 则必须为这些 CNI 配置使用正确的路径,例如 /etc/cni/net.d - 有关详细信息,请参阅 K3S 文档

CNI

Cilium

  1. Cilium 目前默认主动删除其他 CNI 插件及其配置, 并且必须配置 cni.exclusive = false 才能正确支持链接。 有关更多详细信息,请参阅 Cilium 文档

  2. Cilium 的 BPF 伪装目前默认处于禁用状态, 并且在 Istio 使用本地链接 IP 进行 Kubernetes 健康检查时存在问题。 目前不支持通过 bpf.masquerade=true 启用 BPF 伪装, 这会导致 Istio Ambient 中的 Pod 健康检查无法正常工作。 Cilium 的默认 iptables 伪装实现应该可以继续正常运行。

  3. 由于 Cilium 管理节点身份并在内部允许节点级健康探针到 Pod 的白名单, 在 Cilium CNI 安装下的 Istio Ambient 模式中应用 default-DENY 的 NetworkPolicy, 将会导致被 Cilium 默认免于 NetworkPolicy 执行的 kubelet 健康探针被阻塞。

    这可以通过应用以下 CiliumClusterWideNetworkPolicy 来解决:

    1. apiVersion: "cilium.io/v2"
    2. kind: CiliumClusterwideNetworkPolicy
    3. metadata:
    4. name: "allow-ambient-hostprobes"
    5. spec:
    6. description: "Allows SNAT-ed kubelet health check probes into ambient pods"
    7. endpointSelector: {}
    8. ingress:
    9. - fromCIDR:
    10. - "169.254.7.127/32"

    请参阅 Issue #49277CiliumClusterWideNetworkPolicy 了解更多详细信息。