Использование политики сети 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 pwsh
porter
сервера на узлах 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.
Откройте окно PowerShell и загрузите учетные данные для целевого кластера с помощью
Get-AksHciCredential
команды.Используется
kubectl
для определения IP-адреса модуля pod порта:kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
Войдите в 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-адреса могут отличаться в зависимости от настройки среды.
Убедитесь, что 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> <...
Убедитесь, что 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
Откройте окно PowerShell.
Загрузите учетные данные для целевого кластера с помощью
Get-AksHciCredential
команды.Используйте для
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 с помощью политик сети. Далее вы можете выполнить такую задачу: