Kontrollera utgående trafik för klusternoder i Azure Kubernetes Service (AKS)

Den här artikeln innehåller nödvändig information som gör att du kan skydda utgående trafik från din Azure Kubernetes Service (AKS). Den innehåller klusterkraven för en grundläggande AKS-distribution och ytterligare krav för valfria tillägg och funktioner. I slutet ges ett exempel på hur du konfigurerar dessa krav med Azure Firewall. Du kan dock använda den här informationen för alla metoder eller apparat för utgående begränsning.

Bakgrund

AKS-kluster distribueras i ett virtuellt nätverk. Det här nätverket kan hanteras (skapas av AKS) eller anpassat (förkonfigurerat av användaren i förväg). I båda fallen har klustret utgående beroenden av tjänster utanför det virtuella nätverket (tjänsten har inga inkommande beroenden).

För hantering och drift behöver noder i ett AKS-kluster komma åt vissa portar och fullständigt kvalificerade domännamn (FQDN). Dessa slutpunkter krävs för att noderna ska kunna kommunicera med API-servern eller för att ladda ned och installera kärnkomponenter för Kubernetes-kluster och nodsäkerhetsuppdateringar. Klustret måste till exempel hämta containeravbildningar för bassystem från Microsoft Container Registry (MCR).

De utgående AKS-beroendena är nästan helt definierade med FQDN, som inte har statiska adresser bakom sig. Bristen på statiska adresser innebär att nätverkssäkerhetsgrupper inte kan användas för att låsa utgående trafik från ett AKS-kluster.

Som standard har AKS-kluster obegränsad utgående (utgående) Internetåtkomst. Med den här nivån av nätverksåtkomst kan noder och tjänster som du kör komma åt externa resurser efter behov. Om du vill begränsa utgående trafik måste ett begränsat antal portar och adresser vara tillgängliga för att underhålla felfria klusterunderhållsuppgifter. Den enklaste lösningen för att skydda utgående adresser är att använda en brandväggsenhet som kan styra utgående trafik baserat på domännamn. Azure Firewall kan till exempel begränsa utgående HTTP- och HTTPS-trafik baserat på målets FQDN. Du kan också konfigurera dina önskade brandväggs- och säkerhetsregler för att tillåta dessa portar och adresser som krävs.

Viktigt

Det här dokumentet beskriver bara hur du låser trafiken som lämnar AKS-undernätet. AKS har inga krav på ingress som standard. Det finns inte stöd för att blockera intern undernätstrafik med nätverkssäkerhetsgrupper (NSG:er) och brandväggar. Om du vill styra och blockera trafiken i klustret använder du Nätverksprinciper.

Nödvändiga regler för utgående nätverk och FQDN för AKS-kluster

Följande nätverk och FQDN/programregler krävs för ett AKS-kluster. Du kan använda dem om du vill konfigurera en annan lösning än Azure Firewall.

  • IP-adressberoenden är för icke-HTTP/S-trafik (både TCP- och UDP-trafik)
  • FQDN HTTP/HTTPS-slutpunkter kan placeras i brandväggsenheten.
  • JOKERTECKEN HTTP/HTTPS-slutpunkter är beroenden som kan variera beroende på ditt AKS-kluster baserat på ett antal kvalificerare.
  • AKS använder en antagningskontrollant för att mata in FQDN som en miljövariabel till alla distributioner under kube-system och gatekeeper-system, som säkerställer att all systemkommunikation mellan noder och API-server använder API-serverns FQDN och inte API-serverns IP-adress.
  • Om du har en app eller lösning som behöver kommunicera med API-servern måste du lägga till ytterligare en nätverksregel som tillåter TCP-kommunikation till port 443 på API-serverns IP-adress.
  • Om det finns en underhållsåtgärd kan API-serverns IP-adress ändras i sällsynta fall. Planerade underhållsåtgärder som kan ändra API-serverns IP-adress förmedlas alltid i förväg.

Globala nätverksregler som krävs för Azure

De nödvändiga nätverksreglerna och IP-adressberoendena är:

Målslutpunkt Protokoll Port Användning
*:1194
Eller
ServiceTag - AzureCloud.<Region>:1194
Eller
Regionala CIDR - RegionCIDRs:1194
Eller
APIServerPublicIP:1194 (only known after cluster creation)
UDP 1194 För säker tunnelkommunikation mellan noderna och kontrollplanet. Detta krävs inte för privata kluster
*:9000
Eller
ServiceTag - AzureCloud.<Region>:9000
Eller
Regionala CIDR - RegionCIDRs:9000
Eller
APIServerPublicIP:9000 (only known after cluster creation)
TCP 9000 För säker tunnelkommunikation mellan noderna och kontrollplanet. Detta krävs inte för privata kluster
*:123 eller ntp.ubuntu.com:123 (om du använder Azure Firewall nätverksregler) UDP 123 Krävs för tidssynkronisering med NETWORK Time Protocol (NTP) på Linux-noder.
CustomDNSIP:53 (if using custom DNS servers) UDP 53 Om du använder anpassade DNS-servrar måste du se till att de är tillgängliga för klusternoderna.
APIServerPublicIP:443 (if running pods/deployments that access the API Server) TCP 443 Krävs om du kör poddar/distributioner som har åtkomst till API-servern. Dessa poddar/distributioner använder API-IP-adressen. Detta krävs inte för privata kluster

