다음을 통해 공유


Calico 네트워크 정책을 사용하여 Pod 트래픽 보호

적용 대상: Azure Stack HCI 22H2의 AKS, Windows Server의 AKS

이 방법 가이드를 사용하여 기본 Pod-Pod 연결을 확인하고 사용해 보며 Arc 배포에서 사용하도록 설정된 AKS의 클러스터에서 Calico 네트워크 정책을 사용합니다. 이 문서에서는 Linux 및 Windows 노드에서 클라이언트 및 서버 Pod를 만들고, Pod 간의 연결을 확인한 다음, 기본 네트워크 정책을 적용하여 AKS Arc에서 Pod 트래픽을 격리하는 방법을 설명합니다.

필수 조건

AKS Arc를 배포하려면 단계에 따라 AKS 호스트를 설정합니다.

이 가이드를 사용하려면 다음이 필요합니다.

  • AKS 워크로드 클러스터.
  • 클러스터에 배포된 Windows 작업자 노드가 하나 이상 있습니다.
  • 클러스터에 배포된 Linux 작업자 노드가 하나 이상 있습니다.
  • 워크로드 클러스터를 만들 때 Calico 네트워크 플러그 인을 사용하도록 설정해야 합니다. 이 플러그 인을 사용하도록 설정하지 않은 경우 지침을 참조 New-AksHciCluster 하세요.

Linux 노드에서 Pod 만들기

먼저 Linux 노드에서 클라이언트 Pod, busybox 및 서버 Pod( nginx)를 만듭니다.

policy-demo-linux.yaml이라는 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

Kubernetes 클러스터에 policy-demo-linux.yaml 파일 적용

PowerShell 창을 열고 명령을 사용하여 대상 클러스터에 대한 자격 증명을 로드합니다 Get-AksHciCredential .

다음으로 다음과 같이 구성을 policy-demo-linux.yaml 적용하는 데 사용합니다kubectl.

kubectl apply -f policy-demo-linux.yaml

Windows 노드에서 Pod 만들기

Windows 노드에서 클라이언트 Pod pwsh 및 서버 Pod porter 를 만듭니다.

참고 항목

Pod 매니페스트는 에 기반한 mcr.microsoft.com/windows/servercore:1809이미지를 사용합니다. 최신 Windows Server 버전을 사용하는 경우 Windows Server 버전과 일치하는 Server Core 이미지를 사용하도록 매니페스트를 업데이트합니다.

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

Kubernetes 클러스터에 policy-demo-windows.yaml 파일 적용

PowerShell 창을 열고 명령을 사용하여 대상 클러스터에 대한 자격 증명을 로드합니다 Get-AksHciCredential .

다음으로, 구성을 적용하는 데 사용합니다kubectl.policy-demo-windows.yaml

kubectl apply -f policy-demo-windows.yaml

4개의 Pod가 만들어지고 실행 중인지 확인합니다.

참고 항목

네트워크 다운로드 속도에 따라 Windows Pod를 시작하는 데 시간이 걸릴 수 있습니다.

PowerShell 창을 열고 명령을 사용하여 대상 클러스터에 대한 자격 증명을 로드합니다 Get-AksHciCredential .

다음으로 네임스페이스의 Pod를 나열하는 calico-demo 데 사용합니다kubectl.

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

출력에 실행 중 상태의 4개 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

Linux 및 Windows 노드의 Pod 간 연결 확인

이제 클라이언트 및 서버 Pod가 Linux 및 Windows 노드 모두에서 실행되고 있으므로 Linux 노드의 클라이언트 Pod가 Windows 노드의 서버 Pod에 연결할 수 있는지 확인합니다.

  1. PowerShell 창을 열고 명령을 사용하여 대상 클러스터에 대한 자격 증명을 로드합니다 Get-AksHciCredential .

  2. porter Pod IP 주소를 확인하는 데 사용합니다 kubectl .

    kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
    
  3. busybox Pod에 로그인하고 포트 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
    

    busybox Pod에서 porter Pod로의 연결이 성공하면 다음 예제와 유사한 출력이 표시됩니다.

    192.168.40.166 (192.168.40.166:80) open
    

    참고 항목

    반환되는 IP 주소는 환경 설정에 따라 달라질 수 있습니다.

  4. pwsh Pod가 nginx Pod에 도달할 수 있는지 확인합니다.

    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. pwsh Pod가 porter 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 간에 통신이 가능한지 확인했습니다.

Windows 클라이언트 Pod에 정책 적용

실제 배포에서는 서로 통신해야 하는 Pod만 이 작업을 수행할 수 있도록 하려고 합니다. 이를 위해 busybox Pod만 porter Pod에 도달할 수 있도록 하는 기본 네트워크 정책을 적용합니다.

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. network-policy.yaml 파일을 적용하는 데 사용합니다 kubectl .

    kubectl apply -f network-policy.yaml
    

정책이 적용되는지 확인

정책이 적용된 상태에서 busybox Pod는 여전히 포터 포드에 연결할 수 있어야 합니다. 앞에서 설명한 대로 명령줄의 단계를 결합할 수 있습니다.

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

그러나 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

이 데모에서는 Linux 및 Windows 노드에서 Pod를 구성하고, 기본 Pod 연결을 확인했으며, Pod 간 트래픽을 격리하는 기본 네트워크 정책을 시도했습니다.

마지막 단계로 모든 데모 리소스를 정리할 수 있습니다.

kubectl delete namespace calico-demo

다음 단계

이 문서에서는 네트워크 정책을 사용하여 Pod 간의 트래픽을 보호하는 방법을 알아보았습니다. 다음으로, 다음을 수행할 수 있습니다.