Zabezpieczanie ruchu między różnymi sieciami przy użyciu zasad sieciowych w usłudze Azure Kubernetes Service (AKS)Secure traffic between pods using network policies in Azure Kubernetes Service (AKS)

W przypadku uruchamiania nowoczesnych aplikacji opartych na mikrousługach w programie Kubernetes często trzeba kontrolować, które składniki mogą komunikować się ze sobą.When you run modern, microservices-based applications in Kubernetes, you often want to control which components can communicate with each other. Zasada najniższych uprawnień powinna być stosowana do sposobu przepływu ruchu między jednostkami w klastrze usługi Azure Kubernetes Service (AKS).The principle of least privilege should be applied to how traffic can flow between pods in an Azure Kubernetes Service (AKS) cluster. Załóżmy, że wiesz, że chcesz blokować ruch bezpośrednio do aplikacji zaplecza.Let's say you likely want to block traffic directly to back-end applications. Funkcja zasad sieciowych w programie Kubernetes umożliwia definiowanie reguł ruchu przychodzącego i wychodzącego między zasobnikami w klastrze.The Network Policy feature in Kubernetes lets you define rules for ingress and egress traffic between pods in a cluster.

W tym artykule opisano sposób instalowania aparatu zasad sieciowych i tworzenia zasad sieciowych Kubernetes w celu kontrolowania przepływu ruchu między nimi w AKS.This article shows you how to install the network policy engine and create Kubernetes network policies to control the flow of traffic between pods in AKS. Zasady sieciowe powinny być używane tylko dla węzłów i zasobników opartych na systemie Linux w AKS.Network policy should only be used for Linux-based nodes and pods in AKS.

Przed rozpoczęciemBefore you begin

Wymagany jest interfejs wiersza polecenia platformy Azure w wersji 2.0.61 lub nowszej.You need the Azure CLI version 2.0.61 or later installed and configured. Uruchom polecenie  az --version, aby dowiedzieć się, jaka wersja jest używana.Run az --version to find the version. Jeśli konieczne będzie przeprowadzenie instalacji lub uaktualnienia, zobacz  Instalowanie interfejsu wiersza polecenia platformy Azure.If you need to install or upgrade, see Install Azure CLI.

Porada

W przypadku użycia funkcji zasad sieciowych w trakcie korzystania z wersji zapoznawczej zalecamy utworzenie nowego klastra.If you used the network policy feature during preview, we recommend that you create a new cluster.

Jeśli chcesz kontynuować korzystanie z istniejących klastrów testowych, które używały zasad sieciowych w trakcie okresu zapoznawczego, Uaktualnij klaster do nowej wersji usługi Kubernetes w najnowszej wersji, a następnie wdróż następujący manifest YAML, aby naprawić serwer metryk z awariami i pulpit nawigacyjny Kubernetes.If you wish to continue using existing test clusters that used network policy during preview, upgrade your cluster to a new Kubernetes versions for the latest GA release and then deploy the following YAML manifest to fix the crashing metrics server and Kubernetes dashboard. Ta poprawka jest wymagana tylko w przypadku klastrów, które używały aparatu zasad sieciowych Calico.This fix is only required for clusters that used the Calico network policy engine.

Zgodnie z najlepszymi rozwiązaniami w zakresie bezpieczeństwa, zapoznaj się z zawartością tego manifestu YAML , aby zrozumieć, co jest wdrażane w klastrze AKS.As a security best practice, review the contents of this YAML manifest to understand what is deployed into the AKS cluster.

kubectl delete -f https://raw.githubusercontent.com/Azure/aks-engine/master/docs/topics/calico-3.3.1-cleanup-after-upgrade.yaml

Omówienie zasad sieciowychOverview of network policy

Wszystkie zasobniki w klastrze AKS mogą domyślnie wysyłać i odbierać ruch bez ograniczeń.All pods in an AKS cluster can send and receive traffic without limitations, by default. Aby zwiększyć bezpieczeństwo, można zdefiniować reguły sterujące przepływem ruchu.To improve security, you can define rules that control the flow of traffic. Aplikacje zaplecza często są widoczne tylko dla wymaganych usług frontonu, na przykład.Back-end applications are often only exposed to required front-end services, for example. Lub składniki bazy danych są dostępne tylko dla warstw aplikacji, które łączą się z nimi.Or, database components are only accessible to the application tiers that connect to them.

Zasady sieciowe to specyfikacja Kubernetes, która definiuje zasady dostępu do komunikacji między serwerami.Network Policy is a Kubernetes specification that defines access policies for communication between Pods. Korzystając z zasad sieciowych, należy zdefiniować uporządkowany zestaw reguł do wysyłania i odbierania ruchu, a następnie zastosować je do kolekcji zestawów, które pasują do jednego lub kilku selektorów etykiet.Using Network Policies, you define an ordered set of rules to send and receive traffic and apply them to a collection of pods that match one or more label selectors.

Te reguły zasad sieciowych są zdefiniowane jako manifesty YAML.These network policy rules are defined as YAML manifests. Zasady sieciowe mogą być dołączane jako część szerszego manifestu, który tworzy również wdrożenie lub usługę.Network policies can be included as part of a wider manifest that also creates a deployment or service.

Opcje zasad sieciowych w AKSNetwork policy options in AKS

Platforma Azure zapewnia dwa sposoby implementacji zasad sieciowych.Azure provides two ways to implement network policy. Podczas tworzenia klastra AKS wybierz opcję zasad sieciowych.You choose a network policy option when you create an AKS cluster. Nie można zmienić opcji zasad po utworzeniu klastra:The policy option can't be changed after the cluster is created:

  • Własna implementacja platformy Azure, nazywana zasadami sieci platformy Azure.Azure's own implementation, called Azure Network Policies.
  • Calico zasady sieci, rozwiązanie zabezpieczeń sieci i sieci "open source" oparte na Tigera.Calico Network Policies, an open-source network and network security solution founded by Tigera.

Obie implementacje używają systemu Linux dołączenie iptables , aby wymusić określone zasady.Both implementations use Linux IPTables to enforce the specified policies. Zasady są tłumaczone na zestawy dozwolonych i niedozwolonych par adresów IP.Policies are translated into sets of allowed and disallowed IP pairs. Te pary są następnie zaprogramowane jako reguły filtru IPTable.These pairs are then programmed as IPTable filter rules.

Różnice między zasadami platformy Azure i Calico oraz ich możliwościamiDifferences between Azure and Calico policies and their capabilities

MożliwośćCapability AzureAzure CalicoCalico
Obsługiwane platformySupported platforms LinuxLinux LinuxLinux
Obsługiwane opcje sieciSupported networking options Azure CNIAzure CNI Azure CNI i korzystającą wtyczki kubenetAzure CNI and kubenet
Zgodność ze specyfikacją KubernetesCompliance with Kubernetes specification Wszystkie typy zasad obsługiwaneAll policy types supported Wszystkie typy zasad obsługiwaneAll policy types supported
Dodatkowe funkcjeAdditional features BrakNone Rozszerzony model zasad składający się z globalnych zasad sieciowych, globalnego zestawu sieci i punktu końcowego hosta.Extended policy model consisting of Global Network Policy, Global Network Set, and Host Endpoint. Aby uzyskać więcej informacji na temat korzystania z calicoctl interfejsu wiersza polecenia do zarządzania tymi rozszerzonymi funkcjami, zobacz calicoctl User Reference.For more information on using the calicoctl CLI to manage these extended features, see calicoctl user reference.
Pomoc technicznaSupport Obsługiwane przez zespół pomocy technicznej i inżynierów platformy AzureSupported by Azure support and Engineering team Wsparcie społeczności Calico.Calico community support. Aby uzyskać więcej informacji na temat dodatkowej płatnej pomocy technicznej, zobacz Opcje pomocy technicznej dla programu Project Calico.For more information on additional paid support, see Project Calico support options.
RejestrowanieLogging Reguły dodane/usunięte w dołączenie iptables są rejestrowane na każdym hoście w obszarze /var/log/Azure-npm.logRules added / deleted in IPTables are logged on every host under /var/log/azure-npm.log Aby uzyskać więcej informacji, zobacz dzienniki składników CalicoFor more information, see Calico component logs

