IBM Cloud Docs
为什么 Istio 入口网关的 ibm-cloud-provider-ip pod 卡在 pending 中?

为什么 Istio 入口网关的 ibm-cloud-provider-ip pod 卡在 pending 中?

虚拟私有云 经典基础架构

仅多专区集群

运行 kubectl get pod -n ibm-system 时,为 Istio 入口网关提供外部 IP 地址的 ibm-cloud-provider-ip pod 将陷入 pending 状态。

此外,针对 ibm-cloud-provider-ip pod 运行 kubectl describe pod <pod_name> -n ibm-system 时,您会在输出的 pod 的事件部分中注意到调度冲突错误。

要标识网关的 ibm-cloud-provider-ip pod,您可以运行 kubectl get service -n istio-system 以查找网关的负载均衡器服务,记下其 EXTERNAL-IP,并在 ibm-cloud-provider-ip pod 名称中查找 IP 地址。

创建 istio-ingressgateway 负载均衡器服务时,将创建 ibm-cloud-provider-ip pod 以向负载均衡器提供外部 IP 地址。

这些 ibm-cloud-provider-ip pod 具有节点亲缘关系规则,以便在派生 IP 地址的子网所在的专区中创建这些 pod。 但是,当 istio-ingressgateway 负载均衡器服务的 ExternalTrafficPolicy 设置设置为 Local 时,ibm-cloud-provider-ip pod 还具有要部署到与网关负载均衡器 pod 相同的区域的 pod 亲缘关系规则。 如果 IP 地址和网关负载均衡器存在于集群中的不同专区中,那么 ibm-cloud-provider-ip pod 无法正确部署。

要验证 ibm-cloud-provider-ipistio-ingressgateway pod 是否不存在于同一区域中,请执行以下操作:

  1. 标识 istio-ingressgateway pod 部署到的 NODE

    kubectl get pod -n istio-system -o wide
    
  2. 获取网关负载均衡器服务的外部IP地址

    kubectl get service -n istio-system
    
  3. 标识要将负载均衡器的 ibm-cloud-provider-ip pod 部署到的 NODE。 请将 <IP-with-hyphens> 替换为在上一步骤中找到的IP地址。 在 IP 地址中,使用连字符 (-) 代替句点 (.)。例如,169.12.345.67 变为 169-12-345-67

    kubectl get pod -n ibm-system -o wide -l ibm-cloud-provider-ip=<IP-with-hyphens>
    
  4. 列出工作程序节点所在的区域。 比较在步骤 1 和 3 中找到的工作程序节点,以确定是否将 pod 部署到不同区域中的工作程序节点。

    kubectl get node --no-headers -L ibm-cloud.kubernetes.io/zone
    

    示例输出

    10.176.48.106   Ready   <none>   529d    v1.32+IKS   dal10
    10.176.48.107   Ready   <none>   196d    v1.32+IKS   dal10
    10.184.58.23    Ready   <none>   2y38d   v1.32+IKS   dal12
    10.184.58.42    Ready   <none>   529d    v1.32+IKS   dal12
    

要解决此问题,您可以将 istio-ingressgateway pod 移至 ibm-cloud-provider-ip pod 所在的区域,反之亦然。

  • 移动 istio-ingressgateway pod: 网关的负载均衡器在移动后保留相同的外部 IP 地址。 但是,在附加组件的 V 1.9 和更低版本中,当在 Istio 补丁更新期间自动填充网关的区域标签时,可能会覆盖您所做的更改。
  • 移动 ibm-cloud-provider-ip pod: 网关 在移动后不会 保留相同的外部 IP 地址,并且会为其分配新的 IP 地址。 但是,在附加组件更新期间不会覆盖任何更改。

移动 istio-ingressgateway pod

istio-ingressgateway pod 移动到与 ibm-cloud-provider-ip pod 相同的区域。

  1. 编辑 managed-istio-custom ConfigMap 资源。
    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. 对于要移动的网关,将 istio-ingressgateway-zone-1|2|3 设置更改为 ibm-cloud-provider-ip pod 所在的区域。
  3. 保存并关闭配置文件。 istio-ingressgateway pod 将移至与 ibm-cloud-provider-ip pod 位于同一专区中的工作程序节点,并且 ibm-cloud-provider-ip pod 会正确部署。
  4. 要验证 pod 现在是否存在于同一区域中,请遵循 发生原因 部分中的步骤。

移动 ibm-cloud-provider-ip pod

ibm-cloud-provider-ip pod 移动到与 istio-ingressgateway pod 相同的区域。

  1. 编辑 managed-istio-custom ConfigMap 资源。

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. 记下网关的 istio-ingressgateway-zone-<1|2|3> 设置的名称。 在此示例中,“ConfigMap,要移动”ibm-cloud-provider-ip pod,以获取存在于“dal10 中的网关,请注意名为”istio-ingressgateway-zone-1 的键。

    apiVersion: v1
    data:
      istio-ingressgateway-zone-1: dal10
      istio-ingressgateway-zone-2: dal12
      istio-ingressgateway-public-1-enabled: "true"
      istio-ingressgateway-public-2-enabled: "true"
      istio-monitoring: "true"
    kind: ConfigMap
    ...
    
  3. 通过将相应的 istio-ingressgateway-public-<1|2|3>-enabled 设置更改为 "false" 来临时禁用网关。 在本例中,将 "ConfigMap,中的 "ibm-cloud-provider-ip pod 移动到 "dal10 中的网关,将 "istio-ingressgateway-public-1-enabled 更改为 ""false"

    apiVersion: v1
    data:
      istio-ingressgateway-zone-1: dal10
      istio-ingressgateway-zone-2: dal12
      istio-ingressgateway-public-1-enabled: "false"
      istio-ingressgateway-public-2-enabled: "true"
      istio-monitoring: "true"
    kind: ConfigMap
    ...
    
  4. 保存并关闭配置文件。

  5. 验证是否已删除网关的负载均衡器 pod。 请注意,可能需要最多 30 分钟才能完成更改。

    kubectl get service -n istio-system -o wide
    
  6. 打开 managed-istio-custom ConfigMap 资源。

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  7. 通过将 istio-ingressgateway-public-<1|2|3>-enabled 设置更改回 "true" 来重新启用网关。

  8. 保存并关闭配置文件。 将为网关 ( istio-ingressgateway pod) 创建新的负载均衡器服务,并将该负载均衡器的新 ibm-cloud-provider-ip pod 部署到与 istio-ingressgateway pod 位于同一专区中的工作程序节点。

  9. 要验证 pod 现在是否存在于同一区域中,请遵循 发生原因 部分中的步骤。