

 **帮助改进此页面** 

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

# 限制可分配给服务的外部 IP 地址
<a name="restrict-service-external-ip"></a>

可以通过以下方式从集群内部访问 Kubernetes 服务：
+ Kubernetes 自动分配的集群 IP 地址
+ 您在服务规格中为 `externalIPs` 属性指定的任何 IP 地址。外部 IP 地址不由 Kubernetes 管理，而是由集群管理员负责。使用 `externalIPs` 指定的外部 IP 地址不同于由云提供商分配给 `LoadBalancer` 类型服务的外部 IP 地址。

要了解有关 Kubernetes 服务的更多信息，请参阅 Kubernetes 文档中的[服务](https://kubernetes.io/docs/concepts/services-networking/service/)。您能够限制可在服务规格中为 `externalIPs` 指定的 IP 地址。

1. 部署 `cert-manager` 来管理 Webhook 证书。有关更多信息，请参阅 [cert-manager](https://cert-manager.io/docs/) 文档。

   ```
   kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
   ```

1. 验证 `cert-manager` 容器组（pod）是否正在运行。

   ```
   kubectl get pods -n cert-manager
   ```

   示例输出如下。

   ```
   NAME                                       READY   STATUS    RESTARTS   AGE
   cert-manager-58c8844bb8-nlx7q              1/1     Running   0          15s
   cert-manager-cainjector-745768f6ff-696h5   1/1     Running   0          15s
   cert-manager-webhook-67cc76975b-4v4nk      1/1     Running   0          14s
   ```

1. 检查您的现有服务，以确保为它们分配的外部 IP 地址都包含在您要将地址限制到的 CIDR 块之中。

   ```
   kubectl get services -A
   ```

   示例输出如下。

   ```
   NAMESPACE                      NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)         AGE
   cert-manager                   cert-manager                            ClusterIP      10.100.102.137   <none>          9402/TCP        20m
   cert-manager                   cert-manager-webhook                    ClusterIP      10.100.6.136     <none>          443/TCP         20m
   default                        kubernetes                              ClusterIP      10.100.0.1       <none>          443/TCP         2d1h
   externalip-validation-system   externalip-validation-webhook-service   ClusterIP      10.100.234.179   <none>          443/TCP         16s
   kube-system                    kube-dns                                ClusterIP      10.100.0.10      <none>          53/UDP,53/TCP   2d1h
   my-namespace                   my-service                              ClusterIP      10.100.128.10    192.168.1.1     80/TCP          149m
   ```

   如果其中有任何一个 IP 地址值不在要将访问限制到的块之内，则需要将这些地址更改为块的范围内，然后重新部署服务。例如，上面输出中的 `my-service` 服务获得分配的一个外部 IP 地址不在步骤 5 中 CIDR 块示例范围内。

1. 下载外部 IP Webhook 清单。您还可以在 GitHub 上查看 [Webhook 的源代码](https://github.com/kubernetes-sigs/externalip-webhook)。

   ```
   curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/docs/externalip-webhook.yaml
   ```

1. 指定 CIDR 块。在编辑器中打开下载的文件并删除下面代码行开头的 `\#`。

   ```
   #args:
   #- --allowed-external-ip-cidrs=10.0.0.0/8
   ```

   将 `10.0.0.0/8` 替换为您自己的 CIDR 块。您可以根据需要指定任意数量的块。如果指定多个块，请在块之间添加逗号。

1. 如果您的集群不在 AWS `us-west-2` 区域中，则将文件中的 `us-west-2`、`602401143452` 和 `amazonaws.com` 替换为以下命令。在运行命令之前，请将 *region-code* 和 *111122223333* 替换为[查看 Amazon EKS 附加组件的 Amazon 容器镜像注册表](add-ons-images.md)中的列表中您所在 AWS 区域的值。

   ```
   sed -i.bak -e 's|602401143452|111122223333|' externalip-webhook.yaml
   sed -i.bak -e 's|us-west-2|region-code|' externalip-webhook.yaml
   sed -i.bak -e 's|amazonaws.com||' externalip-webhook.yaml
   ```

1. 将清单应用于集群。

   ```
   kubectl apply -f externalip-webhook.yaml
   ```

   若尝试将服务部署到为 `externalIPs` 指定的 IP 地址不在指定 CIDR 块步骤中指定的地址块范围内的集群，则部署将会失败。