Azure Globala obligatoriska FQDN/programregler

Följande FQDN/programregler krävs:

Mål-FQDN Port Användning
*.hcp.<location>.azmk8s.io HTTPS:443 Krävs för Node <-> API-serverkommunikation. Ersätt <location> med den region där ditt AKS-kluster distribueras.
mcr.microsoft.com HTTPS:443 Krävs för att komma åt avbildningar Microsoft Container Registry (MCR). Det här registret innehåller bilder/diagram från första part (till exempel coreDNS osv.). Dessa avbildningar krävs för att klustret ska kunna skapas och fungera korrekt, inklusive åtgärder för skalning och uppgradering.
*.data.mcr.microsoft.com HTTPS:443 Krävs för MCR-lagring som backas upp av Azures nätverk för innehållsleverans (CDN).
management.azure.com HTTPS:443 Krävs för Kubernetes-åtgärder mot Azure-API:et.
login.microsoftonline.com HTTPS:443 Krävs för Azure Active Directory autentisering.
packages.microsoft.com HTTPS:443 Den här adressen är lagringsplatsen för Microsoft-paket som används för cachelagrade apt-get-åtgärder. Exempelpaket är Moby, PowerShell och Azure CLI.
acs-mirror.azureedge.net HTTPS:443 Den här adressen är till för den lagringsplats som krävs för att ladda ned och installera nödvändiga binärfiler som kubenet och Azure CNI.

Azure China 21Vianet nödvändiga nätverksregler

De nödvändiga nätverksreglerna och IP-adressberoendena är:

Målslutpunkt Protokoll Port Användning
*:1194
Eller
ServiceTag - AzureCloud.Region:1194
Eller
Regionala CIDR - RegionCIDRs:1194
Eller
APIServerPublicIP:1194 (only known after cluster creation)
UDP 1194 För säker tunnelkommunikation mellan noderna och kontrollplanet.
*:9000
Eller
ServiceTag - AzureCloud.<Region>:9000
Eller
Regionala CIDR - RegionCIDRs:9000
Eller
APIServerPublicIP:9000 (only known after cluster creation)
TCP 9000 För säker tunnelkommunikation mellan noderna och kontrollplanet.
*:22
Eller
ServiceTag - AzureCloud.<Region>:22
Eller
Regionala CIDR - RegionCIDRs:22
Eller
APIServerPublicIP:22 (only known after cluster creation)
TCP 22 För säker tunnelkommunikation mellan noderna och kontrollplanet.
*:123 eller ntp.ubuntu.com:123 (om du använder Azure Firewall nätverksregler) UDP 123 Krävs för tidssynkronisering med NETWORK Time Protocol (NTP) på Linux-noder.
CustomDNSIP:53 (if using custom DNS servers) UDP 53 Om du använder anpassade DNS-servrar måste du se till att de är tillgängliga för klusternoderna.
APIServerPublicIP:443 (if running pods/deployments that access the API Server) TCP 443 Krävs om du kör poddar/distributioner som har åtkomst till API-servern skulle dessa poddar/distributioner använda API-IP-adressen.

Azure China 21Vianet krävs FQDN/programregler

Följande FQDN/programregler krävs:

Mål-FQDN Port Användning
*.hcp.<location>.cx.prod.service.azk8s.cn HTTPS:443 Krävs för Node <-> API-serverkommunikation. Ersätt <location> med den region där ditt AKS-kluster distribueras.
*.tun.<location>.cx.prod.service.azk8s.cn HTTPS:443 Krävs för Node <-> API-serverkommunikation. Ersätt <location> med den region där ditt AKS-kluster distribueras.
mcr.microsoft.com HTTPS:443 Krävs för att komma åt avbildningar Microsoft Container Registry (MCR). Det här registret innehåller bilder/diagram från första part (till exempel coreDNS osv.). Dessa avbildningar krävs för att klustret ska kunna skapas och fungera korrekt, inklusive skalning och uppgradering.
.data.mcr.microsoft.com HTTPS:443 Krävs för MCR-lagring som backas upp av Azure Content Delivery Network (CDN).
management.chinacloudapi.cn HTTPS:443 Krävs för Kubernetes-åtgärder mot Azure-API:et.
login.chinacloudapi.cn HTTPS:443 Krävs för Azure Active Directory autentisering.
packages.microsoft.com HTTPS:443 Den här adressen är lagringsplatsen för Microsoft-paket som används för cachelagrade apt-get-åtgärder. Exempelpaket är Moby, PowerShell och Azure CLI.
*.azk8s.cn HTTPS:443 Den här adressen är till för den lagringsplats som krävs för att ladda ned och installera nödvändiga binärfiler som kubenet och Azure CNI.

