在 Azure Kubernetes Service 中使用執行個體層級公用 IP (AKS)

AKS 節點不需要使用自己的公用 IP 位址來進行通訊。 不過,案例可能需要節點集區中的節點來接收自己的專用公用 IP 位址。 常見的案例是遊戲工作負載,其中主控台需要直接連線至雲端虛擬機器,以將躍點降到最低。 此情況可透過使用節點公用 IP 在 AKS 上實現。

首先,建立新的資源群組。

az group create --name myResourceGroup2 --location eastus

建立新的 AKS 叢集,並連結節點的公用 IP。 節點集區中的每個節點會收到唯一的公用 IP。 您可以藉由查看虛擬機器擴展集執行個體來確認這一點。

az aks create -g MyResourceGroup2 -n MyManagedCluster -l eastus  --enable-node-public-ip

針對現有的 AKS 叢集,您也可以新增節點集區,並為節點連結公用 IP。

az aks nodepool add -g MyResourceGroup2 --cluster-name MyManagedCluster -n nodepool2 --enable-node-public-ip

使用公用 IP 首碼

使用公用 IP 首碼有許多優點。 建立新叢集或新增節點集區時,AKS 支援藉由使用旗標 node-public-ip-prefix 來傳遞資源識別碼,以針對您的節點使用現有公用 IP 首碼的位址。

首先,使用 az network public-ip prefix create 建立公用 IP 首碼:

az network public-ip prefix create --length 28 --location eastus --name MyPublicIPPrefix --resource-group MyResourceGroup3

檢視輸出,並為首碼記下 id

{
  ...
  "id": "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup3/providers/Microsoft.Network/publicIPPrefixes/MyPublicIPPrefix",
  ...
}

最後,建立新的叢集或新增節點集區時,請使用 旗標 node-public-ip-prefix,並傳入首碼的資源識別碼:

az aks create -g MyResourceGroup3 -n MyManagedCluster -l eastus --enable-node-public-ip --node-public-ip-prefix /subscriptions/<subscription-id>/resourcegroups/MyResourceGroup3/providers/Microsoft.Network/publicIPPrefixes/MyPublicIPPrefix

尋找節點的公用 IP

您可以透過各種方式找出節點的公用 IP:

重要

節點資源群組包含節點及其公用 IP。 執行命令以尋找節點的公用 IP 時,請使用節點資源群組。

az vmss list-instance-public-ips -g MC_MyResourceGroup2_MyManagedCluster_eastus -n YourVirtualMachineScaleSetName

在節點公用IP上使用公用IP標籤

可以在節點公用 IP 上使用公用 IP 標籤,以利用 Azure 路由喜好設定功能。

需求

  • 需要 AKS 1.24 版 (或更高版本)。

使用路由喜好設定網際網路建立新的叢集

az aks create -n <clusterName> -l <location> -g <resourceGroup> \
  --enable-node-public-ip \
  --node-public-ip-tags RoutingPreference=Internet

新增具有路由喜好設定網際網路的節點集區

az aks nodepool add --cluster-name <clusterName> -n <nodepoolName> -l <location> -g <resourceGroup> \
  --enable-node-public-ip \
  --node-public-ip-tags RoutingPreference=Internet

允許主機埠連線,並將節點集區新增至應用程式安全組

若 AKS 節點使用的節點公用 IP 在其主機位址上裝載服務,則這些 AKS 節點需要新增一條 NSG 規則以允許這種流量。 若是在節點集區組態中新增所需的連接埠,則將會在叢集網路安全組中建立恰當的允許規則。

如果網路安全組所處的子網路中包含一個使用自備虛擬網路的叢集,則必須在該網路安全組中新增一條允許規則。 將節點集區新增至 應用程式安全組 (ASG),便可將其限製為指定節點集區中的節點。 如果指定允許的主機連接埠,預設會在受控資源群組中建立受控 ASG。 還可以透過以下方式將節點新增至一或多個自定義 ASG:在節點集區參數中指定 NSG 的資源識別碼。

主機連接埠規格格式

指定允許的連接埠清單時,請使用逗號分隔清單,並且項目必須採用 port/protocolstartPort-endPort/protocol 格式。

範例:

  • 80/tcp
  • 80/tcp,443/tcp
  • 53/udp,80/tcp
  • 50000-60000/tcp

需求

  • 需要 AKS 1.24 版 (或更高版本)。

