在 Azure Kubernetes Service 中使用執行個體層級公用 IP (AKS)
AKS 節點不需要使用自己的公用 IP 位址來進行通訊。 不過,案例可能需要節點集區中的節點來接收自己的專用公用 IP 位址。 常見的案例是遊戲工作負載,其中主控台需要直接連線至雲端虛擬機器,以將躍點降到最低。 此情況可透過使用節點公用 IP 在 AKS 上實現。
首先,建立新的資源群組。
az group create --name <resourceGroup> --location <region>
建立新的 AKS 叢集,並連結節點的公用 IP。 節點集區中的每個節點會收到唯一的公用 IP。 您可以藉由查看虛擬機器擴展集執行個體來確認這一點。
az aks create \
--resource-group <resourceGroup> \
--name <aksClusterName> \
--location <region> \
--enable-node-public-ip \
--generate-ssh-keys
針對現有的 AKS 叢集,您也可以新增節點集區,並為節點連結公用 IP。
az aks nodepool add --resource-group <resourceGroup> --cluster-name <aksClusterName> --name <newNodePool> --enable-node-public-ip
使用公用 IP 首碼
使用公用 IP 首碼有許多優點。 建立新叢集或新增節點集區時,AKS 支援藉由使用旗標 --node-public-ip-prefix-id
來傳遞資源識別碼,以針對您的節點使用現有公用 IP 首碼的位址。
首先,使用 az network public-ip prefix create 建立公用 IP 首碼:
az network public-ip prefix create --length 28 --location <region> --name <publicIPPrefixName> --resource-group <resourceGroup>
檢視輸出,並為首碼記下 id
:
{
...
"id": "/subscriptions/<subscription-id>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/publicIPPrefixes/<publicIPPrefixName>",
...
}
最後,建立新的叢集或新增節點集區時,請使用 旗標 --node-public-ip-prefix-id
,並傳入首碼的資源識別碼:
az aks create \
--resource-group <resourceGroup> \
--name <aksClusterName> \
--location <region> \
--enable-node-public-ip \
--node-public-ip-prefix-id /subscriptions/<subscription-id>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/publicIPPrefixes/<publicIPPrefixName> \
--generate-ssh-keys
尋找節點的公用 IP
您可以透過各種方式找出節點的公用 IP:
- 使用 Azure CLI 命令
az vmss list-instance-public-ips
。 - 使用 PowerShell 或 Bash 命令。
- 您也可以檢視虛擬機器擴展集中的執行個體,以檢視 Azure 入口網站中的公用 IP。
重要
節點資源群組包含節點及其公用 IP。 執行命令以尋找節點的公用 IP 時,請使用節點資源群組。
az vmss list-instance-public-ips --resource-group <MC_region_aksClusterName_region> --name <virtualMachineScaleSetName>
在節點公用 IP 上使用公用 IP 標籤
可以在節點公用 IP 上使用公用 IP 標籤,以利用 Azure 路由喜好設定功能。
需求
- 需要 AKS 1.29 版或更新版本。
使用路由喜好設定網際網路建立新的叢集
az aks create \
--name <aksClusterName> \
--location <region> \
--resource-group <resourceGroup> \
--enable-node-public-ip \
--node-public-ip-tags RoutingPreference=Internet \
--generate-ssh-keys
新增具有路由喜好設定網際網路的節點集區
az aks nodepool add --cluster-name <aksClusterName> \
--name <nodePoolName> \
--location <region> \
--resource-group <resourceGroup> \
--enable-node-public-ip \
--node-public-ip-tags RoutingPreference=Internet
允許主機連接埠連線,並將節點集區新增至應用程式安全組
若 AKS 節點使用的節點公用 IP 在其主機位址上裝載服務,則這些 AKS 節點需要新增一條 NSG 規則以允許這種流量。 若是在節點集區組態中新增所需的連接埠,則將會在叢集網路安全組中建立恰當的允許規則。
如果網路安全組所處的子網路中包含一個使用自備虛擬網路的叢集,則必須在該網路安全組中新增一條允許規則。 將節點集區新增至 應用程式安全組 (ASG),便可將其限製為指定節點集區中的節點。 如果指定允許的主機連接埠,預設會在受控資源群組中建立受控 ASG。 還可以透過以下方式將節點新增至一或多個自定義 ASG:在節點集區參數中指定 NSG 的資源識別碼。
主機連接埠規格格式
指定允許的連接埠清單時,請使用逗號分隔清單,並且項目必須採用 port/protocol
或 startPort-endPort/protocol
格式。
範例:
- 80/tcp
- 80/tcp,443/tcp
- 53/udp,80/tcp
- 50000-60000/tcp
需求
- 需要 AKS 1.29 版或更新版本。
使用允許的連接埠和應用程式安全組建立新的叢集
az aks create \
--resource-group <resourceGroup> \
--name <aksClusterName> \
--nodepool-name <nodePoolName> \
--nodepool-allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp\
--nodepool-asg-ids "<asgId>,<asgId>" \
--generate-ssh-keys
新增一個包含允許的連接埠和應用程式安全組的節點集區
az aks nodepool add \
--resource-group <resourceGroup> \
--cluster-name <aksClusterName> \
--name <nodePoolName> \
--allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
--asg-ids "<asgId>,<asgId>"
更新節點集區所允許的連接埠和應用程式安全組
az aks nodepool update \
--resource-group <resourceGroup> \
--cluster-name <aksClusterName> \
--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.29 版或更新版本。
註冊 '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 規格中定義的個別連接埠號碼,且通訊協定是 tcp
或 udp
。
連接埠的指派範圍是 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