本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 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 \ -nspark-operator-namespace
此解决方法解决了启用 IPv6 主机名验证时的emr-7.x版本使用依赖于 OkHttp 3.x 的 fabric8 Kubernetes 客户端版本,当通过 IPv6 连接到 Kubernetes API 服务器时,该版本未通过 TLS 主机名验证。
Flink 运营商
要在 IPv6 集群上运行 Flink Operator 工作负载,必须在 Flink 操作员容器和FlinkDeployment任务容器上设置以下环境变量:
KUBERNETES_DISABLE_HOSTNAME_VERIFICATION=true
此解决方法解决了 Spark 操作员部分中描述的相同的 OkHttp 3.x IPv6 主机名验证问题。有关更多信息,请参阅 Apache Flink Kubernetes Operator 文档中的
在 Flink Operator pod 上设置环境变量
在helm install以下期间设置环境变量:
helm installmy-flink-operatorchart\ --set operatorPod.env[0].name=KUBERNETES_DISABLE_HOSTNAME_VERIFICATION \ --set-string operatorPod.env[0].value=true
在你的 FlinkDeployment 任务 pod 上设置环境变量
通过 Pod 模板在 FlinkDeployment YAML 中注入环境变量:
spec: podTemplate: spec: containers: - name: flink-main-container env: - name: KUBERNETES_DISABLE_HOSTNAME_VERIFICATION value: "true"
Livy 操作员
要在 IPv6 集群上运行 Livy Operator 工作负载,必须配置两项内容:
-
双栈负载均衡器注解 — 在安装 Livy 头盔图表时添加以下注释,以便 AWS 负载均衡器控制器配置双栈网络负载均衡器:
helm installmy-livychart\ --set "service.annotations.service\.beta\.kubernetes\.io/aws-load-balancer-ip-address-type=dualstack" -
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 操作员。