Tworzenie klastra AKS i Włączanie zasad sieciowychCreate an AKS cluster and enable network policy

Aby wyświetlić zasady sieciowe w działaniu, Utwórz i rozwiń zasady, które definiują przepływ ruchu:To see network policies in action, let's create and then expand on a policy that defines traffic flow:

  • Odrzuć cały ruch do pod.Deny all traffic to pod.
  • Zezwalaj na ruch na podstawie etykiet pod.Allow traffic based on pod labels.
  • Zezwalaj na ruch na podstawie przestrzeni nazw.Allow traffic based on namespace.

Najpierw Utwórzmy klaster AKS, który obsługuje zasady sieciowe.First, let's create an AKS cluster that supports network policy.

Ważne

Funkcja zasad sieciowych można włączyć tylko podczas tworzenia klastra.The network policy feature can only be enabled when the cluster is created. Nie można włączyć zasad sieciowych w istniejącym klastrze AKS.You can't enable network policy on an existing AKS cluster.

Aby korzystać z zasad sieciowych platformy Azure, musisz użyć wtyczki CNI platformy Azure i zdefiniować własną sieć wirtualną oraz podsieci.To use Azure Network Policy, you must use the Azure CNI plug-in and define your own virtual network and subnets. Aby uzyskać szczegółowe informacje na temat planowania wymaganych zakresów podsieci, zobacz Konfigurowanie zaawansowanej sieci.For more detailed information on how to plan out the required subnet ranges, see configure advanced networking. Zasad sieciowych Calico można użyć z tą samą wtyczką CNI platformy Azure lub z dodatkiem plug-in korzystającą wtyczki kubenet CNI.Calico Network Policy could be used with either this same Azure CNI plug-in or with the Kubenet CNI plug-in.

Następujący przykładowy skrypt:The following example script:

  • Tworzy sieć wirtualną i podsieć.Creates a virtual network and subnet.
  • Tworzy jednostkę usługi Azure Active Directory (Azure AD) do użycia z klastrem AKS.Creates an Azure Active Directory (Azure AD) service principal for use with the AKS cluster.
  • Przypisuje uprawnienia współautora dla jednostki usługi klastra AKS w sieci wirtualnej.Assigns Contributor permissions for the AKS cluster service principal on the virtual network.
  • Tworzy klaster AKS w zdefiniowanej sieci wirtualnej i włącza zasady sieciowe.Creates an AKS cluster in the defined virtual network and enables network policy.
    • Opcja zasad sieciowych platformy Azure jest używana.The Azure Network policy option is used. Aby zamiast tego użyć Calico jako opcji zasad sieciowych, należy użyć --network-policy calico parametru.To use Calico as the network policy option instead, use the --network-policy calico parameter. Uwaga: Calico można użyć z --network-plugin azure lub --network-plugin kubenet .Note: Calico could be used with either --network-plugin azure or --network-plugin kubenet.

Należy pamiętać, że zamiast używać nazwy głównej usługi, można użyć tożsamości zarządzanej w celu uzyskania uprawnień.Note that instead of using a service principal, you can use a managed identity for permissions. Aby uzyskać więcej informacji, zobacz Korzystanie z tożsamości zarządzanych.For more information, see Use managed identities.

Podaj własne bezpieczne SP_PASSWORD.Provide your own secure SP_PASSWORD. Można zastąpić zmienne RESOURCE_GROUP_NAME i CLUSTER_NAME :You can replace the RESOURCE_GROUP_NAME and CLUSTER_NAME variables:

RESOURCE_GROUP_NAME=myResourceGroup-NP
CLUSTER_NAME=myAKSCluster
LOCATION=canadaeast

# Create a resource group
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION

# Create a virtual network and subnet
az network vnet create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name myVnet \
    --address-prefixes 10.0.0.0/8 \
    --subnet-name myAKSSubnet \
    --subnet-prefix 10.240.0.0/16

# Create a service principal and read in the application ID
SP=$(az ad sp create-for-rbac --output json)
SP_ID=$(echo $SP | jq -r .appId)
SP_PASSWORD=$(echo $SP | jq -r .password)

# Wait 15 seconds to make sure that service principal has propagated
echo "Waiting for service principal to propagate..."
sleep 15

# Get the virtual network resource ID
VNET_ID=$(az network vnet show --resource-group $RESOURCE_GROUP_NAME --name myVnet --query id -o tsv)

# Assign the service principal Contributor permissions to the virtual network resource
az role assignment create --assignee $SP_ID --scope $VNET_ID --role Contributor

# Get the virtual network subnet resource ID
SUBNET_ID=$(az network vnet subnet show --resource-group $RESOURCE_GROUP_NAME --vnet-name myVnet --name myAKSSubnet --query id -o tsv)

# Create the AKS cluster and specify the virtual network and service principal information
# Enable network policy by using the `--network-policy` parameter
az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --generate-ssh-keys \
    --network-plugin azure \
    --service-cidr 10.0.0.0/16 \
    --dns-service-ip 10.0.0.10 \
    --docker-bridge-address 172.17.0.1/16 \
    --vnet-subnet-id $SUBNET_ID \
    --service-principal $SP_ID \
    --client-secret $SP_PASSWORD \
    --network-policy azure

Utworzenie klastra trwa kilka minut.It takes a few minutes to create the cluster. Gdy klaster jest gotowy, skonfiguruj, kubectl Aby nawiązać połączenie z klastrem Kubernetes za pomocą polecenia AZ AKS Get-Credentials .When the cluster is ready, configure kubectl to connect to your Kubernetes cluster by using the az aks get-credentials command. To polecenie umożliwia pobranie poświadczeń i skonfigurowanie interfejsu wiersza polecenia Kubernetes do ich użycia:This command downloads credentials and configures the Kubernetes CLI to use them:

az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME

Odrzuć cały ruch przychodzący do podDeny all inbound traffic to a pod

Przed zdefiniowaniem reguł zezwalających na określony ruch sieciowy należy najpierw utworzyć zasady sieciowe, aby odmówić całego ruchu.Before you define rules to allow specific network traffic, first create a network policy to deny all traffic. Te zasady zapewniają punkt początkowy, od którego należy zacząć tworzyć listę dozwolonych tylko dla żądanego ruchu.This policy gives you a starting point to begin to create an allow list for only the desired traffic. Możesz również jasno zobaczyć, że ruch zostanie porzucony podczas stosowania zasad sieciowych.You can also clearly see that traffic is dropped when the network policy is applied.

W przypadku przykładowych zasad dotyczących środowiska aplikacji i ruchu Utwórzmy najpierw przestrzeń nazw o nazwie programowanie , aby uruchomić przykładowe zasobniki:For the sample application environment and traffic rules, let's first create a namespace called development to run the example pods:

kubectl create namespace development
kubectl label namespace/development purpose=development

Utwórz przykładowy przykład zaplecza z systemem NGINX.Create an example back-end pod that runs NGINX. Tego zaplecza można użyć, aby symulować przykładową aplikację opartą na sieci Web zaplecza.This back-end pod can be used to simulate a sample back-end web-based application. Utwórz ten obszar w przestrzeni nazw Development i otwórz port 80 w celu obsługi ruchu w sieci Web.Create this pod in the development namespace, and open port 80 to serve web traffic. Oznacz element pod za pomocą aplikacji App = webapp, role = zaplecza , tak aby można było określić go przy użyciu zasad sieciowych w następnej sekcji:Label the pod with app=webapp,role=backend so that we can target it with a network policy in the next section:

kubectl run backend --image=nginx --labels app=webapp,role=backend --namespace development --expose --port 80 --generator=run-pod/v1

Utwórz kolejną stronę pod i Dołącz sesję terminalową, aby sprawdzić, czy można pomyślnie uzyskać dostęp do domyślnej strony sieci Web NGINX:Create another pod and attach a terminal session to test that you can successfully reach the default NGINX webpage:

kubectl run --rm -it --image=alpine network-policy --namespace development --generator=run-pod/v1

W wierszu polecenia powłoki Użyj, wget Aby potwierdzić, że możesz uzyskać dostęp do domyślnej strony sieci Web Nginx:At the shell prompt, use wget to confirm that you can access the default NGINX webpage:

wget -qO- http://backend

Następujące przykładowe dane wyjściowe pokazują, że zwracana jest domyślna strona sieci Web NGINX:The following sample output shows that the default NGINX webpage returned:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[...]

Wyjdź z dołączonej sesji terminala.Exit out of the attached terminal session. Test pod zostanie automatycznie usunięty.The test pod is automatically deleted.

exit

Tworzenie i stosowanie zasad sieciowychCreate and apply a network policy

Po potwierdzeniu, że możesz użyć podstawowej strony sieci Web NGINX na przykładowej zaplecza, Utwórz zasady sieciowe, aby odmówić całego ruchu.Now that you've confirmed you can use the basic NGINX webpage on the sample back-end pod, create a network policy to deny all traffic. Utwórz plik o nazwie backend-policy.yaml i wklej następujący manifest YAML.Create a file named backend-policy.yaml and paste the following YAML manifest. Ten manifest używa podSelector do dołączania zasad do zasobników, które mają etykietę App: webapp, role: zaplecza , taką jak przykład Nginx.This manifest uses a podSelector to attach the policy to pods that have the app:webapp,role:backend label, like your sample NGINX pod. W ramach ruchuprzychodzącego nie są zdefiniowane żadne reguły, dlatego cały ruch przychodzący do niego jest odrzucany:No rules are defined under ingress, so all inbound traffic to the pod is denied:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: backend-policy
  namespace: development
spec:
  podSelector:
    matchLabels:
      app: webapp
      role: backend
  ingress: []

Przejdź do https://shell.azure.com okna, aby otworzyć Azure Cloud Shell w przeglądarce.Go to https://shell.azure.com to open Azure Cloud Shell in your browser.

Zastosuj zasady sieci przy użyciu polecenia polecenia kubectl Apply i określ nazwę manifestu YAML:Apply the network policy by using the kubectl apply command and specify the name of your YAML manifest:

kubectl apply -f backend-policy.yaml

Testowanie zasad sieciowychTest the network policy

Sprawdźmy, czy można ponownie użyć strony sieci Web NGINX na zapleczu.Let's see if you can use the NGINX webpage on the back-end pod again. Utwórz inny test pod i Dołącz sesję terminala:Create another test pod and attach a terminal session:

kubectl run --rm -it --image=alpine network-policy --namespace development --generator=run-pod/v1

W wierszu polecenia powłoki Użyj, wget Aby zobaczyć, czy można uzyskać dostęp do domyślnej strony sieci Web Nginx.At the shell prompt, use wget to see if you can access the default NGINX webpage. Tym razem ustaw wartość limitu czasu na 2 sekundy.This time, set a timeout value to 2 seconds. Zasady sieciowe blokują teraz cały ruch przychodzący, więc nie można załadować strony, jak pokazano w następującym przykładzie:The network policy now blocks all inbound traffic, so the page can't be loaded, as shown in the following example:

wget -qO- --timeout=2 http://backend
wget: download timed out