使用允許的連接埠和應用程式安全組建立新的叢集

az aks create \
  --resource-group <resourceGroup> \
  --name <clusterName> \
  --nodepool-name <nodepoolName> \
  --nodepool-allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp\
  --nodepool-asg-ids "<asgId>,<asgId>"

新增一個包含允許的連接埠和應用程式安全組的節點集區

  --resource-group <resourceGroup> \
  --cluster-name <clusterName> \
  --name <nodepoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

更新節點集區所允許的連接埠和應用程式安全組

  --resource-group <resourceGroup> \
  --cluster-name <clusterName> \
  --name <nodepoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

自動指定 Pod 工作負載的主機連接埠 (預覽)

在節點上設定公用 IP 時,利用主機連接埠可允許 Pod 直接接收流量,而無需設定負載平衡器服務。 這一特性在遊戲等案例中特別有益,在此類案例中,由於常見主機名的玩家配對服務可以提供正確的主機和埠,因此節點 IP 和連接埠的短暫性並不是問題。 不過,由於主機上只能有一個流程可以接聽同一個連接埠,因此若是將應用程式與主機連接埠一起使用,則可能會導致排程出現問題。 為了避免此問題,AKS 提供了如下功能來防止衝突:在排程時讓系統動態指派可用的連接埠。

警告

Pod 主機連接埠流量將會遭到叢集上預設 NSG 規則的封鎖。 使用這項功能時,應同時允許節點集區上的主機連接埠,這樣才能允許流量通過。

重要

AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

需求

  • 需要 AKS 1.24 版 (或更高版本)。

註冊 'PodHostPortAutoAssignPreview' 功能旗標

使用 az feature register 命令以註冊 PodHostPortAutoAssignPreview 功能旗標,如下列範例所示:

az feature register --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"

狀態需要幾分鐘的時間才會顯示「已註冊」。 使用 az feature show 命令以驗證註冊狀態:

az feature show --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"

當狀態顯示為 [已註冊] 時,請使用 az provider register 命令重新整理 Microsoft.ContainerService 資源提供者的註冊:

az provider register --namespace Microsoft.ContainerService

自動將主機連接埠指派給 Pod

要觸發主機連接埠自動指派,可直接部署工作負載,不需要包含任何主機連接埠,並使用需要主機連接埠指派的連接埠清單套用 kubernetes.azure.com/assign-hostports-for-containerports 批注。 批註的值應該指定為逗號分隔的專案清單,例如 port/protocol,其中連接埠是 Pod 規格中定義的個別連接埠號碼,且通訊協定是 tcpudp

連接埠的指派範圍是 40000-59999,而且在叢集之間是唯一的。 指派的連接埠也會新增至 Pod 內的環境變數,讓應用程式可以判斷已指派的連接埠。 環境變數名稱的格式如下:<deployment name>_PORT_<port number>_<protocol>_HOSTPORT (參閱以下範例),因此範例為 mydeployment_PORT_8080_TCP_HOSTPORT: 41932

以下是 echoserver 部署範例,其中顯示連接埠 8080 和 8443 的主機連接埠對應:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver-hostport
  labels:
    app: echoserver-hostport
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echoserver-hostport
  template:
    metadata:
      annotations:
        kubernetes.azure.com/assign-hostports-for-containerports: 8080/tcp,8443/tcp
      labels:
        app: echoserver-hostport
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: echoserver-hostport
          image: k8s.gcr.io/echoserver:1.10
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            - name: https
              containerPort: 8443
              protocol: TCP

套用部署後,hostPort 項目會位於個別 Pod 的 YAML 中:

$ kubectl describe pod echoserver-hostport-75dc8d8855-4gjfc
<cut for brevity>
Containers:
  echoserver-hostport:
    Container ID:   containerd://d0b75198afe0612091f412ee7cf7473f26c80660143a96b459b3e699ebaee54c
    Image:          k8s.gcr.io/echoserver:1.10
    Image ID:       k8s.gcr.io/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229                                                                                                      Ports:          8080/TCP, 8443/TCP
    Host Ports:     46645/TCP, 49482/TCP
    State:          Running
      Started:      Thu, 12 Jan 2023 18:02:50 +0000
    Ready:          True
    Restart Count:  0
    Environment:
      echoserver-hostport_PORT_8443_TCP_HOSTPORT:  49482
      echoserver-hostport_PORT_8080_TCP_HOSTPORT:  46645

下一步