Nätverksregler som krävs för Azure US Government

De nödvändiga nätverksreglerna och IP-adressberoendena är:

Målslutpunkt Protokoll Port Användning
*:1194
Eller
ServiceTag - AzureCloud.<Region>:1194
Eller
Regionala CIDR - RegionCIDRs:1194
Eller
APIServerPublicIP:1194 (only known after cluster creation)
UDP 1194 För säker tunnelkommunikation mellan noderna och kontrollplanet.
*:9000
Eller
ServiceTag - AzureCloud.<Region>:9000
Eller
Regionala CIDR - RegionCIDRs:9000
Eller
APIServerPublicIP:9000 (only known after cluster creation)
TCP 9000 För säker tunnelkommunikation mellan noderna och kontrollplanet.
*:123 eller ntp.ubuntu.com:123 (om du använder Azure Firewall nätverksregler) UDP 123 Krävs för tidssynkronisering med NETWORK Time Protocol (NTP) på Linux-noder.
CustomDNSIP:53 (if using custom DNS servers) UDP 53 Om du använder anpassade DNS-servrar måste du se till att de är tillgängliga för klusternoderna.
APIServerPublicIP:443 (if running pods/deployments that access the API Server) TCP 443 Krävs om du kör poddar/distributioner som har åtkomst till API-servern, skulle dessa poddar/distributioner använda API-IP-adressen.

Azure US Government krävs FQDN/programregler

Följande FQDN/programregler krävs:

Mål-FQDN Port Användning
*.hcp.<location>.cx.aks.containerservice.azure.us HTTPS:443 Krävs för Node <-> API-serverkommunikation. Ersätt <location> med den region där ditt AKS-kluster distribueras.
mcr.microsoft.com HTTPS:443 Krävs för att komma åt avbildningar Microsoft Container Registry (MCR). Det här registret innehåller bilder/diagram från första part (till exempel coreDNS osv.). Dessa avbildningar krävs för att klustret ska kunna skapas och fungera korrekt, inklusive skalning och uppgradering.
*.data.mcr.microsoft.com HTTPS:443 Krävs för MCR-lagring som backas upp av Azures nätverk för innehållsleverans (CDN).
management.usgovcloudapi.net HTTPS:443 Krävs för Kubernetes-åtgärder mot Azure-API:et.
login.microsoftonline.us HTTPS:443 Krävs för Azure Active Directory autentisering.
packages.microsoft.com HTTPS:443 Den här adressen är lagringsplatsen för Microsoft-paket som används för cachelagrade apt-get-åtgärder. Exempelpaket är Moby, PowerShell och Azure CLI.
acs-mirror.azureedge.net HTTPS:443 Den här adressen är till för den lagringsplats som krävs för att installera nödvändiga binärfiler som kubenet och Azure CNI.

Följande FQDN/programregler är valfria men rekommenderas för AKS-kluster:

Mål-FQDN Port Användning
security.ubuntu.com, azure.archive.ubuntu.com, changelogs.ubuntu.com HTTP:80 Med den här adressen kan Linux-klusternoderna ladda ned nödvändiga säkerhetskorrigeringar och uppdateringar.

Om du väljer att blockera/inte tillåta dessa FQDN får noderna endast os-uppdateringar när du uppgraderar en nodavbildning eller uppgraderar klustret.

GPU-aktiverade AKS-kluster

Obligatoriskt FQDN/programregler

Följande FQDN/programregler krävs för AKS-kluster som har GPU aktiverat:

Mål-FQDN Port Användning
nvidia.github.io HTTPS:443 Den här adressen används för korrekt drivrutinsinstallation och -åtgärd på GPU-baserade noder.
us.download.nvidia.com HTTPS:443 Den här adressen används för korrekt drivrutinsinstallation och -åtgärd på GPU-baserade noder.
apt.dockerproject.org HTTPS:443 Den här adressen används för korrekt drivrutinsinstallation och -åtgärd på GPU-baserade noder.

Windows serverbaserade nodpooler

Obligatoriskt FQDN/programregler

Följande FQDN/programregler krävs för att använda Windows serverbaserade nodpooler:

Mål-FQDN Port Användning
onegetcdn.azureedge.net, go.microsoft.com HTTPS:443 Installera Windows-relaterade binärfiler
*.mp.microsoft.com, www.msftconnecttest.com, ctldl.windowsupdate.com HTTP:80 Installera Windows-relaterade binärfiler

AKS-tillägg och integreringar

Azure Monitor för containrar

Det finns två alternativ för att ge åtkomst till Azure Monitor för containrar. Du kan tillåta Azure Monitor ServiceTag eller ge åtkomst till de FQDN/programregler som krävs.

Nätverksregler som krävs

Följande FQDN/programregler krävs:

Målslutpunkt Protokoll Port Användning
ServiceTag - AzureMonitor:443 TCP 443 Den här slutpunkten används för att skicka måttdata och loggar till Azure Monitor och Log Analytics.