Wyjdź z dołączonej sesji terminala.Exit out of the attached terminal session. Test pod zostanie automatycznie usunięty.The test pod is automatically deleted.

exit

Zezwalaj na ruch przychodzący na podstawie etykiety podAllow inbound traffic based on a pod label

W poprzedniej sekcji zaplanowano NGINX zaplecza, a zasady sieciowe zostały utworzone w celu odblokowania całego ruchu.In the previous section, a back-end NGINX pod was scheduled, and a network policy was created to deny all traffic. Utwórzmy fronton pod i zaktualizuj zasady sieciowe, aby umożliwić ruch z zasobników frontonu.Let's create a front-end pod and update the network policy to allow traffic from front-end pods.

Aktualizowanie zasad sieciowych w celu zezwalania na ruch z aplikacji w postaci etykiet : webapp, role: fronton i w dowolnej przestrzeni nazw.Update the network policy to allow traffic from pods with the labels app:webapp,role:frontend and in any namespace. Edytuj poprzedni plik zaplecza-Policy. YAML i Dodaj reguły transferu matchLabels , aby manifest wyglądał następująco:Edit the previous backend-policy.yaml file, and add matchLabels ingress rules so that your manifest looks like the following example:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: backend-policy
  namespace: development
spec:
  podSelector:
    matchLabels:
      app: webapp
      role: backend
  ingress:
  - from:
    - namespaceSelector: {}
      podSelector:
        matchLabels:
          app: webapp
          role: frontend

Uwaga

Ta zasada sieciowa używa elementu namespaceSelector i podSelector dla reguły transferu danych przychodzących.This network policy uses a namespaceSelector and a podSelector element for the ingress rule. Składnia YAML jest ważna dla reguł transferu danych przychodzących.The YAML syntax is important for the ingress rules to be additive. W tym przykładzie oba elementy muszą być zgodne dla reguły transferu danych przychodzących.In this example, both elements must match for the ingress rule to be applied. Wersje Kubernetes wcześniejsze niż 1,12 mogą nie interpretować tych elementów poprawnie i ograniczać ruch sieciowy zgodnie z oczekiwaniami.Kubernetes versions prior to 1.12 might not interpret these elements correctly and restrict the network traffic as you expect. Aby uzyskać więcej informacji na temat tego zachowania, zobacz zachowanie elementów i selektorów.For more about this behavior, see Behavior of to and from selectors.

Zastosuj zaktualizowane zasady sieci przy użyciu polecenia polecenia kubectl Apply i określ nazwę manifestu YAML:Apply the updated network policy by using the kubectl apply command and specify the name of your YAML manifest:

kubectl apply -f backend-policy.yaml

Zaplanuj pod nazwą App = webapp, role = fronton i Dołącz sesję terminalową:Schedule a pod that is labeled as app=webapp,role=frontend and attach a terminal session:

kubectl run --rm -it frontend --image=alpine --labels app=webapp,role=frontend --namespace development --generator=run-pod/v1

W wierszu polecenia powłoki Użyj, wget Aby zobaczyć, czy można uzyskać dostęp do domyślnej strony sieci Web Nginx:At the shell prompt, use wget to see if you can access the default NGINX webpage:

wget -qO- http://backend

Ponieważ reguła ruchu przychodzącego zezwala na ruch z punktami końcowymi, które mają aplikację Labels : webapp, role: fronton, ruch z frontonu poniżej jest dozwolony.Because the ingress rule allows traffic with pods that have the labels app: webapp,role: frontend, the traffic from the front-end pod is allowed. Następujące przykładowe dane wyjściowe przedstawiają domyślną stronę sieci Web NGINX:The following example output shows the default NGINX webpage returned:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[...]

Wyjdź z dołączonej sesji terminala.Exit out of the attached terminal session. Wartość pod jest automatycznie usuwana.The pod is automatically deleted.

exit

Przetestuj element pod bez pasującej etykietyTest a pod without a matching label

