限制 SNAT IP 集區為特定的 Kubernetes 命名空間或 TAS 組織
您可以透過將下列標籤新增至 IP 集區,來指定可從 SNAT IP 集區配置 IP 的 Kubernetes 命名空間或 TAS 組織。
- 對於 Kubernetes 命名空間:
scope: ncp/owner, tag: ns:<namespace_UUID>
- 對於 TAS 組織:
scope: ncp/owner, tag: org:<org_UUID>
您可以使用下列其中一個命令取得命名空間或組織 UUID:
kubectl get ns -o yaml cf org <org_name> --guid
請注意下列事項:
- 每個標籤應指定一個 UUID。您可以為同一個集區建立多個標記。
- 如果您根據舊標籤為某些命名空間或組織配置了 IP 之後變更標籤,將不會回收這些 IP,直到變更了 Kubernetes 服務或 TAS 應用程式的 SNAT 組態或 NCP 重新啟動為止。
- 命名空間和 TAS 組織擁有者標籤是可選用的。如果沒有這些標籤,任何命名空間或 TAS 組織可從 SNAT IP 集區配置 IP。
為服務設定 SNAT IP 集區
您也可以透過新增註解至服務來為服務設定 SNAT IP 集區。例如,
apiVersion: v1 kind: Service metadata: name: svc-example annotations: ncp/snat_pool: <external IP pool ID or name> selector: app: example ...
ncp/snat_pool 指定的 IP 集區必須有標籤 scope: ncp/owner, tag: cluster:<cluster_name>
。
NCP 將針對此服務設定 SNAT 規則。規則的來源 IP 為後端網繭集。目的地 IP 是從指定的外部 IP 集區進行配置的 SNAT IP。如果 NCP 設定 SNAT 規則時發生錯誤,將會使用
ncp/error.snat:
<error> 標註服務。可能的錯誤如下:
- IP_POOL_NOT_FOUND - 在 NSX Manager 中找不到 SNAT IP 集區。
- IP_POOL_EXHAUSTED - SNAT IP 集區已用盡。
- IP_POOL_NOT_UNIQUE - ncp/snat_pool 所指定的集區指的是 NSX Manager 中的多個集區。
- SNAT_RULE_OVERLAPPED - 建立新的 SNAT 規則,但 SNAT 服務的網繭也屬於另一個 SNAT 服務,也就是,同一個網繭具有多個 SNAT 規則。
- POOL_ACCESS_DENIED - ncp/snat_pool 所指定的 IP 集區沒有標籤
scope: ncp/owner, tag: cluster:<cluster_name>
,或集區的擁有者標籤不符合正在傳送配置要求之服務的命名空間。在修正錯誤後,您必須重新啟動 NCP,或在移除 ncp/snat_pool 註解後重新加以新增。
請注意下列事項:
- ncp/snat_pool 所指定的集區應在服務設定之前已存在於 NSX 中。
- 在 NSX 中,服務的 SNAT 規則優先順序高於專案的優先順序。
- 如果網繭已設定多個 SNAT 規則,則只有一個規則適用。
- 您可以透過變更註解並重新啟動 NCP,變更為不同的 IP 集區。
為命名空間設定 SNAT IP 集區
您可以透過新增註解至命名空間,來為命名空間設定 SNAT IP 集區。例如,
apiVersion: v1 kind: Namespace metadata: name: ns-sample annotations: ncp/snat_pool: <external IP pool ID or name> ...
NCP 將針對此命名空間設定 SNAT 規則。規則的來源 IP 為後端網繭集。目的地 IP 是從指定的外部 IP 集區進行配置的 SNAT IP。如果 NCP 設定 SNAT 規則時發生錯誤,將會使用
ncp/error.snat:
<error> 標註命名空間。可能的錯誤如下:
- IP_POOL_NOT_FOUND - 在 NSX Manager 中找不到 SNAT IP 集區。
- IP_POOL_EXHAUSTED - SNAT IP 集區已用盡。
- IP_POOL_NOT_UNIQUE - ncp/snat_pool 所指定的集區指的是 NSX Manager 中的多個集區。
- POOL_ACCESS_DENIED - ncp/snat_pool 所指定的 IP 集區沒有標籤
scope: ncp/owner, tag: cluster:<cluster_name>
,或集區的擁有者標籤不符合正在傳送配置要求的命名空間。在修正錯誤後,您必須重新啟動 NCP,或在移除 ncp/snat_pool 註解後重新加以新增。
請注意下列事項:
- 您只能在註解中指定一個 SNAT IP 集區。
- 不需要在 ncp.ini 中設定 SNAT IP 集區。
- ncp/snat_pool 指定的 IP 集區必須有標籤
scope: ncp/owner, tag: cluster:<cluster_name>
。 - ncp/snat_pool 所指定的 IP 集區也可具有命名空間標籤
scope: ncp/owner, tag: ns:<namespace_UUID>
。 - 如果缺少 ncp/snat_pool 註解,命名空間會將 SNAT IP 集區用於叢集。
- 您可以透過變更註解並重新啟動 NCP,變更為不同的 IP 集區。
為服務設定 SNAT IP 位址
您也可以透過將註解新增至服務來為服務設定 SNAT IP 位址。例如,
apiVersion: v1 kind: Service metadata: name: svc-example annotations: ncp/static_snat_ip: "1.2.3.4" ...
如果同時指定註解
ncp/snat_pool,則 SNAT IP 位址必須位於指定的 SNAT 位址集區中。否則,它必須位於
ncp.ini 中指定的外部 IP 集區中。如果沒有任何錯誤,NCP 將使用此服務的已標註 SNAT IP 位址建立或更新 SNAT 規則。在服務中,將以
ncp/snat_ip_status 標註設定 SNAT 規則的狀態。可能的值為:
- IP_ALLOCATED_SUCCESSFULLY
- IP_ALREADY_ALLOCATED - 已配置 IP 位址。
- IP_NOT_IN_POOL - IP 位址不在 SNAT IP 集區中。
- IP_POOL_EXHAUSTED - SNAT IP 集區已用盡。
- SNAT_PROCESS_FAILED - 發生未知錯誤。
為命名空間設定 SNAT IP 位址
您可以透過將註解新增至命名空間來為命名空間設定 SNAT IP 位址。例如,
apiVersion: v1 kind: Namespace metadata: name: svc-example annotations: ncp/static_snat_ip: "1.2.3.4" ...
如果同時指定註解
ncp/snat_pool,則 SNAT IP 位址必須位於指定的 SNAT 位址集區中。否則,它必須位於
ncp.ini 中指定的外部 IP 集區中。如果沒有任何錯誤,NCP 將使用此命名空間的已標註 SNAT IP 位址建立或更新 SNAT 規則。在命名空間中,將以
ncp/snat_ip_status 標註設定 SNAT 規則的狀態。可能的值為:
- IP_ALLOCATED_SUCCESSFULLY
- IP_ALREADY_ALLOCATED - 已配置 IP 位址。
- IP_NOT_IN_POOL - IP 位址不在 SNAT IP 集區中。
- IP_NOT_REALIZED - NSX 中發生錯誤。
- IP_POOL_EXHAUSTED - SNAT IP 集區已用盡。
- SNAT_PROCESS_FAILED - 發生未知錯誤。
為 TAS 應用程式設定 SNAT 集區
依預設,NCP 會為 TAS (Tanzu Application Service) 組織設定 SNAT IP。您可以透過使用包含 SNAT IP 集區資訊的
manifest.xml 建立應用程式,來為應用程式設定 SNAT IP。例如,
applications: - name: frontend memory: 32M disk_quota: 32M buildpack: go_buildpack env: GOPACKAGENAME: example-apps/cats-and-dogs/frontend NCP_SNAT_POOL: <external IP pool ID or name> ...
NCP 將針對此應用程式設定 SNAT 規則。規則的來源 IP 是執行個體的 IP 集合,規則的目的地 IP 是從外部 IP 集區配置的 SNAT IP。請注意下列事項:
- NCP_SNAT_POOL 所指定的集區應在推送應用程式之前已存在於 NSX 中。
- 應用程式的 SNAT 規則的優先順序高於組織的 SNAT 規則。
- 一個應用程式只能設定一個 SNAT IP。
- 您可以透過變更組態並再次推送應用程式,以變更為不同的 IP 集區。
為 TAS 第 3 版設定 SNAT
透過 TAS 第 3 版,您可以採用下列兩種方式中的一種來設定 SNAT:
- 建立應用程式時在 manifest.yml 中設定 NCP_SNAT_POOL。
例如,應用程式名為 bread,並且 manifest.yml 具有下列資訊:
applications: - name: bread stack: cflinuxfs2 random-route: true env: NCP_SNAT_POOL: AppSnatExternalIppool processes: - type: web disk_quota: 1024M instances: 2 memory: 512M health-check-type: port - type: worker disk_quota: 1024M health-check-type: process instances: 2 memory: 256M timeout: 15
執行下列命令:cf v3-push bread cf v3-apply-manifest -f manifest.yml cf v3-apps cf v3-restart bread
- 使用 cf v3-set-env 命令設定 NCP_SNAT_POOL。
執行下列命令 (假設應用程式名為 app3):
cf v3-set-env app3 NCP_SNAT_POOL AppSnatExternalIppool (optional) cf v3-stage app3 -package-guid <package-guid> (You can get package-guid with "cf v3-packages app3".) cf v3-restart app3
為 TAS 組織設定 SNAT IP 集區或 IP 位址
您可以使用下列註解來為 TAS 組織設定 SNAT IP 集區或 IP 位址:
- ncp_snat_pool - 集區必須存在,且具有標籤
scope: ncp/owner, tag: cluster:<cluster_name>
。 - ncp_snat_ip - IP 集區中的特定位址。
請注意下列事項:
- 如果同時指定了 ncp_snat_pool 和 ncp_snat_ip,則 SNAT IP 位址必須位於指定的 SNAT IP 集區中。
- 如果僅指定 ncp_snat_ip,則 SNAT IP 位址必須位於 ncp.ini 所指定的外部 IP 集區中。
- 如果僅指定 ncp_snat_pool,則會從指定的集區配置 SNAT IP 位址。
您可以使用
cf curl 命令為組織設定 SNAT IP。例如:
cf curl v3/organizations/<org-guid> -X PATCH -d '{"metadata": {"annotations": {"ncp_snat_pool": "ann-ip-pool", "ncp_snat_ip": "1.2.3.4"}}}'
您可以使用下列命令取得
org-guid:
cf org <org-name> --guid
您可以使用下列命令移除
ncp_snat_ip 註解:
cf curl v3/organizations/<org-guid> -X PATCH -d '{"metadata": {"annotations": {"ncp_snat_ip": null}}}'
您可以移至 NSX Manager UI,以確認是否已成功建立 SNAT 規則。若要檢查是否有錯誤,請查看 NCP 記錄。
如果您在 NCP 記錄中看到 POOL_ACCESS_DENIED 錯誤,則表示 ncp_snat_pool 所指定的 IP 集區沒有標籤 scope: ncp/owner, tag: cluster:<cluster_name>
,或集區的擁有者標籤不符合正在傳送配置要求的組織。在修正錯誤後,您必須重新啟動 NCP,或在移除 ncp_snat_pool 註解後重新加以新增。