Az adatforgalom biztonságossá tétele hálózati szabályzatokat használó podok között az Azure Kubernetes Service-ben (AKS)

Ha modern mikroszolgáltatás-alapú alkalmazásokat futtat a Kubernetesben, gyakran szeretné szabályozni, hogy mely összetevők kommunikálhatnak egymással. A legkisebb jogosultság elvét kell alkalmazni arra, hogyan áramolhat a forgalom egy Azure Kubernetes Service -fürtön lévő podok között. Tegyük fel, hogy valószínűleg 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ő forgalomra vonatkozó szabályok 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 szabályzatokat a podok közötti forgalom szabályozásához az AKS-ben. A hálózati házirend használható Linux- vagy Windows-alapú csomópontokhoz és podokhoz az AKS-ben.

Előkészületek

Telepíteni és konfigurálni 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.

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 tud forgalmat küldeni és fogadni. 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. A hálózati házirendek használatával egy rendezett szabálykészletet határoz meg a forgalom küldéséhez és fogadásához, és alkalmazza őket egy vagy több címkeválasztónak megfelelő podgyűjteményre.

Ezek a hálózati házirend-szabályok YAML-jegyzékekké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ások az AKS-ben

Az Azure kétféleképpen valósítja meg a hálózati szabályzatot. Az AKS-fürt létrehozásakor a Hálózati házirend lehetőséget választja. A választott szabályzat a fürt létrehozása után már nem módosítható:

  • Az Azure saját implementációja, az Úgynevezett Azure Network Policy Manager (NPM).
  • Calico Network Policies, egy nyílt forráskódú hálózati és hálózati biztonsági megoldás, amelyet a Tigera alapított.

A Linuxhoz készült Azure NPM Linux IPTables , a Windowshoz készült Azure NPM pedig a HNS ACLPolicies szolgáltatást használja a megadott szabályzatok kényszerítéséhez. Egy szabályzat az engedélyezett és tiltott IP-címpárok halmazára van lefordítva. Ezek a párok vannak aztán megadva az IPTable/HNS ACLPolicy szűrőszabályaiként.

Az Azure NPM és a Calico Network Policy eltérései és képességei

Képesség Azure NPM Calico hálózati szabályzat
Támogatott platformok Linux, Windows Server 2022 Linux, Windows Server 2019 és 2022
Támogatott hálózatkezelési lehetőségek Azure CNI Azure CNI (Linux, Windows Server 2019 és 2022) és kubenet (Linux)
A Kubernetes specifikációnak való megfelelés Minden támogatott szabályzattípus Minden támogatott szabályzattípus
További funkciók None Kiterjesztett szabályzatmodell, amely globális hálózati házirendből, globális hálózati készletből és gazdagépvégpontból áll. A parancssori felületnek a calicoctl kiterjesztett funkciók kezelésére való használatával kapcsolatos további információkért lásd a calicoctl felhasználói referenciáját.
Támogatás A Azure-támogatás és a mérnöki csapat támogatja Calico-közösség támogatása. A további fizetős támogatásról további információt a Project Calico támogatási lehetőségei című témakörben talál.
Naplózás A kubectl log -n kube-system paranccsal elérhető naplók További információ: Calico-összetevők naplói

Korlátozások:

Az Azure Network Policy Manager (NPM) nem támogatja az IPv6-ot. Ellenkező esetben az Azure NPM teljes mértékben támogatja a linuxos hálózati házirend-specifikációt.

  • Windows rendszerben az Azure NPM nem támogatja a következőket:
    • elnevezett portok
    • SCTP-protokoll
    • negatív egyezésű címke vagy névtérválasztók (például az összes címke, kivéve a "debug=true")
    • "kivéve" CIDR-blokkok (kivételekkel rendelkező CIDR)

Megjegyzés

  • Az Azure NPM-podnaplók hibát rögzítenek, ha nem támogatott szabályzat jön létre.

Skála:

A Linuxhoz készült Azure NPM-en beállított jelenlegi korlátokkal akár 500 csomópontot és 40 ezer podot is skálázhat. Előfordulhat, hogy az OOM-gyilkosságok ennél a méreten túl is megjelennek. Ha növelni szeretné a memóriakorlátot, forduljon hozzánk az aks-can-githubon .

AKS-fürt létrehozása és hálózati házirend engedélyezése

A hálózati szabályzatok működés közbeni megtekintéséhez hozzunk létre egy hálózati házirendet támogató AKS-fürtöt, majd dolgozzunk a szabályzatok hozzáadásán.

Fontos

A hálózati házirend szolgáltatás csak a fürt létrehozásakor engedélyezhető. Meglévő AKS-fürtön nem engedélyezhető a hálózati szabályzat.

Az Azure NPM használatához az Azure CNI beépülő modult kell használnia. A Calico Network Policy használható ugyanahhoz az Azure CNI-beépülő modulhoz vagy a Kubenet CNI beépülő modulhoz.

A következő példaszkript:

  • Létrehoz egy rendszer által hozzárendelt identitással rendelkező AKS-fürtöt, és engedélyezi a hálózati házirendet.
    • A rendszer az Azure NPM lehetőséget használja. Ha inkább a Calico-t szeretné hálózati házirendként használni, használja a paramétert --network-policy calico . Megjegyzés: A Calico a vagy --network-plugin kubeneta használatával --network-plugin azure használható.

Rendszer által hozzárendelt identitás 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 NPM-sel – csak Linux

Ebben a szakaszban egy linuxos csomópontkészletekkel rendelkező fürtöt fogunk létrehozni, és engedélyezve van az Azure NPM.

Először cserélje le a $RESOURCE_GROUP_NAME és $CLUSTER_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 az és az network-pluginnetwork-policyazure-t.

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

AKS-fürt létrehozása engedélyezett Azure NPM-vel – Windows Server 2022 (előzetes verzió)

Ebben a szakaszban egy windowsos csomópontkészletekkel rendelkező fürtöt fogunk létrehozni, és engedélyezve van az Azure NPM.

Fürt létrehozása előtt hajtsa végre a következő parancsokat:

 az extension add --name aks-preview
 az extension update --name aks-preview
 az feature register --namespace Microsoft.ContainerService --name WindowsNetworkPolicyPreview
 az provider register -n Microsoft.ContainerService

Megjegyzés

Jelenleg a Windows-csomópontokkal rendelkező Azure NPM csak Windows Server 2022 rendszeren érhető el