Zasady sieciowe zezwalają na ruch z aplikacji z nazwami oznaczonymi etykietą App: webapp, role: fronton, ale powinny odrzucać cały ruch.The network policy allows traffic from pods labeled app: webapp,role: frontend, but should deny all other traffic. Przetestujmy, aby sprawdzić, czy inny pod bez etykiet nie może uzyskać dostępu do NGINX zaplecza pod.Let's test to see whether another pod without those labels can access the back-end NGINX pod. Utwórz inny test pod i Dołącz sesję terminala:Create another test pod and attach a terminal session:

kubectl run --rm -it --image=alpine network-policy --namespace development --generator=run-pod/v1

W wierszu polecenia powłoki Użyj, wget Aby zobaczyć, czy można uzyskać dostęp do domyślnej strony sieci Web Nginx.At the shell prompt, use wget to see if you can access the default NGINX webpage. Zasady sieciowe blokują ruch przychodzący, więc nie można załadować strony, jak pokazano w następującym przykładzie:The network policy blocks the inbound traffic, so the page can't be loaded, as shown in the following example:

wget -qO- --timeout=2 http://backend
wget: download timed out

Wyjdź z dołączonej sesji terminala.Exit out of the attached terminal session. Test pod zostanie automatycznie usunięty.The test pod is automatically deleted.

exit

Zezwalaj na ruch tylko z wewnątrz zdefiniowanej przestrzeni nazwAllow traffic only from within a defined namespace

W poprzednich przykładach zostały utworzone zasady sieci, które odrzuciły cały ruch, a następnie Zaktualizowano zasady w celu zezwolenia na ruch z programu z określoną etykietą.In the previous examples, you created a network policy that denied all traffic, and then updated the policy to allow traffic from pods with a specific label. Innym często spotykanym zapotrzebowaniem jest ograniczanie ruchu tylko w obrębie danego obszaru nazw.Another common need is to limit traffic to only within a given namespace. Jeśli poprzednie przykłady dotyczyły ruchu w przestrzeni nazw deweloperskiej , Utwórz zasady sieci, które uniemożliwiają ruch z innej przestrzeni nazw, takiej jak produkcja, od osiągnięcia do nich zasobników.If the previous examples were for traffic in a development namespace, create a network policy that prevents traffic from another namespace, such as production, from reaching the pods.

Najpierw utwórz nową przestrzeń nazw, aby symulować produkcyjną przestrzeń nazw:First, create a new namespace to simulate a production namespace:

kubectl create namespace production
kubectl label namespace/production purpose=production

Zaplanuj test pod w przestrzeni nazw produkcyjny , który jest oznaczony jako App = webapp, role = fronton.Schedule a test pod in the production namespace that is labeled as app=webapp,role=frontend. Dołącz sesję terminalową:Attach a terminal session:

kubectl run --rm -it frontend --image=alpine --labels app=webapp,role=frontend --namespace production --generator=run-pod/v1

W wierszu polecenia powłoki Użyj, wget Aby potwierdzić, że możesz uzyskać dostęp do domyślnej strony sieci Web Nginx:At the shell prompt, use wget to confirm that you can access the default NGINX webpage:

wget -qO- http://backend.development

Ponieważ etykiety pod pod kątem zgodności są obecnie dozwolone w zasadach sieciowych, ruch jest dozwolony.Because the labels for the pod match what is currently permitted in the network policy, the traffic is allowed. Zasady sieciowe nie sprawdzają się w przestrzeniach nazw, tylko w etykietach pod.The network policy doesn't look at the namespaces, only the pod labels. Następujące przykładowe dane wyjściowe przedstawiają domyślną stronę sieci Web NGINX:The following example output shows the default NGINX webpage returned:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[...]

Wyjdź z dołączonej sesji terminala.Exit out of the attached terminal session. Test pod zostanie automatycznie usunięty.The test pod is automatically deleted.

exit

Aktualizowanie zasad sieciowychUpdate the network policy

