

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 为混合节点功能配置代理
<a name="hybrid-nodes-proxy"></a>

如果在本地环境中使用代理服务器来处理离开数据中心或边缘环境的流量，则需要单独将节点和集群配置为使用您的代理服务器。

集群  
在集群上，您需要将 `kube-proxy` 配置为使用您的代理服务器。创建 Amazon EKS 集群后，您必须配置 `kube-proxy`。

Nodes  
在节点上，您必须将操作系统、`containerd`、`kubelet` 和 Amazon SSM Agent 配置为使用您的代理服务器。您可以在操作系统映像构建过程中进行这些更改，也可在每个混合节点上运行 `nodeadm init` 之前进行这些更改。

## 节点级别配置
<a name="_node_level_configuration"></a>

您必须在操作系统映像中或在每个混合节点上运行 `nodeadm init` 之前应用以下配置。

### `containerd` 代理配置
<a name="_containerd_proxy_configuration"></a>

 `containerd` 是 Kubernetes 的默认容器管理运行时。如果使用代理来访问互联网，则必须配置 `containerd`，以确保其能够提取 Kubernetes 和 Amazon EKS 所需的容器镜像。

在每个混合节点的 `/etc/systemd/system/containerd.service.d` 目录中，创建一个名为 `http-proxy.conf` 的文件，其中应包含以下内容。请将 `proxy-domain` 和 `port` 替换为环境的相应值。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### 来自用户数据的 `containerd` 配置
<a name="_containerd_configuration_from_user_data"></a>

需要为此文件创建 `containerd.service.d` 目录。您要重新加载 systemd，才能在不重新启动的情况下获取配置文件。在 AL2023 中，该服务在脚本执行时可能已经在运行，因此还需要重新启动服务。

```
mkdir -p /etc/systemd/system/containerd.service.d
echo '[Service]' > /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
systemctl daemon-reload
systemctl restart containerd
```

### `kubelet` 代理配置
<a name="_kubelet_proxy_configuration"></a>

 `kubelet` 是在每个 Kubernetes 节点上运行的 Kubernetes 节点代理，负责管理该节点以及在该节点上运行的容器组（pod）。如果在本地环境中使用代理，则必须配置 `kubelet`，以确保其能够与 Amazon EKS 集群的公共或私有端点通信。

在每个混合节点的 `/etc/systemd/system/kubelet.service.d/` 目录中，创建一个名为 `http-proxy.conf` 的文件，其中应包含以下内容。请将 `proxy-domain` 和 `port` 替换为环境的相应值。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### 来自用户数据的 `kubelet` 配置
<a name="_kubelet_configuration_from_user_data"></a>

必须为此文件创建 `kubelet.service.d` 目录。您要重新加载 systemd，才能在不重新启动的情况下获取配置文件。在 AL2023 中，该服务在脚本执行时可能已经在运行，因此还需要重新启动服务。

```
mkdir -p /etc/systemd/system/kubelet.service.d
echo '[Service]' > /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
systemctl daemon-reload
systemctl restart kubelet
```

### `ssm` 代理配置
<a name="_ssm_proxy_configuration"></a>

 `ssm` 是可用于初始化混合节点的凭证提供程序之一。`ssm` 负责完成 Amazon 身份验证并生成将由 `kubelet` 使用的临时凭证。如果在本地环境中使用代理，并在节点上将 `ssm` 作为凭证提供程序，则必须配置 `ssm`，以确保其能够与 Amazon SSM 服务端点通信。

在每个混合节点的以下路径中创建一个名为 `http-proxy.conf` 文件，具体取决于操作系统
+ Ubuntu - `/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service.d/http-proxy.conf` 
+ Amazon Linux 2023 和 Red Hat Enterprise Linux – `/etc/systemd/system/amazon-ssm-agent.service.d/http-proxy.conf` 

使用以下内容填充该文件。请将 `proxy-domain` 和 `port` 替换为环境的相应值。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### 来自用户数据的 `ssm` 配置
<a name="_ssm_configuration_from_user_data"></a>

必须为该文件创建 `ssm` systemd 服务文件目录。目录路径取决于节点上使用的操作系统。
+ Ubuntu - `/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service.d` 
+ Amazon Linux 2023 和 Red Hat Enterprise Linux – `/etc/systemd/system/amazon-ssm-agent.service.d` 

请替换以下重启命令中的 systemd 服务名称，具体取决于节点上使用的操作系统
+ Ubuntu - `snap.amazon-ssm-agent.amazon-ssm-agent` 
+ Amazon Linux 2023 和 Red Hat Enterprise Linux – `amazon-ssm-agent` 

```
mkdir -p systemd-service-file-directory
echo '[Service]' > [.replaceable]#systemd-service-file-directory/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://[.replaceable]#proxy-domain:port"' >> systemd-service-file-directory/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://[.replaceable]#proxy-domain:port"' >> [.replaceable]#systemd-service-file-directory/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> [.replaceable]#systemd-service-file-directory/http-proxy.conf
systemctl daemon-reload
systemctl restart [.replaceable]#systemd-service-name
```

### 操作系统代理配置
<a name="_operating_system_proxy_configuration"></a>

如果使用代理来访问互联网，则必须对操作系统进行配置，以确保能够从操作系统的软件包管理器中提取混合节点依赖项。

 **Ubuntu** 

1. 通过以下命令配置 `snap` 以使用代理：

   ```
   sudo snap set system proxy.https=http://proxy-domain:port
   sudo snap set system proxy.http=http://proxy-domain:port
   ```

1. 要为 `apt` 启用代理，请在 `/etc/apt/` 目录中创建一个名为 `apt.conf` 的文件。请将代理域和端口替换为环境的相应值。

   ```
   Acquire::http::Proxy "http://proxy-domain:port";
   Acquire::https::Proxy "http://proxy-domain:port";
   ```

 **Amazon Linux 2023** 

1. 配置 `dnf` 以使用代理。创建一个具有环境的代理域和端口值的文件 `/etc/dnf/dnf.conf`。

   ```
   proxy=http://proxy-domain:port
   ```

 **Red Hat Enterprise Linux** 

1. 配置 `yum` 以使用代理。创建一个具有环境的代理域和端口值的文件 `/etc/yum.conf`。

   ```
   proxy=http://proxy-domain:port
   ```

### IAM Roles Anywhere 代理配置
<a name="_iam_roles_anywhere_proxy_configuration"></a>

在使用带有 `enableCredentialsFile` 标志的 IAM Roles Anywhere 时，IAM Roles Anywhere 凭证提供商服务负责刷新凭证（请参阅[EKS 容器组身份代理](hybrid-nodes-add-ons.md#hybrid-nodes-add-ons-pod-id)）。如果在本地环境中使用代理，则必须配置该服务，以确保其能够与 IAM Roles Anywhere 端点通信。

在 `/etc/systemd/system/aws_signing_helper_update.service.d/` 目录中，创建一个名为 `http-proxy.conf` 的包含以下内容的文件。请将 `proxy-domain` 和 `port` 替换为环境的相应值。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

## 集群范围配置
<a name="_cluster_wide_configuration"></a>

本节中的配置必须在创建 Amazon EKS 集群之后并且在每个混合节点上运行 `nodeadm init` 之前应用。

### kube-proxy 代理配置
<a name="_kube_proxy_proxy_configuration"></a>

当混合节点加入集群时，Amazon EKS 会自动在每个混合节点上将 `kube-proxy` 作为 DaemonSet 安装。`kube-proxy` 支持在 Amazon EKS 集群上跨容器组支持的服务进行路由。要配置每台主机，`kube-proxy` 需要对 Amazon EKS 集群端点进行 DNS 解析。

1. 使用以下命令编辑 `kube-proxy` DaemonSet

   ```
   kubectl -n kube-system edit ds kube-proxy
   ```

   这将在您配置的编辑器中打开 `kube-proxy` DaemonSet 定义。

1. 添加 `HTTP_PROXY` 和 `HTTPS_PROXY` 的环境变量。请注意，您的配置中应该已经存在 `NODE_NAME` 环境变量。请将 `proxy-domain` 和 `port` 替换为环境的相应值。

   ```
   containers:
     - command:
       - kube-proxy
       - --v=2
       - --config=/var/lib/kube-proxy-config/config - --hostname-override=$(NODE_NAME)
       env:
       - name: HTTP_PROXY
         value: http://proxy-domain:port
       - name: HTTPS_PROXY
         value: http://proxy-domain:port
       - name: NODE_NAME
         valueFrom:
           fieldRef:
             apiVersion: v1
             fieldPath: spec.nodeName
   ```