Zabezpečení provozu mezi pody pomocí zásad sítě v AKS
Při spouštění moderních aplikací založených na mikroslužbách v Kubernetes často chcete řídit, které komponenty spolu můžou vzájemně komunikovat. Princip nejnižšího oprávnění by se měl použít na to, jak může provoz přecházet mezi pody v clusteru Azure Kubernetes Service (AKS). Řekněme, že chcete blokovat provoz přímo do back-endových aplikací. Funkce zásad sítě v Kubernetes umožňuje definovat pravidla pro příchozí a výchozí provoz mezi pody v clusteru.
V tomto článku se dozvíte, jak nainstalovat modul zásad sítě a vytvořit zásady sítě Kubernetes pro řízení toku provozu mezi pody v AKS. Zásady sítě se dají použít pro uzly a pody založené na Linuxu nebo Windows v AKS.
Přehled zásad sítě
Ve výchozím nastavení můžou všechny pody v clusteru AKS odesílat a přijímat provoz bez omezení. Pokud chcete zlepšit zabezpečení, můžete definovat pravidla, která řídí tok provozu. Back-endové aplikace jsou často přístupné jenom požadovaným front-endovým službám, například. Nebo jsou databázové komponenty přístupné jenom pro aplikační vrstvy, které se k nim připojují.
Zásady sítě jsou specifikace Kubernetes, která definuje zásady přístupu pro komunikaci mezi pody. Při použití zásad sítě definujete uspořádanou sadu pravidel pro odesílání a příjem provozu. Pravidla použijete u kolekce podů, které odpovídají jednomu nebo více selektorům popisků.
Pravidla zásad sítě jsou definována jako manifesty YAML. Zásady sítě je možné zahrnout jako součást širšího manifestu, který také vytvoří nasazení nebo službu.
Možnosti zásad sítě v AKS
Azure poskytuje tři moduly zásad sítě pro vynucování zásad sítě:
- Cilium pro clustery AKS, které používají Azure CNI Powered by Cilium.
- Azure Network Policy Manager.
- Calico, opensourcové řešení zabezpečení sítě a sítě, které založil Tigera.
Cilium je náš doporučený modul síťových zásad. Cilium vynucuje síťové zásady provozu pomocí filtru paketů BPF (Linux Berkeley Packet Filter), což je obecně efektivnější než "IPTables". Další podrobnosti najdete v dokumentaci ke službě Azure CNI Powered by Cilium.
K vynucování zadaných zásad používá Azure Network Policy Manager pro Linux tabulky IPTables pro Linux. Azure Network Policy Manager pro Windows používá ACLPolicies (Host Network Service) (HNS). Zásady se přeloží na sady povolených a zakázaných párů IP adres. Tyto páry se pak naprogramují jako IPTable
pravidla nebo HNS ACLPolicy
filtrují.
Rozdíly mezi moduly zásad sítě: Cilium, Azure NPM a Calico
Schopnost | Azure Network Policy Manager | Kaliko | Řasa |
---|---|---|---|
Podporované platformy | Linux, Windows Server 2022 (Preview). | Linux, Windows Server 2019 a 2022. | Linux |
Podporované možnosti sítí | Azure Container Networking Interface (CNI). | Azure CNI (Linux, Windows Server 2019 a 2022) a kubenet (Linux). | Azure CNI. |
Dodržování předpisů se specifikací Kubernetes | Všechny podporované typy zásad | Podporují se všechny typy zásad. | Podporují se všechny typy zásad. |
Další funkce | Nezaokrouhlovat. | Rozšířený model zásad skládající se z globálních zásad sítě, globální sady sítí a koncového bodu hostitele. Další informace o použití rozhraní příkazového calicoctl řádku ke správě těchto rozšířených funkcí najdete v referenčních informacích o uživatelích calicoctl. |
Nezaokrouhlovat. |
Technická podpora | Podporuje ho tým podpory a technického týmu Azure. | Podporuje ho tým podpory a technického týmu Azure. | Podporuje ho tým podpory a technického týmu Azure. |
Omezení Azure Network Policy Manageru
Poznámka:
Azure NPM pro Linux neumožňuje škálování nad 250 uzlů a 20 000 podů. Pokud se pokusíte škálovat nad rámec těchto limitů, může docházet k chybám typu Nedostatek paměti (OOM ). Pro lepší škálovatelnost a podporu protokolu IPv6 a pokud se jedná o následující omezení, doporučujeme použít nebo upgradovat na Azure CNI Powered by Cilium, aby jako modul zásad sítě používal Cilium .
Azure NPM nepodporuje protokol IPv6. Jinak plně podporuje specifikace zásad sítě v Linuxu.
Azure NPM ve Windows nepodporuje následující funkce specifikací zásad sítě:
- Pojmenované porty
- SCTP (Stream Control Transmission Protocol).
- Záporný popisek shody nebo selektory oboru názvů Například všechny popisky s výjimkou
debug=true
. except
bloky CIDR (classless interdomain routing) (CIDR s výjimkami).
Poznámka:
Protokoly podů Azure Network Policy Manageru zaznamenávají chybu, pokud se vytvoří nepodporované zásady sítě.
Úpravy nebo odstraňování zásad sítě
V některých výjimečných případech existuje šance, že dojde k dosažení konfliktu časování, který může vést k dočasnému neočekávanému připojení nových připojení k nebo z podů na všech ovlivněných uzlech při úpravách nebo odstranění "dostatečně velkých" zásad sítě. Dosažení tohoto stavu časování nikdy nebude mít vliv na aktivní připojení.
Pokud u uzlu dojde k tomuto stavu časování, pod Azure NPM na tomto uzlu přejde do stavu, ve kterém nemůže aktualizovat pravidla zabezpečení, což může vést k neočekávanému připojení nových připojení k ovlivněným uzlům nebo z podů. Pokud chcete tento problém zmírnit, pod Azure NPM se po vstupu do tohoto stavu automaticky restartuje přibližně 15 sekund. Zatímco se Azure NPM restartuje na ovlivněný uzel, odstraní všechna pravidla zabezpečení a pak znovu zopakuje pravidla zabezpečení pro všechny zásady sítě. I když se všechna pravidla zabezpečení znovu používají, existuje možnost dočasného neočekávaného připojení pro nová připojení k ovlivněným uzlu nebo z podů.
Pokud chcete omezit pravděpodobnost dosažení tohoto stavu časování, můžete zmenšit velikost zásad sítě. K tomuto problému pravděpodobně dojde u zásad sítě s několika ipBlock
částmi. U zásad sítě se čtyřmi nebo méně ipBlock
částmi je méně pravděpodobné, že se problém týká.
Než začnete
Potřebujete nainstalovanou a nakonfigurovanou verzi Azure CLI 2.0.61 nebo novější. Verzi zjistíte spuštěním příkazu az --version
. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.
Vytvoření clusteru AKS a povolení zásad sítě
Pokud chcete zobrazit zásady sítě v akci, vytvořte cluster AKS, který podporuje zásady sítě, a pak pracujete na přidávání zásad.
Pokud chcete použít Azure Network Policy Manager, musíte použít modul plug-in Azure CNI. Calico se dá použít s modulem plug-in Azure CNI nebo s modulem plug-in Kubenet CNI.
Následující ukázkový skript vytvoří cluster AKS s identitou přiřazenou systémem a povolí síťové zásady pomocí Azure Network Policy Manageru.
Poznámka:
Calico lze použít s --network-plugin azure
parametry nebo --network-plugin kubenet
parametry.
Místo použití identity přiřazené systémem můžete použít také identitu přiřazenou uživatelem. Další informace najdete v tématu Použití spravovaných identit.
Vytvoření clusteru AKS s povoleným Azure Network Policy Managerem – jenom Linux
V této části vytvoříte cluster s fondy uzlů Linuxu a povolenou službou Azure Network Policy Manager.
Začnete tím, že nahradíte hodnoty pro proměnné$RESOURCE_GROUP_NAME
.$CLUSTER_NAME
$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$LOCATION=canadaeast
Vytvořte cluster AKS a zadejte azure
pro network-plugin
network-policy
K vytvoření clusteru použijte následující příkaz:
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--network-plugin azure \
--network-policy azure \
--generate-ssh-keys
Vytvoření clusteru AKS s povolenou službou Azure Network Policy Manager – Windows Server 2022 (Preview)
V této části vytvoříte cluster s fondy uzlů Windows a povolenou službou Azure Network Policy Manager.
Poznámka:
Azure Network Policy Manager s uzly Windows je k dispozici jenom v systému Windows Server 2022.
Instalace rozšíření Azure CLI aks-Preview
Důležité
Funkce AKS ve verzi Preview jsou k dispozici na samoobslužné bázi. Verze Preview jsou poskytovány "tak, jak jsou" a "dostupné", a jsou vyloučené ze smluv o úrovni služeb a omezené záruky. Verze Preview AKS jsou částečně pokryty zákaznickou podporou na základě maximálního úsilí. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:
Pokud chcete rozšíření nainstalovat aks-preview
, spusťte následující příkaz:
az extension add --name aks-preview
Pokud chcete aktualizovat na nejnovější verzi vydaného rozšíření, spusťte následující příkaz:
az extension update --name aks-preview
Registrace příznaku funkce WindowsNetworkPolicyPreview
WindowsNetworkPolicyPreview
Příznak funkce zaregistrujte pomocí příkazu az feature register, jak je znázorněno v následujícím příkladu:
az feature register --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"
Zobrazení stavu Zaregistrované trvá několik minut. Pomocí příkazu az feature show ověřte stav registrace:
az feature show --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"
Pokud se stav projeví jako zaregistrovaný, aktualizujte registraci Microsoft.ContainerService
poskytovatele prostředků pomocí příkazu az provider register :
az provider register --namespace Microsoft.ContainerService
Vytvoření clusteru AKS
Nyní nahradíte hodnoty pro $RESOURCE_GROUP_NAME
$CLUSTER_NAME
, a $WINDOWS_USERNAME
proměnné.
$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$WINDOWS_USERNAME=myWindowsUserName
$LOCATION=canadaeast
Vytvořte uživatelské jméno, které se použije jako přihlašovací údaje správce pro kontejnery Windows Serveru v clusteru. Následující příkaz vás vyzve k zadání uživatelského jména. Nastavte ho na $WINDOWS_USERNAME
. Nezapomeňte, že příkazy v tomto článku se zadávají do prostředí Bash.
echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
K vytvoření clusteru použijte následující příkaz:
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--windows-admin-username $WINDOWS_USERNAME \
--network-plugin azure \
--network-policy azure \
--generate-ssh-keys
Vytvoření clusteru bude trvat několik minut. Ve výchozím nastavení se cluster vytvoří pouze s fondem uzlů Linuxu. Pokud chcete používat fondy uzlů Windows, můžete ho přidat. Tady je příklad:
az aks nodepool add \
--resource-group $RESOURCE_GROUP_NAME \
--cluster-name $CLUSTER_NAME \
--os-type Windows \
--name npwin \
--node-count 1
Vytvoření clusteru AKS s povoleným Calico
Vytvořte cluster AKS a zadejte --network-plugin azure
a --network-policy calico
. Určení --network-policy calico
povolí Calico ve fondech uzlů Linuxu i Windows.
Pokud plánujete do clusteru přidat fondy uzlů Windows, uveďte windows-admin-username
parametry, windows-admin-password
které splňují požadavky na heslo Windows Serveru.
Důležité
V tuto chvíli je použití zásad sítě Calico s uzly Windows dostupné v nových clusterech pomocí Kubernetes verze 1.20 nebo novější s Calico 3.17.2 a vyžaduje, abyste používali sítě Azure CNI. Uzly Windows v clusterech AKS s povoleným Calico mají ve výchozím nastavení také povolenou plovoucí IP adresu.
U clusterů s pouze fondy uzlů s Linuxem, na kterých běží Kubernetes 1.20 se staršími verzemi Calico, se verze Calico automaticky upgraduje na verzi 3.17.2.
Vytvořte uživatelské jméno, které se použije jako přihlašovací údaje správce pro kontejnery Windows Serveru v clusteru. Následující příkaz vás vyzve k zadání uživatelského jména. Nastavte ho na $WINDOWS_USERNAME
. Nezapomeňte, že příkazy v tomto článku se zadávají do prostředí Bash.
echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--windows-admin-username $WINDOWS_USERNAME \
--network-plugin azure \
--network-policy calico \
--generate-ssh-keys
Vytvoření clusteru bude trvat několik minut. Ve výchozím nastavení se cluster vytvoří pouze s fondem uzlů Linuxu. Pokud chcete používat fondy uzlů Windows, můžete ho přidat. Příklad:
az aks nodepool add \
--resource-group $RESOURCE_GROUP_NAME \
--cluster-name $CLUSTER_NAME \
--os-type Windows \
--name npwin \
--node-count 1
Instalace Azure Network Policy Manageru nebo Calico v existujícím clusteru
Instalace Azure Network Policy Manageru nebo Calico na existující clustery AKS je také podporovaná.
Upozorňující
Procesupgraduho systému aktivuje, aby se každý fond uzlů znovu zopakoval. Upgrade jednotlivých fondů uzlů není podporován samostatně. V rámci každého fondu uzlů se uzly znovu image sledují stejným procesem jako ve standardní operaci upgradu verze Kubernetes, kdy se dočasně přidají uzly vyrovnávací paměti, aby se minimalizovalo přerušení spuštěných aplikací, zatímco probíhá proces opětovného vytváření imagí uzlů. Všechny výpadky, ke kterým může dojít, se proto podobají tomu, co byste očekávali při upgradu image uzlu nebo operaci upgradu verze Kubernetes.
Příklad příkazu pro instalaci Azure Network Policy Manageru:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy azure
Příklad příkazu pro instalaci Calico:
Upozorňující
Toto upozornění platí pro upgrade clusterů Kubenet s podporou Calico na překrytí Azure CNI s povoleným Calico.
- V clusterech Kubenet s povoleným Calico se Calico používá jako CNI i síťový modul zásad.
- V clusterech Azure CNI se Calico používá jenom pro vynucování zásad sítě, ne jako CNI. To může způsobit krátkou prodlevu mezi spuštěním podu a tím, že Calico povolí odchozí provoz z podu.
Doporučuje se místo Calico používat Cilium, abyste se tomuto problému vyhnuli. Další informace o Cilium na webu Azure CNI Powered by Cilium
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy calico
Upgrade existujícího clusteru s nainstalovaným Azure NPM nebo Calico na Azure CNI s využitím Cilium
Pokud chcete upgradovat existující cluster s nainstalovaným modulem Network Policy engine na Azure CNI Powered by Cilium, přečtěte si téma Upgrade existujícího clusteru na Azure CNI Powered by Cilium.
Ověření nastavení zásad sítě
Až bude cluster připravený, nakonfigurujte kubectl
připojení ke clusteru Kubernetes pomocí příkazu az aks get-credentials . Tento příkaz stáhne přihlašovací údaje a nakonfiguruje rozhraní příkazového řádku Kubernetes tak, aby je používalo:
az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
Pokud chcete začít ověřovat zásady sítě, vytvoříte ukázkovou aplikaci a nastavíte pravidla provozu.
Nejprve vytvořte obor názvů volaný demo
pro spuštění ukázkových podů:
kubectl create namespace demo
Nyní vytvořte dva pody v clusteru s názvem client
a server
.
Poznámka:
Pokud chcete naplánovat klienta nebo server na konkrétním uzlu, přidejte následující bit před --command
argument v příkazu kubectl spuštění příkazu kubectl vytvoření podu:
--overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux|windows"}}}'
Vytvořte server
pod. Tento pod slouží na portu TCP 80:
kubectl run server -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --labels="app=server" --port=80 --command -- /agnhost serve-hostname --tcp --http=false --port "80"
Vytvořte client
pod. Následující příkaz spustí Bash na podu client
:
kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --command -- bash
Teď v samostatném okně spusťte následující příkaz pro získání IP adresy serveru:
kubectl get pod --output=wide -n demo
Výstup by měl vypadat takto:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
server 1/1 Running 0 30s 10.224.0.72 akswin22000001 <none> <none>
Testování připojení bez zásad sítě
Spuštěním následujícího příkazu v prostředí klienta ověřte připojení k serveru. Nahraďte server-ip
pomocí IP adresy nalezené ve výstupu spuštění předchozího příkazu. Pokud je připojení úspěšné, neexistuje žádný výstup.
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Testování připojení pomocí zásad sítě
Pokud chcete přidat zásady sítě, vytvořte soubor s názvem demo-policy.yaml
a vložte následující manifest YAML:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: demo-policy
namespace: demo
spec:
podSelector:
matchLabels:
app: server
ingress:
- from:
- podSelector:
matchLabels:
app: client
ports:
- port: 80
protocol: TCP
Zadejte název manifestu YAML a použijte ho pomocí příkazu kubectl apply:
kubectl apply –f demo-policy.yaml
Teď v prostředí klienta ověřte připojení k serveru spuštěním následujícího /agnhost
příkazu:
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Připojení k provozu je blokováno, protože server je označený app=server
, ale klient není označený. Předchozí příkaz connect vrátí tento výstup:
TIMEOUT
Spuštěním následujícího příkazu označte client
a ověřte připojení k serveru. Výstup by neměl vracet nic.
kubectl label pod client -n demo app=client
Odinstalace Azure Network Policy Manageru nebo Calico
Požadavky:
- Azure CLI verze 2.63 nebo novější
Poznámka:
- Proces odinstalace neodebere vlastní definice prostředků (CRD) a vlastní prostředky (CRS), které používá Calico. Všechny tyto identifikátory CRD a žádosti o přijetí změn mají názvy končící na "projectcalico.org" nebo "tigera.io". Tyto identifikátory CRD a přidružené CRS je možné ručně odstranit po úspěšné odinstalaci Calico (odstranění crd před odebráním Calico přeruší cluster).
- Upgrade neodebere žádné prostředky NetworkPolicy v clusteru, ale po odinstalaci se tyto zásady už nevynucují.
Upozorňující
Procesupgraduho systému aktivuje, aby se každý fond uzlů znovu zopakoval. Upgrade jednotlivých fondů uzlů není podporován samostatně. Jakékoli přerušení sítě clusteru se podobá upgradu image uzlu nebo upgradu verze Kubernetes, kde je každý uzel ve fondu uzlů znovu image.
Pokud chcete z clusteru odebrat Azure Network Policy Manager nebo Calico, spusťte následující příkaz:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy none
Vyčištění prostředků
V tomto článku jste vytvořili obor názvů a dva pody a použili zásady sítě. Pokud chcete tyto prostředky vyčistit, použijte příkaz kubectl delete a zadejte název prostředku:
kubectl delete namespace demo
Další kroky
Další informace o síťových prostředcích najdete v tématu Koncepty sítě pro aplikace ve službě Azure Kubernetes Service (AKS).
Azure Kubernetes Service