Obligatoriskt FQDN/programregler

Följande FQDN/programregler krävs för AKS-kluster som har Azure Monitor för containrar aktiverade:

FQDN Port Användning
dc.services.visualstudio.com HTTPS:443 Den här slutpunkten används för mått och övervakning av telemetri med hjälp av Azure Monitor.
*.ods.opinsights.azure.com HTTPS:443 Den här slutpunkten används av Azure Monitor för att mata in Log Analytics-data.
*.oms.opinsights.azure.com HTTPS:443 Den här slutpunkten används av omsagent, som används för att autentisera Log Analytics-tjänsten.
*.monitoring.azure.com HTTPS:443 Den här slutpunkten används för att skicka måttdata till Azure Monitor.

Azure Policy

Obligatoriskt FQDN/programregler

Följande FQDN/programregler krävs för AKS-kluster som har Azure Policy aktiverat.

FQDN Port Användning
data.policy.core.windows.net HTTPS:443 Den här adressen används för att hämta Kubernetes-principerna och rapportera klusterefterlevnadsstatus till principtjänsten.
store.policy.core.windows.net HTTPS:443 Den här adressen används för att hämta Gatekeeper-artefakter för inbyggda principer.
dc.services.visualstudio.com HTTPS:443 Azure Policy-tillägg som skickar telemetridata till slutpunkten för Programinsikter.

Azure China 21Vianet krävs FQDN/programregler

Följande FQDN/programregler krävs för AKS-kluster som har Azure Policy aktiverat.

FQDN Port Användning
data.policy.azure.cn HTTPS:443 Den här adressen används för att hämta Kubernetes-principerna och rapportera klusterefterlevnadsstatus till principtjänsten.
store.policy.azure.cn HTTPS:443 Den här adressen används för att hämta Gatekeeper-artefakter för inbyggda principer.

FQDN/programregler som krävs för Azure US Government

Följande FQDN/programregler krävs för AKS-kluster som har Azure Policy aktiverat.

FQDN Port Användning
data.policy.azure.us HTTPS:443 Den här adressen används för att hämta Kubernetes-principerna och rapportera klusterefterlevnadsstatus till principtjänsten.
store.policy.azure.us HTTPS:443 Den här adressen används för att hämta Gatekeeper-artefakter för inbyggda principer.

Klustertillägg

Obligatoriskt FQDN/programregler

Följande FQDN/programregler krävs för att använda klustertillägg på AKS-kluster.

FQDN Port Användning
<region>.dp.kubernetesconfiguration.azure.com HTTPS:443 Den här adressen används för att hämta konfigurationsinformation från tjänsten Klustertillägg och rapportera tilläggets status till tjänsten.
mcr.microsoft.com, *.data.mcr.microsoft.com HTTPS:443 Den här adressen krävs för att hämta containeravbildningar för installation av klustertilläggsagenter på AKS-kluster.

FQDN/programregler som krävs för Azure US Government

Följande FQDN/programregler krävs för att använda klustertillägg på AKS-kluster.

FQDN Port Användning
<region>.dp.kubernetesconfiguration.azure.us HTTPS:443 Den här adressen används för att hämta konfigurationsinformation från tjänsten Klustertillägg och rapportera tilläggets status till tjänsten.
mcr.microsoft.com, *.data.mcr.microsoft.com HTTPS:443 Den här adressen krävs för att hämta containeravbildningar för installation av klustertilläggsagenter på AKS-kluster.

Begränsa utgående trafik med Hjälp av Azure Firewall

Azure Firewall innehåller en FQDN-tagg () Azure Kubernetes Service ( ) för AzureKubernetesService att förenkla den här konfigurationen.

Anteckning

FQDN-taggen innehåller alla FQDN som anges ovan och hålls automatiskt uppdaterad.

Vi rekommenderar att du har minst 20 IP-adresser för Azure Firewall för produktionsscenarier för att undvika problem med SNAT-portutmattning.

Nedan visas ett exempel på en arkitektur för distributionen:

Låst topologi

  • Offentlig ingress tvingas att flöda genom brandväggsfilter
    • AKS-agentnoder är isolerade i ett dedikerat undernät.
    • Azure Firewall distribueras i ett eget undernät.
    • En DNAT-regel översätter den offentliga IP-adressen för den privata datorn till LB-ip-adressen för frontend.
  • Utgående begäranden startar från agentnoder till Azure Firewall interna IP-adressen med hjälp av en användardefinierad väg
    • Begäranden från AKS-agentnoder följer en UDR som har placerats i det undernät som AKS-klustret distribuerades till.
    • Azure Firewall ut från det virtuella nätverket från en offentlig IP-server
    • Åtkomst till det offentliga Internet eller andra Azure-tjänster flödar till och från brandväggens IP-adress på frontend-sidan
    • Alternativt kan åtkomst till AKS-kontrollplanet skyddas av API-servernsauktoriserade IP-intervall , vilket inkluderar brandväggens offentliga IP-adress på serversidan.
  • Intern trafik
    • Alternativt kan du i stället eller förutom en offentlig Load Balancer använda en intern Load Balancer för intern trafik, som du även kan isolera i sitt eget undernät.

Stegen nedan använder FQDN-taggen för Azure Firewall för att begränsa utgående trafik från AKS-klustret och ge ett exempel på hur du konfigurerar offentlig inkommande trafik AzureKubernetesService via brandväggen.

Ange konfiguration via miljövariabler

Definiera en uppsättning miljövariabler som ska användas i resursskapande.

PREFIX="aks-egress"
RG="${PREFIX}-rg"
LOC="eastus"
PLUGIN=azure
AKSNAME="${PREFIX}"
VNET_NAME="${PREFIX}-vnet"
AKSSUBNET_NAME="aks-subnet"
# DO NOT CHANGE FWSUBNET_NAME - This is currently a requirement for Azure Firewall.
FWSUBNET_NAME="AzureFirewallSubnet"
FWNAME="${PREFIX}-fw"
FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
FWIPCONFIG_NAME="${PREFIX}-fwconfig"
FWROUTE_TABLE_NAME="${PREFIX}-fwrt"
FWROUTE_NAME="${PREFIX}-fwrn"
FWROUTE_NAME_INTERNET="${PREFIX}-fwinternet"

Skapa ett virtuellt nätverk med flera undernät

Etablera ett virtuellt nätverk med två separata undernät, ett för klustret, ett för brandväggen. Du kan också skapa en för intern tjänstingress.

Tom nätverkstopologi

Skapa en resursgrupp som ska innehålla alla resurser.

# Create Resource Group

az group create --name $RG --location $LOC

Skapa ett virtuellt nätverk med två undernät som värd för AKS-klustret och Azure Firewall. Var och en har sitt eget undernät. Vi börjar med AKS-nätverket.

# Dedicated virtual network with AKS subnet

az network vnet create \
    --resource-group $RG \
    --name $VNET_NAME \
    --location $LOC \
    --address-prefixes 10.42.0.0/16 \
    --subnet-name $AKSSUBNET_NAME \
    --subnet-prefix 10.42.1.0/24

# Dedicated subnet for Azure Firewall (Firewall name cannot be changed)

az network vnet subnet create \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $FWSUBNET_NAME \
    --address-prefix 10.42.2.0/24

Skapa och konfigurera en Azure Firewall med en UDR

Azure Firewall regler för inkommande och utgående måste konfigureras. Det huvudsakliga syftet med brandväggen är att göra det möjligt för organisationer att konfigurera detaljerade regler för in- och utgående trafik till och från AKS-klustret.

Brandvägg och UDR

Viktigt

Om ditt kluster eller program skapar ett stort antal utgående anslutningar som dirigeras till samma eller en liten delmängd mål kan du behöva fler IP-adresser för brandväggen för att undvika att portarna per ip-adress i serversidan maxas. Mer information om hur du skapar en Azure-brandvägg med flera IP-adresser finns här

Skapa en offentlig IP-standardresurs för SKU:n som ska användas Azure Firewall på datorn.

az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"

Registrera cli-tillägget preview för att skapa en Azure Firewall.

# Install Azure Firewall preview CLI extension

az extension add --name azure-firewall

# Deploy Azure Firewall

az network firewall create -g $RG -n $FWNAME -l $LOC --enable-dns-proxy true

IP-adressen som skapades tidigare kan nu tilldelas till brandväggens frontend.

Anteckning

Det kan ta några minuter att konfigurera den offentliga IP Azure Firewall adressen. Om du vill använda FQDN i nätverksregler måste DNS-proxyn vara aktiverad. När brandväggen är aktiverad lyssnar den på port 53 och vidarebefordrar DNS-begäranden till DNS-servern som anges ovan. Detta gör att brandväggen kan översätta detta FQDN automatiskt.

# Configure Firewall IP Config

az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME

När föregående kommando har lyckats sparar du brandväggens IP-adress på serversidan för konfiguration senare.

# Capture Firewall IP Address for Later Use

FWPUBLIC_IP=$(az network public-ip show -g $RG -n $FWPUBLICIP_NAME --query "ipAddress" -o tsv)
FWPRIVATE_IP=$(az network firewall show -g $RG -n $FWNAME --query "ipConfigurations[0].privateIpAddress" -o tsv)

Anteckning

Om du använder säker åtkomst till AKS API-servern med auktoriserade IP-adressintervall måste du lägga till brandväggens offentliga IP-adress i det auktoriserade IP-intervallet.

Skapa en UDR med ett hopp till Azure Firewall

Azure dirigerar automatiskt trafik mellan Azure-undernät, virtuella nätverk och lokala nätverk. Om du vill ändra någon av Azures standardroutning gör du det genom att skapa en routningstabell.

Skapa en tom vägtabell som ska associeras med ett visst undernät. Vägtabellen definierar nästa hopp som den Azure Firewall skapade ovan. Varje undernät kan ha noll eller en associerad routningstabell.

# Create UDR and add a route for Azure Firewall

az network route-table create -g $RG -l $LOC --name $FWROUTE_TABLE_NAME
az network route-table route create -g $RG --name $FWROUTE_NAME --route-table-name $FWROUTE_TABLE_NAME --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address $FWPRIVATE_IP
az network route-table route create -g $RG --name $FWROUTE_NAME_INTERNET --route-table-name $FWROUTE_TABLE_NAME --address-prefix $FWPUBLIC_IP/32 --next-hop-type Internet

Läs dokumentationen om virtuell nätverksvägtabell om hur du kan åsidosätta Azures standardsystemvägar eller lägga till ytterligare vägar i ett undernäts vägtabell.

Lägga till brandväggsregler

Nedan visas tre nätverksregler som du kan använda för att konfigurera i brandväggen. Du kan behöva anpassa dessa regler baserat på din distribution. Den första regeln tillåter åtkomst till port 9000 via TCP. Den andra regeln tillåter åtkomst till port 1194 och 123 via UDP (om du distribuerar till Azure China 21Vianet kan du behöva mer). Båda dessa regler tillåter endast trafik till den Azure-region-CIDR som vi använder, i det här fallet USA, östra. Slutligen lägger vi till en tredje nätverksregel som öppnar port 123 till FQDN via UDP (att lägga till ett FQDN som en nätverksregel är en av de specifika funktionerna i Azure Firewall och du måste anpassa det när du använder dina ntp.ubuntu.com egna alternativ).

När du har lagt till nätverksregler lägger vi även till en programregel med som omfattar alla nödvändiga FQDN som är tillgängliga via AzureKubernetesService TCP-port 443 och port 80.

# Add FW Network Rules

az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apiudp' --protocols 'UDP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 1194 --action allow --priority 100
az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apitcp' --protocols 'TCP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 9000
az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'time' --protocols 'UDP' --source-addresses '*' --destination-fqdns 'ntp.ubuntu.com' --destination-ports 123

# Add FW Application Rules

az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'fqdn' --source-addresses '*' --protocols 'http=80' 'https=443' --fqdn-tags "AzureKubernetesService" --action allow --priority 100

Mer Azure Firewall tjänsten finns i Azure Firewall dokumentationen.

Associera vägtabellen med AKS

Om du vill associera klustret med brandväggen måste det dedikerade undernätet för klustrets undernät referera till den vägtabell som skapades ovan. Association kan göras genom att utfärda ett kommando till det virtuella nätverket som innehåller både klustret och brandväggen för att uppdatera vägtabellen för klustrets undernät.

# Associate route table with next hop to Firewall to the AKS subnet

az network vnet subnet update -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --route-table $FWROUTE_TABLE_NAME

Distribuera AKS med utgående typ av UDR till det befintliga nätverket

Nu kan ett AKS-kluster distribueras till det befintliga virtuella nätverket. Vi använder även userDefinedRouting utgående typ . Den här funktionen säkerställer att all utgående trafik tvingas genom brandväggen och att inga andra utgående sökvägar finns (som standard Load Balancer utgående typ kan användas).

aks-deploy

Skapa ett huvudnamn för tjänsten med åtkomst till etablering i det befintliga virtuella nätverket

En klusteridentitet (hanterad identitet eller tjänstens huvudnamn) används av AKS för att skapa klusterresurser. Ett huvudnamn för tjänsten som skickas vid tidpunkten för att skapa används för att skapa underliggande AKS-resurser som Storage-resurser, IP-adresser och lastbalanserare som används av AKS (du kan också använda en hanterad identitet i stället). Om du inte har beviljats lämpliga behörigheter nedan kan du inte etablera AKS-klustret.

# Create SP and Assign Permission to Virtual Network

az ad sp create-for-rbac -n "${PREFIX}sp"

Ersätt nu och APPID nedan PASSWORD med appid för tjänstens huvudnamn och lösenordet för tjänstens huvudnamn som genererades automatiskt av föregående kommandoutdata. Vi refererar till VNET-resurs-ID:t för att bevilja behörigheter till tjänstens huvudnamn så att AKS kan distribuera resurser till det.

APPID="<SERVICE_PRINCIPAL_APPID_GOES_HERE>"
PASSWORD="<SERVICEPRINCIPAL_PASSWORD_GOES_HERE>"
VNETID=$(az network vnet show -g $RG --name $VNET_NAME --query id -o tsv)

# Assign SP Permission to VNET

az role assignment create --assignee $APPID --scope $VNETID --role "Network Contributor"

Du kan kontrollera de detaljerade behörigheter som krävs här.

Anteckning

Om du använder plugin-programmet kubenet måste du ge AKS-tjänstens huvudnamn eller hanterade identitet behörigheter till den förskapade routningstabellen, eftersom kubenet kräver en routningstabell för att lägga till neccesary-routningsregler.

RTID=$(az network route-table show -g $RG -n $FWROUTE_TABLE_NAME --query id -o tsv)
az role assignment create --assignee $APPID --scope $RTID --role "Network Contributor"

Distribuera AKS

Slutligen kan AKS-klustret distribueras till det befintliga undernät som vi har dedikerat för klustret. Målundernätet som ska distribueras till definieras med miljövariabeln $SUBNETID . Vi har inte definierat $SUBNETID variabeln i föregående steg. Om du vill ange värdet för undernäts-ID:t kan du använda följande kommando:

SUBNETID=$(az network vnet subnet show -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --query id -o tsv)

Du definierar den utgående typen för att använda den UDR som redan finns i undernätet. Med den här konfigurationen kan AKS hoppa över installationen och IP-etableringen för lastbalanseraren.

Viktigt

Mer information om utgående typ av UDR, inklusive begränsningar, finns i utgående utgående typ UDR.

Tips

Ytterligare funktioner kan läggas till i klusterdistributionen, till exempel privat kluster.

AKS-funktionen för API-server-auktoriserade IP-intervall kan läggas till för att begränsa API-serveråtkomst till endast brandväggens offentliga slutpunkt. Funktionen för auktoriserade IP-intervall betecknas i diagrammet som valfri. När du aktiverar funktionen för auktoriserat IP-intervall för att begränsa API-serveråtkomsten måste utvecklarverktygen använda en jumpbox från brandväggens virtuella nätverk, eller så måste du lägga till alla slutpunkter för utvecklare i det auktoriserade IP-intervallet.

az aks create -g $RG -n $AKSNAME -l $LOC \
  --node-count 3 --generate-ssh-keys \
  --network-plugin $PLUGIN \
  --outbound-type userDefinedRouting \
  --service-cidr 10.41.0.0/16 \
  --dns-service-ip 10.41.0.10 \
  --docker-bridge-address 172.17.0.1/16 \
  --vnet-subnet-id $SUBNETID \
  --service-principal $APPID \
  --client-secret $PASSWORD \
  --api-server-authorized-ip-ranges $FWPUBLIC_IP

Aktivera utvecklaråtkomst till API-servern

Om du använde auktoriserade IP-intervall för klustret i föregående steg måste du lägga till dina IP-adresser för utvecklingsverktyg i AKS-klusterlistan över godkända IP-intervall för att få åtkomst till API-servern därifrån. Ett annat alternativ är att konfigurera en jumpbox med nödvändiga verktyg i ett separat undernät i brandväggens virtuella nätverk.

Lägg till ytterligare en IP-adress i godkända intervall med följande kommando

# Retrieve your IP address
CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)

# Add to AKS approved list
az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32

Använd kommandot [az aks get-credentials][az-aks-get-credentials] för att konfigurera för att ansluta till ditt nyligen skapade kubectl Kubernetes-kluster.

az aks get-credentials -g $RG -n $AKSNAME

Distribuera en offentlig tjänst

Nu kan du börja exponera tjänster och distribuera program till det här klustret. I det här exemplet exponerar vi en offentlig tjänst, men du kan också välja att exponera en intern tjänst via den interna lastbalanseraren.

Public Service DNAT

Distribuera appen Azure Voting genom att kopiera yaml nedan till en fil med namnet example.yaml .

# voting-storage-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: voting-storage
spec:
  replicas: 1
  selector:
    matchLabels:
      app: voting-storage
  template:
    metadata:
      labels:
        app: voting-storage
    spec:
      containers:
      - name: voting-storage
        image: mcr.microsoft.com/aks/samples/voting/storage:2.0
        args: ["--ignore-db-dir=lost+found"]
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: voting-storage-secret
              key: MYSQL_ROOT_PASSWORD
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: voting-storage-secret
              key: MYSQL_USER
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: voting-storage-secret
              key: MYSQL_PASSWORD
        - name: MYSQL_DATABASE
          valueFrom:
            secretKeyRef:
              name: voting-storage-secret
              key: MYSQL_DATABASE
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
---
# voting-storage-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: voting-storage-secret
type: Opaque
data:
  MYSQL_USER: ZGJ1c2Vy
  MYSQL_PASSWORD: UGFzc3dvcmQxMg==
  MYSQL_DATABASE: YXp1cmV2b3Rl
  MYSQL_ROOT_PASSWORD: UGFzc3dvcmQxMg==
---
# voting-storage-pv-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
# voting-storage-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: voting-storage
  labels: 
    app: voting-storage
spec:
  ports:
  - port: 3306
    name: mysql
  selector:
    app: voting-storage
---
# voting-app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: voting-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: voting-app
  template:
    metadata:
      labels:
        app: voting-app
    spec:
      containers:
      - name: voting-app
        image: mcr.microsoft.com/aks/samples/voting/app:2.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: http
        env:
        - name: MYSQL_HOST
          value: "voting-storage"
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: voting-storage-secret
              key: MYSQL_USER
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: voting-storage-secret
              key: MYSQL_PASSWORD
        - name: MYSQL_DATABASE
          valueFrom:
            secretKeyRef:
              name: voting-storage-secret
              key: MYSQL_DATABASE
        - name: ANALYTICS_HOST
          value: "voting-analytics"