Most cserélje le a $RESOURCE_GROUP_NAME, $CLUSTER_NAME és $WINDOWS_USERNAME változók é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 parancssor egy felhasználónevet kér. Állítsa be ( $WINDOWS_USERNAMEne 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

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éldául:

az aks nodepool add \
    --resource-group $RESOURCE_GROUP_NAME \
    --cluster-name $CLUSTER_NAME \
    --os-type Windows \
    --name npwin \
    --node-count 1

Fontos

Az AKS előzetes verziójú funkciói önkiszolgáló, jóváhagyási alapon érhetők el. Az előzetes verziókat "adott állapotban" és "elérhetőként" biztosítjuk, és nem tartoznak a szolgáltatásiszint-szerződésekbe és a korlátozott jótállásba. Az AKS előzetes verzióit részben az ügyfélszolgálat fedezi a legjobb erőfeszítés alapján. Ezért ezek a funkciók nem éles használatra szolgálnak. További információért tekintse meg az alábbi támogatási cikkeket:

AKS-fürt létrehozása Calico hálózati szabályzatokhoz

Hozza létre az AKS-fürtöt, és adja meg az azure-t a hálózati beépülő modulhoz, és a hálózati szabályzathoz tartozó calico értéket. A Calico hálózati szabályzatként való használata lehetővé teszi a Calico hálózatkezelését a Linux- és Windows-csomópontkészleteken is.

Ha Windows-csomópontkészleteket szeretne hozzáadni a fürthöz, adja meg a és windows-admin-password paramétereketwindows-admin-username, amelyek megfelelnek a Windows Server jelszókövetelményeinek.

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-t használó AKS-fürtök Windows-csomópontjaiban alapértelmezés szerint engedélyezve van a Direct Server Return (DSR) is.

A Calico korábbi verzióival rendelkező, Csak a Kubernetes 1.20-at futtató Linux-csomópontkészletekkel rendelkező fürtök esetében 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. A következő parancssorban felhasználónevet kell megadnia. Állítsa be értékre $WINDOWS_USERNAME(ne feledje, hogy a cikkben szereplő parancsok BASH-felületbe vannak beírva).

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

A fürt létrehozása néhány percet vesz igénybe. Alapértelmezés szerint a fürt csak linuxos csomópontkészlettel jön létre. Ha Windows-csomópontkészleteket szeretne használni, felvehet egyet. Például:

az aks nodepool add \
    --resource-group $RESOURCE_GROUP_NAME \
    --cluster-name $CLUSTER_NAME \
    --os-type Windows \
    --name npwin \
    --node-count 1

Hálózati házirend beállításának ellenőrzése

Ha a fürt készen áll, konfigurálja kubectl a csatlakozást a Kubernetes-fürthöz 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 szabályzat ellenőrzésének megkezdéséhez létrehozunk egy mintaalkalmazást, és beállítjuk a forgalmi szabályokat.

Először hozzunk létre egy demo nevű névteret a példa podok futtatásához:

kubectl create namespace demo

Most létrehozunk két podot az ügyfél és a kiszolgáló nevű fürtben.

Megjegyzés

Ha egy adott csomóponton szeretné ütemezni az ügyfelet vagy a kiszolgálót, adja hozzá a következő bitet a podlétrehozási kubectl run parancs --command argumentuma elé:

--overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux|windows"}}}'

Hozzon létre egy kiszolgálói podot. Ez a pod a 80-s TCP-porton fog szolgálni:

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 ügyfél podot. Az alábbi parancs basht futtat az ügyfél podján:

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

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 szabályzat nélkül

Az ügyfél rendszerhéjában ellenőrizze a kiszolgálóval való kapcsolatot az alábbi parancs végrehajtásával. Cserélje le a server-ip értéket az előző parancs végrehajtásából származó kimenetben található IP-címre. Ha a kapcsolat sikeres, nem lesz kimenet:

/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp

Kapcsolat tesztelése hálózati szabályzattal

Hozzon létre egy demo-policy.yaml nevű fájlt, és illessze be a következő YAML-jegyzékfájlt a hálózati szabályzatok hozzáadásához:

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ékfájl nevét, és alkalmazza a kubectl apply paranccsal:

kubectl apply –f demo-policy.yaml

Most az ügyfél rendszerhéjában ellenőrizze a kiszolgálóval való kapcsolatot a következő /agnhost parancs végrehajtásával:

/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp

A forgalommal való kapcsolat le lesz tiltva, mivel a kiszolgáló az app=server címkével van ellátva, de az ügyfél nincs címkézve. A fenti connect parancs a következő kimenetet fogja eredményezni:

TIMEOUT

Futtassa a következő parancsot az ügyfél címkézéséhez és a kiszolgálóval való kapcsolat ellenőrzéséhez (a kimenet nem ad vissza semmit).

kubectl label pod client -n demo app=client

Az erőforrások eltávolítása

Ebben a cikkben létrehoztunk egy névteret és két podot, és egy hálózati házirendet alkalmaztunk. 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

További információ a hálózati erőforrásokról: Hálózati fogalmak az Azure Kubernetes Service (AKS) alkalmazásaiban.

A szabályzatokkal kapcsolatos további információkért lásd: Kubernetes hálózati szabályzatok.