Zaktualizujmy sekcję namespaceSelector reguły transferu danych przychodzących, aby zezwalać tylko na ruch z przestrzeni nazw deweloperskich .Let's update the ingress rule namespaceSelector section to only allow traffic from within the development namespace. Edytuj plik manifestu zaplecza-Policy. YAML , jak pokazano w następującym przykładzie:Edit the backend-policy.yaml manifest file as shown in the following example:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: backend-policy
  namespace: development
spec:
  podSelector:
    matchLabels:
      app: webapp
      role: backend
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          purpose: development
      podSelector:
        matchLabels:
          app: webapp
          role: frontend

Bardziej skomplikowane przykłady umożliwiają zdefiniowanie wielu reguł dotyczących ruchu przychodzącego, takich jak namespaceSelector , a następnie podSelector.In more complex examples, you could define multiple ingress rules, like a namespaceSelector and then a podSelector.

Zastosuj zaktualizowane zasady sieci przy użyciu polecenia polecenia kubectl Apply i określ nazwę manifestu YAML:Apply the updated network policy by using the kubectl apply command and specify the name of your YAML manifest:

kubectl apply -f backend-policy.yaml

Testowanie zaktualizowanych zasad sieciowychTest the updated network policy

Zaplanuj inny element pod w przestrzeni nazw produkcyjnej i Dołącz sesję terminala:Schedule another pod in the production namespace and attach a terminal session:

kubectl run --rm -it frontend --image=alpine --labels app=webapp,role=frontend --namespace production --generator=run-pod/v1

W wierszu polecenia powłoki Użyj, wget Aby zobaczyć, że zasady sieciowe odrzucają teraz ruch:At the shell prompt, use wget to see that the network policy now denies traffic:

wget -qO- --timeout=2 http://backend.development
wget: download timed out

Wyjdź z testu pod:Exit out of the test pod:

exit

Mając odmowę ruchu z przestrzeni nazw produkcyjnej , Zaplanuj test na odwrocie w przestrzeni nazw deweloperskiej i Dołącz sesję terminala:With traffic denied from the production namespace, schedule a test pod back in the development namespace and attach a terminal session:

kubectl run --rm -it frontend --image=alpine --labels app=webapp,role=frontend --namespace development --generator=run-pod/v1

W wierszu polecenia powłoki Użyj, wget Aby zobaczyć, że zasady sieciowe zezwalają na ruch:At the shell prompt, use wget to see that the network policy allows the traffic:

wget -qO- http://backend

Ruch jest dozwolony, ponieważ jest zaplanowany w przestrzeni nazw, który jest zgodny z dozwolonymi zasadami sieciowymi.Traffic is allowed because the pod is scheduled in the namespace that matches what's permitted in the network policy. Następujące przykładowe dane wyjściowe przedstawiają domyślną stronę sieci Web NGINX:The following sample output shows the default NGINX webpage returned:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[...]

Wyjdź z dołączonej sesji terminala.Exit out of the attached terminal session. Test pod zostanie automatycznie usunięty.The test pod is automatically deleted.

exit

Czyszczenie zasobówClean up resources

W tym artykule utworzyliśmy dwie przestrzenie nazw i zastosowano zasady sieci.In this article, we created two namespaces and applied a network policy. Aby wyczyścić te zasoby, użyj polecenia polecenia kubectl Delete i określ nazwy zasobów:To clean up these resources, use the kubectl delete command and specify the resource names:

kubectl delete namespace production
kubectl delete namespace development

Następne krokiNext steps

Aby uzyskać więcej informacji o zasobach sieciowych, zobacz pojęcia dotyczące sieci dla aplikacji w usłudze Azure Kubernetes Service (AKS).For more about network resources, see Network concepts for applications in Azure Kubernetes Service (AKS).

Aby dowiedzieć się więcej na temat zasad, zobacz Kubernetes Network policies.To learn more about policies, see Kubernetes network policies.