View a markdown version of this page

在 IPv6 集群上的 EKS 上运行 EMR - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 IPv6 集群上的 EKS 上运行 EMR

您可以在 IPv6 亚马逊 EKS 集群上的 EKS 工作负载上运行 Amazon EMR,以充分利用更大的地址空间,并避免 IPv4 地址Kubernetes随着环境的扩展而耗尽。

有关创建 IPv6 亚马逊 EKS 集群的信息,请参阅亚马逊 EKS 用户指南中的集群、容器和服务的 IPv6 地址。

支持的提交模型

IPv6 亚马逊 EKS 集群支持以下提交模型:

  • StartJobRun

  • Spark 连接交互式终端

  • 亚马逊 SageMaker 统一工作室

  • 火花操作员

  • Flink 运营商

  • Livy 操作员

不支持的提交模型

IPv6 集群不支持 Jupyter 企业网关 (JEG) 终端节点。

无需额外配置的提交模型

对于以下提交模型,您可以像处理 IPv4 一样在 IPv6 集群上设置和提交 Amazon EMR 工作负载。无需额外配置:

  • StartJobRun

  • Spark 连接交互式终端

  • 亚马逊 SageMaker 统一工作室

Operator-based 提交模型

Operator-based 提交模型需要额外的配置才能兼容 IPv6。以下部分描述了每位操作员所需的配置。

火花操作员

要在 IPv6 集群上运行 Spark Operator 工作负载,请在您的SparkApplication规范中添加以下 Spark 配置。所有支持的版本都需要此配置。

spec: sparkConf: "spark.kubernetes.driver.service.ipFamilies": "IPv6"

此配置告诉Kubernetes客户端使用 IPv6 IP 系列创建 Spark 驱动程序服务。没有它,驱动程序服务默认为 IPv4, IPv6-only 集群不支持 IPv4。

此外,对于emr-7.x发行版,必须通过在 Spark Operator 部署中设置此环境变量来应用以下解决方法:

KUBERNETES_DISABLE_HOSTNAME_VERIFICATION=true

安装 Spark 运算符后,运行以下命令来设置环境变量:

kubectl set env deployment/spark-operator-deployment-name \ KUBERNETES_DISABLE_HOSTNAME_VERIFICATION=true \ -n spark-operator-namespace

此解决方法解决了启用 IPv6 主机名验证时的已知问题 GitHub。这些emr-7.x版本使用依赖于 OkHttp 3.x 的 fabric8 Kubernetes 客户端版本,当通过 IPv6 连接到 Kubernetes API 服务器时,该版本未通过 TLS 主机名验证。

要在 IPv6 集群上运行 Flink Operator 工作负载,必须在 Flink 操作员容器和FlinkDeployment任务容器上设置以下环境变量:

KUBERNETES_DISABLE_HOSTNAME_VERIFICATION=true

此解决方法解决了 Spark 操作员部分中描述的相同的 OkHttp 3.x IPv6 主机名验证问题。有关更多信息,请参阅 Apache Flink Kubernetes Operator 文档中的 IPv6 配置。

在helm install以下期间设置环境变量:

helm install my-flink-operator chart \ --set operatorPod.env[0].name=KUBERNETES_DISABLE_HOSTNAME_VERIFICATION \ --set-string operatorPod.env[0].value=true

通过 Pod 模板在 FlinkDeployment YAML 中注入环境变量:

spec: podTemplate: spec: containers: - name: flink-main-container env: - name: KUBERNETES_DISABLE_HOSTNAME_VERIFICATION value: "true"

Livy 操作员

要在 IPv6 集群上运行 Livy Operator 工作负载,必须配置两项内容:

  1. 双栈负载均衡器注解 — 在安装 Livy 头盔图表时添加以下注释,以便 AWS 负载均衡器控制器配置双栈网络负载均衡器:

    helm install my-livy chart \ --set "service.annotations.service\.beta\.kubernetes\.io/aws-load-balancer-ip-address-type=dualstack"
  2. Spark 驱动程序服务 IPv6 配置 — 包括通过 Livy 提交 Spark 任务时的spark.kubernetes.driver.service.ipFamilies配置:

    { "conf": { "spark.kubernetes.driver.service.ipFamilies": "IPv6" } }

支持的发行版

下表显示了按提交模式和亚马逊 EMR 版本划分的 IPv6 支持。这些emr-spark-8.x版本是 Spark-only 发行版,不包括 Flink。

提交模型 emr-7.14.0以及更高的 7.x 版本 emr-spark-8.0.0 emr-spark-8.1.0+

StartJobRun

✅ 支持

✅ 支持

✅ 支持

Spark 连接交互式终端

✅ 支持

✅ 支持

✅ 支持

亚马逊 SageMaker 统一工作室

✅ 支持

✅ 支持

✅ 支持

火花操作员

✅ 支持 1,2

❌ 不支持

✅ 支持 2

Flink 运营商

✅ 支持 1

N/A

N/A

Livy 操作员

✅ 支持 2

✅ 支持 2

✅ 支持 2

1 需要使用前一节中描述的此提交模型的KUBERNETES_DISABLE_HOSTNAME_VERIFICATION变通方法。

2 需要为该提交模型进行前一节中描述的额外配置。

问题排查

以下是在 IPv6 集群上的 EKS 工作负载上运行 Amazon EMR 时可能遇到的常见错误。

错误:[] 中包含预期的主机名或 IPv6 IP

java.lang.AssertionError: assertion failed: Expected hostname or IPv6 IP enclosed in [] but got 2600:1f14:31b1:d102:d812::2

原因:您使用的是不支持 IPv6 的亚马逊 EMR 版本。之前的版本emr-7.14.0不包括必要的 IPv6 补丁。

解决方案:升级到emr-7.14.0或更高版本。支持的发行版有关支持的版本的完整列表,请参见。

错误: SSLPeerUnverifiedException 主机名未验证

javax.net.ssl.SSLPeerUnverifiedException: Hostname fd0f:f96c:1438::1 not verified

原因:Spark 或 Flink Operator Pod 没有设置KUBERNETES_DISABLE_HOSTNAME_VERIFICATION=true环境变量。 OkHttp 当 Kubernetes API 服务器使用 IPv6 地址时,3.x 无法通过 TLS 主机名验证。

解决方案:在操作员舱KUBERNETES_DISABLE_HOSTNAME_VERIFICATION=true上设置。请参阅火花操作员或Flink 运营商。

错误:未在此群集上配置无效值 “IPv4”

Service "...-driver-svc" is invalid: spec.ipFamilies[0]: Invalid value: "IPv4": not configured on this cluster

原因:Spark 应用程序不包含spark.kubernetes.driver.service.ipFamilies=IPv6配置。如果没有此设置,Spark 会尝试使用 IPv4 创建驱动程序服务,但 IPv6-only 集群拒绝了该服务。

解决方案:"spark.kubernetes.driver.service.ipFamilies": "IPv6"添加到您的sparkConf(适用于 Spark 操作员)或 Livy 批量提交的conf对象中。请参阅火花操作员或Livy 操作员。