Поделиться через


Использование политики сети Calico для защиты трафика pod

Область применения: AKS в Azure Stack HCI 22H2, AKS на Windows Server

Используйте это руководство, чтобы проверить и попробовать базовое подключение pod-to-pod и использовать политики сети Calico в кластере в AKS, включенном развертыванием Arc. В этой статье описывается, как создавать клиентские и серверные модули pod на узлах Linux и Windows, проверять подключение между модулями pod, а затем применять базовую сетевую политику для изоляции трафика pod в AKS Arc.

Необходимые компоненты

Чтобы развернуть AKS Arc, выполните действия по настройке узла AKS.

Чтобы использовать это руководство, вам потребуется:

  • Кластер рабочей нагрузки AKS.
  • По крайней мере один рабочий узел Windows, развернутый в кластере.
  • По крайней мере один рабочий узел Linux, развернутый в кластере.
  • Подключаемый модуль сети Calico должен быть включен при создании кластера рабочей нагрузки. Если этот подключаемый модуль не включен, см New-AksHciCluster . инструкции.

Создание модулей pod на узлах Linux

Сначала создайте клиентский модуль pod, busybox и серверный pod, nginx на узлах Linux.

Создание файла YAML с именем 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

Применение файла policy-demo-linux.yaml к кластеру Kubernetes

Откройте окно PowerShell и загрузите учетные данные для целевого кластера с помощью Get-AksHciCredential команды.

Затем используйте kubectl для применения policy-demo-linux.yaml конфигурации следующим образом:

kubectl apply -f policy-demo-linux.yaml

Создание модулей pod на узлах Windows

Создайте модуль pod клиента и модуль pod pwshporter сервера на узлах Windows.

Примечание.

Манифесты pod используют изображения на mcr.microsoft.com/windows/servercore:1809основе. Если вы используете более последнюю версию Windows Server, обновите манифесты, чтобы использовать образ ядра сервера, соответствующий версии Windows Server.

Создание политики-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

Применение файла policy-demo-windows.yaml к кластеру Kubernetes

Откройте окно PowerShell и загрузите учетные данные для целевого кластера с помощью Get-AksHciCredential команды.

Затем используйте kubectl для применения конфигурации policy-demo-windows.yaml :

kubectl apply -f policy-demo-windows.yaml

Проверка создания и запуска четырех модулей pod

Примечание.

В зависимости от скорости загрузки сети может потребоваться время для запуска модулей pod Windows.

Откройте окно PowerShell и загрузите учетные данные для целевого кластера с помощью Get-AksHciCredential команды.

Затем используйте kubectl для перечисления модулей pod в calico-demo пространстве имен:

kubectl get pods --namespace calico-demo

Выходные данные должны соответствовать следующему примеру.

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

Повторите команду каждые несколько минут, пока выходные данные не отображают все четыре модуля pod в состоянии выполнения.

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

Проверка подключения между модулями pod на узлах Linux и Windows

Теперь, когда клиентские и серверные модули pod выполняются на узлах Linux и Windows, убедитесь, что клиентские модули pod на узлах Linux могут получать доступ к модулям pod сервера на узлах Windows.

  1. Откройте окно PowerShell и загрузите учетные данные для целевого кластера с помощью Get-AksHciCredential команды.

  2. Используется kubectl для определения IP-адреса модуля pod порта:

    kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
    
  3. Войдите в pod busybox и попытайтесь связаться с модулем pod porter через порт 80. Замените тег "<porter_ip>" IP-адресом, возвращенным предыдущей командой:

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

    Вы также можете объединить оба предыдущих шага:

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

    Если подключение из pod busybox к модулем porter pod успешно выполнено, вы получите выходные данные, аналогичные следующему примеру:

    192.168.40.166 (192.168.40.166:80) open
    

    Примечание.

    Возвращаемые IP-адреса могут отличаться в зависимости от настройки среды.

  4. Убедитесь, что pod pwsh может достичь модуля pod 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
    

    Если подключение выполнено успешно, вы увидите следующие выходные данные:

    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. Убедитесь, что pod pwsh может достичь модуля pod портера :

    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
    

    Если это успешно, вы увидите выходные данные, аналогичные следующему примеру:

    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
    
    

Теперь вы проверили, что связь возможна между всеми модулями pod в приложении.

Применение политики к модулем pod клиента Windows

В реальном развертывании необходимо убедиться, что для этого разрешены только модули pod, которые должны взаимодействовать друг с другом. Для этого применяется базовая сетевая политика, которая позволяет получить доступ только к модулем pod busybox.

Создание файла 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

Применение файла network-policy.yaml

  1. Откройте окно PowerShell.

  2. Загрузите учетные данные для целевого кластера с помощью Get-AksHciCredential команды.

  3. Используйте для kubectl применения файла network-policy.yaml:

    kubectl apply -f network-policy.yaml
    

Проверка того, что политика действует

При использовании политики модуль pod busybox должен по-прежнему находиться в модуле porter pod. Как отмечалось ранее, можно объединить шаги в командной строке:

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

Однако pod pwsh не может достичь модуля pod портера:

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

Время ожидания запроса с сообщением, аналогичным этому:

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

В этой демонстрации мы настроили модули pod на узлах Linux и Windows, проверили базовое подключение pod и попробовали базовую сетевую политику, чтобы изолировать трафик pod-to-pod.

В качестве последнего шага можно очистить все демонстрационные ресурсы:

kubectl delete namespace calico-demo

Следующие шаги

Из этой статьи вы узнали, как защитить трафик между модулями pod с помощью политик сети. Далее вы можете выполнить такую задачу: