

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

# 在 IPv6 集群上的 EKS 上运行 EMR
<a name="emr-eks-ipv6"></a>

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

有关创建 IPv6 亚马逊 EKS 集群的信息，请参阅*亚马逊 EKS 用户指南[中的集群、容器和服务的 ](https://docs.amazonaws.cn/eks/latest/userguide/cni-ipv6.html) IPv6 地址*。

## 支持的提交模型
<a name="emr-eks-ipv6-supported-models"></a>

IPv6 亚马逊 EKS 集群支持以下提交模型：
+ `StartJobRun`
+ Spark 连接交互式终端
+ 亚马逊 SageMaker 统一工作室
+ 火花操作员
+ Flink 运营商
+ Livy 操作员

**不支持的提交模型**  
IPv6 集群不支持 Jupyter 企业网关 (JEG) 终端节点。

## 无需额外配置的提交模型
<a name="emr-eks-ipv6-no-config"></a>

对于以下提交模型，您可以像处理 IPv4 一样在 IPv6 集群上设置和提交 Amazon EMR 工作负载。无需额外配置：
+ `StartJobRun`
+ Spark 连接交互式终端
+ 亚马逊 SageMaker 统一工作室

## Operator-based 提交模型
<a name="emr-eks-ipv6-operator-config"></a>

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

### 火花操作员
<a name="emr-eks-ipv6-spark-operator"></a>

要在 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 主机名验证[时的](https://github.com/square/okhttp/issues/5885)已知问题 GitHub。这些`emr-7.x`版本使用依赖于 OkHttp 3.x 的 fabric8 Kubernetes 客户端版本，当通过 IPv6 连接到 Kubernetes API 服务器时，该版本未通过 TLS 主机名验证。

### Flink 运营商
<a name="emr-eks-ipv6-flink-operator"></a>

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

```
KUBERNETES_DISABLE_HOSTNAME_VERIFICATION=true
```

此解决方法解决了 Spark 操作员部分中描述的相同的 OkHttp 3.x IPv6 主机名验证问题。有关更多信息，请参阅 Apache Flink Kubernetes Operator 文档[中的 ](https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-main/docs/deployment/configuration/#ipv6-configuration) IPv6 配置。

#### 在 Flink Operator pod 上设置环境变量
<a name="emr-eks-ipv6-flink-operator-pod"></a>

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

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

#### 在你的 FlinkDeployment 任务 pod 上设置环境变量
<a name="emr-eks-ipv6-flink-job-pods"></a>

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

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

### Livy 操作员
<a name="emr-eks-ipv6-livy-operator"></a>

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

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

   ```
   helm install {{my-livy}} {{chart}} \
     --set "service.annotations.service\.beta\.kubernetes\.io/aws-load-balancer-ip-address-type=dualstack"
   ```

1. **Spark 驱动程序服务 IPv6 配置 ** — 包括通过 Livy 提交 Spark 任务时的`spark.kubernetes.driver.service.ipFamilies`配置：

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

## 支持的发行版
<a name="emr-eks-ipv6-releases"></a>

下表显示了按提交模式和亚马逊 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  需要为该提交模型进行前一节中描述的额外配置。

## 问题排查
<a name="emr-eks-ipv6-troubleshooting"></a>

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

### 错误：[] 中包含预期的主机名或 IPv6 IP
<a name="emr-eks-ipv6-troubleshoot-unsupported"></a>

```
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`或更高版本。[支持的发行版](#emr-eks-ipv6-releases)有关支持的版本的完整列表，请参见。

### 错误： SSLPeerUnverifiedException 主机名未验证
<a name="emr-eks-ipv6-troubleshoot-okhttp"></a>

```
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`上**设置。请参阅[火花操作员](#emr-eks-ipv6-spark-operator)或[Flink 运营商](#emr-eks-ipv6-flink-operator)。

### 错误：未在此群集上配置无效值 “IPv4”
<a name="emr-eks-ipv6-troubleshoot-ipfamilies"></a>

```
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`对象中。请参阅[火花操作员](#emr-eks-ipv6-spark-operator)或[Livy 操作员](#emr-eks-ipv6-livy-operator)。