A podok közötti forgalom védelme hálózati szabályzatok használatával az AKS-ben
Amikor modern, mikroszolgáltatás-alapú alkalmazásokat futtat a Kubernetesben, gyakran szeretné szabályozni, hogy mely összetevők kommunikálhatnak egymással. A minimális jogosultság elvét kell alkalmazni arra, hogy a forgalom hogyan haladhat a podok között az Azure Kubernetes Service-fürtökben. Tegyük fel, hogy közvetlenül a háttéralkalmazások felé szeretné blokkolni a forgalmat. A Kubernetes hálózati házirend-funkciója lehetővé teszi a fürt podjai közötti bejövő és kimenő forgalom szabályainak meghatározását.
Ez a cikk bemutatja, hogyan telepítheti a hálózati házirendmotort, és hogyan hozhat létre Kubernetes hálózati házirendeket a podok közötti forgalom szabályozásához az AKS-ben. A hálózati házirendek linuxos vagy Windows-alapú csomópontokhoz és podokhoz használhatók az AKS-ben.
A hálózati házirend áttekintése
Az AKS-fürtök összes podja alapértelmezés szerint korlátozás nélkül küldhet és fogadhat forgalmat. A biztonság javítása érdekében olyan szabályokat határozhat meg, amelyek szabályozzák a forgalom áramlását. A háttéralkalmazások gyakran csak a szükséges előtér-szolgáltatásoknak vannak kitéve, például. Vagy az adatbázis-összetevők csak a hozzájuk csatlakozó alkalmazásszintekhez érhetők el.
A hálózati házirend egy Kubernetes-specifikáció, amely hozzáférési szabályzatokat határoz meg a podok közötti kommunikációhoz. Hálózati házirendek használata esetén a forgalom küldésére és fogadására vonatkozó szabályok rendezett készletét határozza meg. A szabályokat egy vagy több címkeválasztónak megfelelő podok gyűjteményére alkalmazza.
A hálózati házirend-szabályok YAML-jegyzékként vannak definiálva. A hálózati szabályzatok egy szélesebb jegyzék részeként is szerepelhetnek, amely üzembe helyezést vagy szolgáltatást is létrehoz.
Hálózati házirend beállításai az AKS-ben
Az Azure három hálózati házirend-motort biztosít a hálózati szabályzatok kikényszerítéséhez:
- Cilium az Azure CNI Powered by Ciliumot használó AKS-fürtökhöz.
- Azure Network Policy Manager.
- Calico, egy nyílt forráskódú hálózati és hálózati biztonsági megoldás, amelyet Tigera alapított.
A Cilium az ajánlott hálózati házirend-motorunk. A Cilium a Linux Berkeley Packet Filter (BPF) használatával kényszeríti ki a forgalomra vonatkozó hálózati szabályzatot, amely általában hatékonyabb, mint az "IPTables". További részleteket az Azure CNI Powered by Cilium dokumentációjában talál.
A megadott szabályzatok kényszerítéséhez a Linuxhoz készült Azure Network Policy Manager Linux IPTables-t használ. A Windowshoz készült Azure Network Policy Manager gazdagéphálózati szolgáltatás (HNS) ACLPolicies szolgáltatást használ. Egy szabályzat az engedélyezett és tiltott IP-címpárok halmazára van lefordítva. Ezek a párok ezután szabályokként IPTable
vannak programozva vagy HNS ACLPolicy
szűrve.
A hálózati házirend motorjai közötti különbségek: Cilium, Azure NPM és Calico
Funkció | Azure Network Policy Manager | Calico | Cilium |
---|---|---|---|
Támogatott platformok | Linux, Windows Server 2022 (előzetes verzió). | Linux, Windows Server 2019 és 2022. | Linux. |
Támogatott hálózatkezelési lehetőségek | Azure Container Networking Interface (CNI). | Azure CNI (Linux, Windows Server 2019 és 2022) és kubenet (Linux). | Azure CNI. |
A Kubernetes specifikációnak való megfelelés | Minden támogatott házirendtípus | Minden szabályzattípus támogatott. | Minden szabályzattípus támogatott. |
Egyéb jellemzők | Nincs. | Kiterjesztett szabályzatmodell, amely globális hálózati házirendből, globális hálózatkészletből és gazdagépvégpontból áll. További információ arról, hogy a parancssori calicoctl felület használatával kezelheti ezeket a kiterjesztett funkciókat, lásd a calicoctl felhasználói referenciáját. |
Nincs. |
Támogatás | Az Azure támogatási és mérnöki csapata támogatja. | Az Azure támogatási és mérnöki csapata támogatja. | Az Azure támogatási és mérnöki csapata támogatja. |
Az Azure Network Policy Manager korlátozásai
Feljegyzés
A Linuxhoz készült Azure NPM-ben nem engedélyezzük a 250 csomóponton és 20 000 podon túli skálázást. Ha túllépi ezeket a korlátokat, előfordulhat, hogy memóriahiányos (OOM-) hibákat tapasztal. A jobb méretezhetőség és az IPv6-támogatás érdekében, és ha az alábbi korlátozások aggodalomra adnak okot, javasoljuk, hogy a Cilium által üzemeltetett Azure CNI-t használja vagy frissítsen a Cilium hálózati házirendmotorként való használatára.
Az Azure NPM nem támogatja az IPv6-ot. Ellenkező esetben teljes mértékben támogatja a linuxos hálózati házirendek specifikációit.
Windows rendszerben az Azure NPM nem támogatja a hálózati házirend-specifikációk alábbi funkcióit:
- Elnevezett portok.
- Stream Control Transmission Protocol (SCTP).
- Negatív egyezés címkéje vagy névtérválasztói. Például az összes címke kivételével
debug=true
. except
osztály nélküli tartományközi útválasztási (CIDR) blokkok (CIDR kivételekkel).
Feljegyzés
Az Azure Network Policy Manager podnaplói hibát rögzítenek, ha nem támogatott hálózati szabályzat jön létre.
Hálózati házirendek szerkesztése/törlése
Bizonyos ritka esetekben fennáll annak az esélye, hogy olyan versenyállapotba ütközik, amely ideiglenes, váratlan kapcsolódást eredményezhet az érintett csomópontokon lévő podok közötti vagy onnan érkező új kapcsolatokhoz egy "elég nagy" hálózati házirend szerkesztésekor vagy törlésekor. Ha ezt a versenyhelyzetet eléri, az nem befolyásolja az aktív kapcsolatokat.
Ha ez a versenyfeltétel egy csomópont esetében jelentkezik, a csomópontOn lévő Azure NPM-pod olyan állapotba kerül, amelyben nem tudja frissíteni a biztonsági szabályokat, ami váratlan kapcsolódáshoz vezethet az érintett csomópont podjaival való új kapcsolatokhoz. A probléma megoldásához az Azure NPM-pod az állapot megadása után ~15 másodperccel automatikusan újraindul. Miközben az Azure NPM újraindul az érintett csomóponton, törli az összes biztonsági szabályt, majd újra alkalmazza az összes hálózati házirendre vonatkozó biztonsági szabályokat. Bár az összes biztonsági szabály újraalkalmazása folyamatban van, előfordulhat, hogy az érintett csomópont podjaihoz vagy podjaihoz való új kapcsolatok ideiglenes, váratlan kapcsolatot létesítenek.
A versenyfeltétel elérésének esélyének csökkentése érdekében csökkentheti a hálózati szabályzat méretét. Ez a probléma valószínűleg több ipBlock
szakaszból álló hálózati szabályzat esetén fordul elő. A négy vagy kevesebb ipBlock
szakaszból álló hálózati házirendek kisebb valószínűséggel kerülnek a problémába.
Mielőtt elkezdené
Telepítenie és konfigurálnia kell az Azure CLI 2.0.61-es vagy újabb verzióját. A verzió azonosításához futtassa a következőt: az --version
. Ha telepíteni vagy frissíteni szeretne: Az Azure CLI telepítése.
AKS-fürt létrehozása és hálózati szabályzat engedélyezése
A hálózati szabályzatok működés közbeni megtekintéséhez hozzon létre egy hálózati házirendet támogató AKS-fürtöt, majd dolgozzon a szabályzatok hozzáadásán.
Az Azure Network Policy Manager használatához az Azure CNI beépülő modult kell használnia. A Calico az Azure CNI beépülő modullal vagy a Kubenet CNI beépülő modullal is használható.
Az alábbi példaszkript egy rendszer által hozzárendelt identitással rendelkező AKS-fürtöt hoz létre, és engedélyezi a hálózati szabályzatot az Azure Network Policy Manager használatával.
Feljegyzés
A Calico használható a paraméterekkel vagy --network-plugin kubenet
a --network-plugin azure
paraméterekkel.
Rendszer által hozzárendelt identitás használata helyett felhasználó által hozzárendelt identitást is használhat. További információ: Felügyelt identitások használata.
AKS-fürt létrehozása engedélyezett Azure Network Policy Managerrel – csak Linux
Ebben a szakaszban linuxos csomópontkészletekkel rendelkező fürtöt hoz létre, és engedélyezve van az Azure Network Policy Manager.
Első lépésként cserélje le a változók és $CLUSTER_NAME
a $RESOURCE_GROUP_NAME
változók értékeit.
$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$LOCATION=canadaeast
Hozza létre az AKS-fürtöt, és adja meg azure
az és network-policy
a network-plugin
.
Fürt létrehozásához használja a következő parancsot:
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--network-plugin azure \
--network-policy azure \
--generate-ssh-keys
AKS-fürt létrehozása engedélyezett Azure Network Policy Managerrel – Windows Server 2022 (előzetes verzió)
Ebben a szakaszban olyan fürtöt hoz létre, amelyben a Windows-csomópontkészletek és az Azure Network Policy Manager engedélyezve van.
Feljegyzés
A Windows-csomópontokkal rendelkező Azure Network Policy Manager csak Windows Server 2022 rendszeren érhető el.
Az aks-preview Azure CLI-bővítmény telepítése
Fontos
Az AKS előzetes verziójú funkciói önkiszolgáló, opt-in alapon érhetők el. Az előzetes verziókat "ahogy van" és "rendelkezésre állóként" biztosítjuk, és a szolgáltatási szerződésekből és a korlátozott jótállásból kizárjuk őket. Az AKS előzetes verzióit részben az ügyfélszolgálat fedezi a legjobb munkamennyiség alapján. Ezért ezek a funkciók nem éles használatra vannak szánva. További információkért tekintse meg az alábbi támogatási cikkeket:
A aks-preview
bővítmény telepítéséhez futtassa a következő parancsot:
az extension add --name aks-preview
A bővítmény legújabb verziójára való frissítéshez futtassa a következő parancsot:
az extension update --name aks-preview
A WindowsNetworkPolicyPreview funkciójelző regisztrálása
Regisztrálja a WindowsNetworkPolicyPreview
funkciójelzőt az az feature register paranccsal, ahogyan az az alábbi példában látható:
az feature register --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"
Néhány percig tart, amíg az állapot megjelenik a Regisztrált állapotban. Ellenőrizze a regisztrációs állapotot az az feature show paranccsal:
az feature show --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"
Ha az állapot a Regisztrált állapotot tükrözi, frissítse az erőforrás-szolgáltató regisztrációját az Microsoft.ContainerService
az provider register paranccsal:
az provider register --namespace Microsoft.ContainerService
Az AKS-fürt létrehozása
Most cserélje le a , $CLUSTER_NAME
és $WINDOWS_USERNAME
változók $RESOURCE_GROUP_NAME
értékeit.
$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$WINDOWS_USERNAME=myWindowsUserName
$LOCATION=canadaeast
Hozzon létre egy felhasználónevet rendszergazdai hitelesítő adatokként a fürtön lévő Windows Server-tárolókhoz. Az alábbi parancs egy felhasználónév megadását kéri. Állítsa be a következőre $WINDOWS_USERNAME
: . Ne feledje, hogy a cikkben szereplő parancsok egy Bash-rendszerhéjba kerülnek.
echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
Fürt létrehozásához használja a következő parancsot:
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
A fürt létrehozása néhány percet vesz igénybe. Alapértelmezés szerint a fürt csak Linux-csomópontkészlettel jön létre. Ha Windows-csomópontkészleteket szeretne használni, felvehet egyet. Példa:
az aks nodepool add \
--resource-group $RESOURCE_GROUP_NAME \
--cluster-name $CLUSTER_NAME \
--os-type Windows \
--name npwin \
--node-count 1
AKS-fürt létrehozása a Calico engedélyezésével
Hozza létre az AKS-fürtöt, és adja meg --network-plugin azure
az és --network-policy calico
a . A beállítás --network-policy calico
lehetővé teszi a Calico használatát Linux- és Windows-csomópontkészleteken is.
Ha Windows-csomópontkészleteket szeretne hozzáadni a fürthöz, adja meg a windows-admin-username
Windows Server jelszókövetelményeinek megfelelő paramétereket és windows-admin-password
paramétereket.
Fontos
Jelenleg a Calico hálózati szabályzatainak Windows-csomópontokkal való használata új fürtökön érhető el a Kubernetes 1.20-es vagy újabb verziójával a Calico 3.17.2-es verziójával, és azure CNI-hálózatkezelést igényel. A Calico-kompatibilis AKS-fürtök Windows-csomópontjai alapértelmezés szerint engedélyezve vannak a lebegő IP-címmel is.
Azon fürtök esetében, amelyben csak a Kubernetes 1.20-at futtató Linux-csomópontkészletek futnak a Calico korábbi verzióival, a Calico verziója automatikusan a 3.17.2-es verzióra frissül.
Hozzon létre egy felhasználónevet rendszergazdai hitelesítő adatokként a fürtön lévő Windows Server-tárolókhoz. Az alábbi parancs egy felhasználónév megadását kéri. Állítsa be a következőre $WINDOWS_USERNAME
: . Ne feledje, hogy a cikkben szereplő parancsok egy Bash-rendszerhéjba kerülnek.
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
A fürt létrehozása néhány percet vesz igénybe. Alapértelmezés szerint a fürt csak Linux-csomópontkészlettel jön létre. Ha Windows-csomópontkészleteket szeretne használni, felvehet egyet. Példa:
az aks nodepool add \
--resource-group $RESOURCE_GROUP_NAME \
--cluster-name $CLUSTER_NAME \
--os-type Windows \
--name npwin \
--node-count 1
Az Azure Network Policy Manager vagy a Calico telepítése meglévő fürtön
Az Azure Network Policy Manager vagy a Calico telepítése meglévő AKS-fürtökre is támogatott.
Figyelmeztetés
A frissítési folyamat aktiválja az egyes csomópontkészleteket, hogy egyidejűleg újraképeződjenek. Az egyes csomópontkészletek külön frissítése nem támogatott. Az egyes csomópontkészleteken belül a csomópontok ugyanazon folyamat után lesznek újra rendszerképezve, mint egy szabványos Kubernetes-verziófrissítési műveletben, amely ideiglenesen hozzáadja a puffercsomópontokat a futó alkalmazások fennakadásának minimalizálása érdekében, miközben a csomópont újraképezi a folyamatot. Ezért az esetleges fennakadások hasonlóak ahhoz, amit a csomópont lemezképének frissítése vagy a Kubernetes verziófrissítési művelete során elvárhat.
Példaparancs az Azure Network Policy Manager telepítéséhez:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy azure
Példaparancs a Calico telepítéséhez:
Figyelmeztetés
Ez a figyelmeztetés a Kubenet-fürtök Calico-kompatibilis Azure CNI-átfedésre való frissítésére vonatkozik, és a Calico engedélyezve van.
- A Calico-kompatibilis Kubenet-fürtökben a Calico CNI- és hálózati házirendmotorként is használható.
- Az Azure CNI-fürtökben a Calico csak a hálózati házirendek kikényszerítésére szolgál, nem pedig CNI-ként. Ez rövid késleltetést okozhat a pod indítása és a Calico által a podról kimenő forgalom engedélyezése között.
A probléma elkerülése érdekében javasoljuk, hogy a Calico helyett a Ciliumot használja. További információ a Ciliumról az Azure CNI Powered by Ciliumban
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy calico
Meglévő fürt frissítése, amely telepítette az Azure NPM-et vagy a Calico-t az Azure CNI Powered by Ciliumra
Ha olyan meglévő fürtöt szeretne frissíteni, amely hálózati házirend-motort telepített az Azure CNI Powered by Ciliumra, tekintse meg a meglévő fürtök frissítését az Azure CNI Powered by Ciliumra
Hálózati házirend beállításának ellenőrzése
Ha a fürt készen áll, konfigurálja kubectl
a Kubernetes-fürthöz való csatlakozást az az aks get-credentials paranccsal. Ez a parancs letölti a hitelesítő adatokat, és konfigurálja a Kubernetes parancssori felületét a használatukhoz:
az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
A hálózati házirend ellenőrzésének megkezdéséhez hozzon létre egy mintaalkalmazást, és állítsa be a forgalmi szabályokat.
Először hozzon létre egy névteret demo
a példa podok futtatásához:
kubectl create namespace demo
Most hozzon létre két podot a fürt client
neve és server
.
Feljegyzés
Ha egy adott csomóponton szeretné ütemezni az ügyfelet vagy a kiszolgálót, adja hozzá a következő bitet a --command
podlétrehozási kubectl-futtatási parancs argumentuma előtt:
--overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux|windows"}}}'
Hozzon létre egy podot server
. Ez a pod a 80-s TCP-porton szolgál:
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"
Hozzon létre egy podot client
. A következő parancs futtatja a Basht a client
podon:
kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --command -- bash
Most egy külön ablakban futtassa a következő parancsot a kiszolgáló IP-címének lekéréséhez:
kubectl get pod --output=wide -n demo
A kimenetnek a következőképpen kell kinéznie:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
server 1/1 Running 0 30s 10.224.0.72 akswin22000001 <none> <none>
Kapcsolat tesztelése hálózati házirend nélkül
Az ügyfél rendszerhéjában futtassa a következő parancsot a kiszolgálóval való kapcsolat ellenőrzéséhez. Cserélje le server-ip
az előző parancs futtatásából származó kimenetben található IP-cím használatával. Ha a kapcsolat sikeres, nincs kimenet.
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Kapcsolat tesztelése hálózati házirenddel
Hálózati szabályzatok hozzáadásához hozzon létre egy nevű demo-policy.yaml
fájlt, és illessze be a következő YAML-jegyzékfájlt:
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
Adja meg a YAML-jegyzék nevét, és alkalmazza a kubectl apply használatával:
kubectl apply –f demo-policy.yaml
Most az ügyfél rendszerhéjában ellenőrizze a kiszolgálóval való kapcsolatot az alábbi /agnhost
parancs futtatásával:
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
A forgalommal való kapcsolat le van tiltva, mert a kiszolgáló címkével van ellátva app=server
, de az ügyfél nincs címkével ellátva. Az előző kapcsolódási parancs a következő kimenetet adja eredményként:
TIMEOUT
Futtassa a következő parancsot a client
kiszolgálóval való kapcsolat címkézéséhez és ellenőrzéséhez. A kimenetnek nem szabad semmit visszaadnia.
kubectl label pod client -n demo app=client
Az Azure Network Policy Manager vagy a Calico eltávolítása
Követelmények:
- Az Azure CLI 2.63-es vagy újabb verziója
Feljegyzés
- Az eltávolítási folyamat nem távolítja el a Calico által használt egyéni erőforrás-definíciókat (CRD-ket) és egyéni erőforrásokat (CRs). Ezek a CRD-k és AR-k mindegyike "projectcalico.org" vagy "tigera.io" végződésű névvel rendelkezik. Ezek a CRD-k és a kapcsolódó hitelesítésszolgáltatók manuálisan törölhetők a Calico sikeres eltávolítása után (a CRD-k törlése a Calico eltávolítása előtt megszakítja a fürtöt).
- A frissítés nem távolítja el a NetworkPolicy-erőforrásokat a fürtben, de az eltávolítás után ezek a házirendek már nem lesznek kényszerítve.
Figyelmeztetés
A frissítési folyamat aktiválja az egyes csomópontkészleteket, hogy egyidejűleg újraképeződjenek. Az egyes csomópontkészletek külön frissítése nem támogatott. A fürt hálózatának megszakadása hasonló a csomópontok lemezképének frissítéséhez vagy a Kubernetes verziófrissítéséhez , ahol a csomópontkészlet minden csomópontja újra van rendszerképben.
Az Azure Network Policy Manager vagy a Calico fürtből való eltávolításához futtassa a következő parancsot:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy none
Az erőforrások eltávolítása
Ebben a cikkben létrehozott egy névteret és két podot, és alkalmazott egy hálózati házirendet. Az erőforrások törléséhez használja a kubectl delete parancsot, és adja meg az erőforrás nevét:
kubectl delete namespace demo
Következő lépések
A hálózati erőforrásokról további információt az Azure Kubernetes Service (AKS) alkalmazásainak hálózati fogalmai című témakörben talál.
A szabályzatokról további információt a Kubernetes hálózati házirendjeiben talál.
Azure Kubernetes Service