---
# voting-app-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: voting-app
  labels: 
    app: voting-app
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
    name: http
  selector:
    app: voting-app
---
# voting-analytics-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: voting-analytics
spec:
  replicas: 1
  selector:
    matchLabels:
      app: voting-analytics
      version: "2.0"
  template:
    metadata:
      labels:
        app: voting-analytics
        version: "2.0"
    spec:
      containers:
      - name: voting-analytics
        image: mcr.microsoft.com/aks/samples/voting/analytics:2.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: http
        env:
        - name: MYSQL_HOST
          value: "voting-storage"
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: voting-storage-secret
              key: MYSQL_USER
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: voting-storage-secret
              key: MYSQL_PASSWORD
        - name: MYSQL_DATABASE
          valueFrom:
            secretKeyRef:
              name: voting-storage-secret
              key: MYSQL_DATABASE
---
# voting-analytics-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: voting-analytics
  labels: 
    app: voting-analytics
spec:
  ports:
  - port: 8080
    name: http
  selector:
    app: voting-analytics

Distribuera tjänsten genom att köra:

kubectl apply -f example.yaml

Lägga till en DNAT-regel för att Azure Firewall

Viktigt

När du använder Azure Firewall för att begränsa utgående trafik och skapa en användardefinierad väg (UDR) för att tvinga all utgående trafik, se till att du skapar en lämplig DNAT-regel i brandväggen för att tillåta ingresstrafik korrekt. Om Azure Firewall med en UDR bryts ingresskonfigurationen på grund av asymmetrisk routning. (Problemet uppstår om AKS-undernätet har en standardväg som går till brandväggens privata IP-adress, men du använder en offentlig lastbalanserare – ingress- eller Kubernetes-tjänst av typen: LoadBalancer). I det här fallet tas den inkommande lastbalanseringstrafiken emot via dess offentliga IP-adress, men returvägen går genom brandväggens privata IP-adress. Eftersom brandväggen är tillståndsfull ignorerar den det returnerade paketet eftersom brandväggen inte känner till en upprättad session. Information om hur du integrerar Azure Firewall med din ingress eller tjänstlastbalanserare finns i Integrera Azure Firewall med Azure Standard Load Balancer.

För att konfigurera inkommande anslutningar måste en DNAT-regel skrivas till Azure Firewall. För att testa anslutningen till klustret definieras en regel för brandväggens offentliga IP-adress på serversidan som dirigeras till den interna IP-adress som exponeras av den interna tjänsten.

Måladressen kan anpassas eftersom det är porten i brandväggen som ska nås. Den översatta adressen måste vara IP-adressen för den interna lastbalanseraren. Den översatta porten måste vara den exponerade porten för Kubernetes-tjänsten.

Du måste ange den interna IP-adressen som tilldelats till lastbalanseraren som skapas av Kubernetes-tjänsten. Hämta adressen genom att köra:

kubectl get services

IP-adressen som behövs visas i kolumnen EXTERNAL-IP, ungefär så här.

NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes         ClusterIP      10.41.0.1       <none>        443/TCP        10h
voting-analytics   ClusterIP      10.41.88.129    <none>        8080/TCP       9m
voting-app         LoadBalancer   10.41.185.82    20.39.18.6    80:32718/TCP   9m
voting-storage     ClusterIP      10.41.221.201   <none>        3306/TCP       9m

Hämta tjänstens IP-adress genom att köra:

SERVICE_IP=$(kubectl get svc voting-app -o jsonpath='{.status.loadBalancer.ingress[*].ip}')

Lägg till NAT-regeln genom att köra:

az network firewall nat-rule create --collection-name exampleset --destination-addresses $FWPUBLIC_IP --destination-ports 80 --firewall-name $FWNAME --name inboundrule --protocols Any --resource-group $RG --source-addresses '*' --translated-port 80 --action Dnat --priority 100 --translated-address $SERVICE_IP

Validera anslutningen

Gå till Azure Firewall IP-adress i en webbläsare för att verifiera anslutningen.

Du bör se AKS-röstningsappen. I det här exemplet var brandväggens offentliga IP-adress 52.253.228.132 .

Skärmbild som visar A K S-röstningsappen med knappar för katter, hundar och återställning och summor.

Rensa resurser

Om du vill rensa Azure-resurser tar du bort AKS-resursgruppen.

az group delete -g $RG

Nästa steg

I den här artikeln har du lärt dig vilka portar och adresser som ska tillåtas om du vill begränsa utgående trafik för klustret. Du har också sett hur du skyddar din utgående trafik med hjälp av Azure Firewall.

Om det behövs kan du generalisera stegen ovan för att vidarebefordra trafiken till din önskade utgående lösning genom att följa dokumentationen för utgående userDefinedRoute typ.

Om du vill begränsa hur poddar kommunicerar mellan sig själva och East-West trafikbegränsningar i klustret kan du se Skydda trafik mellan poddar med nätverksprinciper i AKS.