Zabezpečení provozu mezi pody pomocí zásad sítě v hybridní službě AKS

Platí pro: AKS v Azure Stack HCI, AKS na Windows Serveru

Pomocí tohoto podrobného průvodce můžete ověřit a vyzkoušet základní připojení pod-to-pod a použít zásady sítě Calico v clusteru v nasazení Azure Kubernetes Server (AKS). V této příručce se dozvíte, jak vytvořit klientské a serverové pody v uzlech s Linuxem a Windows, ověřit připojení mezi pody a pak pomocí základních zásad sítě izolovat provoz podů v hybridním prostředí AKS.

Požadavky

Pokud chcete nasadit hybridní AKS, postupujte podle pokynů k nastavení hostitele AKS.

Pokud chcete použít tohoto průvodce, budete potřebovat:

  • Cluster úloh AKS.
  • Alespoň jeden pracovní uzel Windows nasazený v clusteru.
  • Alespoň jeden pracovní uzel Linuxu nasazený v clusteru.
  • Při vytváření clusteru úloh musí být povolený síťový modul plug-in Calico. Pokud tento modul plug-in není povolený, přečtěte si New-AksHciCluster pokyny.

Vytváření podů na uzlech s Linuxem

Nejprve na linuxových uzlech vytvořte pod klienta, busybox a serverový pod nginx.

Vytvořte soubor YAML s názvem policy-demo-linux.yaml.


apiVersion: v1
kind: Namespace
metadata:
  name: calico-demo

---

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: busybox
  name: busybox
  namespace: calico-demo
spec:
  containers:
  - args:
    - /bin/sh
    - -c
    - sleep 360000
    image: busybox:1.28
    imagePullPolicy: Always
    name: busybox
  nodeSelector:
    beta.kubernetes.io/os: linux

---

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: calico-demo
spec:
  containers:
  - name: nginx
    image: nginx:1.8
    ports:
    - containerPort: 80
  nodeSelector:
    beta.kubernetes.io/os: linux

Použití souboru policy-demo-linux.yaml na cluster Kubernetes

Otevřete okno PowerShellu a pomocí Get-AksHciCredential příkazu načtěte přihlašovací údaje pro cílový cluster.

Dále použijte kubectlpolicy-demo-linux.yaml konfiguraci, jak je znázorněno níže:

kubectl apply -f policy-demo-linux.yaml

Vytváření podů na uzlech Windows

Na uzlech s Windows vytvořte pod klienta pwsh a porter podů serveru.

Poznámka

Manifest podů používá image založené na mcr.microsoft.com/windows/servercore:1809. Pokud používáte novější verzi Windows Serveru, aktualizujte manifesty tak, aby používaly image jádra serveru, která odpovídá vaší verzi Windows Serveru.

Vytvoření souboru policy-demo-windows.yaml


apiVersion: v1
kind: Pod
metadata:
  name: pwsh
  namespace: calico-demo
  labels:
    app: pwsh
spec:
  containers:
  - name: pwsh
    image: mcr.microsoft.com/windows/servercore:1809
    args:
    - powershell.exe
    - -Command
    - "Start-Sleep 360000"
    imagePullPolicy: IfNotPresent
  nodeSelector:
    kubernetes.io/os: windows
---
apiVersion: v1
kind: Pod
metadata:
  name: porter
  namespace: calico-demo
  labels:
    app: porter
spec:
  containers:
  - name: porter
    image: calico/porter:1809
    ports:
    - containerPort: 80
    env:
    - name: SERVE_PORT_80
      value: This is a Calico for Windows demo.
    imagePullPolicy: IfNotPresent
  nodeSelector:
    kubernetes.io/os: windows

Použití souboru policy-demo-windows.yaml na cluster Kubernetes

Otevřete okno PowerShellu a pomocí Get-AksHciCredential příkazu načtěte přihlašovací údaje pro cílový cluster.

Dále použijte kubectlpolicy-demo-windows.yaml konfiguraci pomocí příkazu :

kubectl apply -f policy-demo-windows.yaml

Ověřte, že jsou čtyři pody vytvořené a spuštěné.

Poznámka

V závislosti na rychlosti stahování ze sítě může spuštění podů Windows nějakou dobu trvat.

Otevřete okno PowerShellu a pomocí Get-AksHciCredential příkazu načtěte přihlašovací údaje pro cílový cluster.

Dále pomocí příkazu kubectl vypište pody v calico-demo oboru názvů :

kubectl get pods --namespace calico-demo

Měl by se zobrazit výstup podobný následujícímu:

NAME      READY   STATUS              RESTARTS   AGE
busybox   1/1     Running             0          4m14s
nginx     1/1     Running             0          4m14s
porter    0/1     ContainerCreating   0          74s
pwsh      0/1     ContainerCreating   0          2m9s

Opakujte příkaz každých několik minut, dokud se ve výstupu nezobrazí všechny čtyři pody ve stavu Spuštěno.

NAME      READY   STATUS    RESTARTS   AGE
busybox   1/1     Running   0          7m24s
nginx     1/1     Running   0          7m24s
porter    1/1     Running   0          4m24s
pwsh      1/1     Running   0          5m19s

Kontrola připojení mezi pody v uzlech s Linuxem a Windows

Teď, když jsou pody klienta a serveru spuštěné na linuxových i windowsových uzlech, ověřte, že se klientské pody na linuxových uzlech můžou dostat k podům serveru na uzlech s Windows.

  1. Otevřete okno PowerShellu a pomocí Get-AksHciCredential příkazu načtěte přihlašovací údaje pro cílový cluster.

  2. Pomocí příkazu kubectl určete IP adresu podu porteru:

    kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
    
  3. Přihlaste se k podu busybox a zkuste se připojit k podu porteru na portu 80. <Nahraďte značku porter_ip> IP adresou vrácenou předchozím příkazem.

    kubectl exec --namespace calico-demo busybox -- nc -vz <porter_ip> 80
    

    Oba výše uvedené kroky můžete také zkombinovat:

    kubectl exec --namespace calico-demo busybox -- nc -vz $(kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}') 80
    

    Pokud připojení z podu busybox k podu porteru proběhne úspěšně, zobrazí se výstup podobný následujícímu:

    192.168.40.166 (192.168.40.166:80) open
    

    Poznámka

    Vrácené IP adresy se budou lišit v závislosti na nastavení vašeho prostředí.

  4. Ověřte, že se pod pwsh může spojit s podem nginx :

    kubectl exec --namespace calico-demo pwsh -- powershell Invoke-WebRequest -Uri http://$(kubectl get po nginx -n calico-demo -o 'jsonpath={.status.podIP}') -UseBasicParsing -TimeoutSec 5
    

    Pokud připojení proběhne úspěšně, zobrazí se výstup podobný následujícímu:

    StatusCode        : 200
    StatusDescription : OK
    Content           : <!DOCTYPE html>
                        <html>
                        <head>
                        <title>Welcome to nginx!</title>
                        <style>
                            body {
                                width: 35em;
                                margin: 0 auto;
                                font-family: Tahoma, Verdana, Arial, sans-serif;
                            }
                        </style>
                        <...
    
  5. Ověřte, že se pod pwsh může spojit s podem porteru :

    kubectl exec --namespace calico-demo pwsh -- powershell Invoke-WebRequest -Uri http://$(kubectl get po porter -n calico-demo -o 'jsonpath={.status.podIP}') -UseBasicParsing -TimeoutSec 5
    

    Pokud se to podaří, zobrazí se něco podobného, co je znázorněno níže:

    StatusCode        : 200
    StatusDescription : OK
    Content           : This is a Calico for Windows demo.
    RawContent        : HTTP/1.1 200 OK
                        Content-Length: 49
                        Content-Type: text/plain; charset=utf-8
                        Date: Fri, 21 Aug 2020 22:45:46 GMT
    
                        This is a Calico for Windows demo.
    Forms             :
    Headers           : {[Content-Length, 49], [Content-Type, text/plain;
                        charset=utf-8], [Date, Fri, 21 Aug 2020 22:45:46 GMT]}
    Images            : {}
    InputFields       : {}
    Links             : {}
    ParsedHtml        :
    RawContentLength  : 49
    
    

Ověřili jste, že je komunikace mezi všemi pody v aplikaci možná.

Použití zásady na klientský pod Windows

V reálném nasazení byste chtěli zajistit, aby to umožňovaly jenom pody, které spolu mají komunikovat.

Abyste toho dosáhli, použijete základní zásady sítě, které umožní přístup k podu porteru pouze podu busybox.

Vytvoření souboru network-policy.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-busybox
  namespace: calico-demo
spec:
  podSelector:
    matchLabels:
      app: porter
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: busybox
    ports:
    - protocol: TCP
      port: 80

Použití souboru network-policy.yaml

  1. Otevřete okno PowerShellu.

  2. Pomocí příkazu načtěte přihlašovací údaje pro cílový cluster Get-AksHciCredential .

  3. Použijte kubectl k použití souboru network-policy.yaml.

    kubectl apply -f network-policy.yaml
    

Ověřte, že zásady platí.

Po nastavení zásad by pod busybox stále měl být schopný se spojit s podem porteru . Jak je uvedeno dříve v tomto tématu, můžete kroky zkombinovat na příkazovém řádku:

kubectl exec --namespace calico-demo busybox -- nc -vz $(kubectl get po porter -n calico-demo -o 'jsonpath={.status.podIP}') 80

Pod pwsh se ale nebude moct spojit s podem porteru :

kubectl exec --namespace calico-demo pwsh -- powershell Invoke-WebRequest -Uri http://$(kubectl get po porter -n calico-demo -o 'jsonpath={.status.podIP}') -UseBasicParsing -TimeoutSec 5

Vypršení časového limitu požadavku se zprávou, jako je tato:

Invoke-WebRequest : The operation has timed out.
At line:1 char:1
+ Invoke-WebRequest -Uri http://192.168.40.166 -UseBasicParsing -Timeout ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:Htt
pWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
command terminated with exit code 1

V této ukázce jsme nakonfigurovali pody na uzlech s Linuxem a Windows, ověřili základní připojení k podům a vyzkoušeli základní zásady sítě pro izolaci provozu mezi pody.

Jako poslední krok můžete vyčistit všechny ukázkové prostředky:

kubectl delete namespace calico-demo

Další kroky

V tomto článku jste zjistili, jak zabezpečit provoz mezi pody pomocí zásad sítě. Dále můžete: