限制 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_poolncp_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 註解後重新加以新增。