

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 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` 以管理網路掛鉤憑證。如需詳細資訊，請參閱 [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
   ```

   使用您自己的 CIDR 區塊取代 `10.0.0.0/8`。您可以指定需要的區塊，不限數量。如果指定多個區塊，則請在區塊之間加上逗號。

1. 如果您的叢集不在 `us-west-2` AWS 區域，則使用以下命令取代檔案中的 `us-west-2`、`602401143452` 和 `amazonaws.com`。在執行命令之前，使用[檢視適用於 Amazon EKS 附加元件的 Amazon 容器映像登錄檔](add-ons-images.md)清單中的 AWS 區域的值，取代 *region-code* 與 *111122223333*。

   ```
   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 地址將服務部署至叢集，如果 IP 地址未包含於 Specify CIDR blocks (指定 CIDR 區塊) 步驟中指定的區塊，則嘗試將會失敗。