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에 연결할 수 있는지 확인합니다.
PowerShell 창을 열고 명령을 사용하여 대상 클러스터에 대한 자격 증명을 로드합니다
Get-AksHciCredential
.porter Pod IP 주소를 확인하는 데 사용합니다
kubectl
.kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
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 주소는 환경 설정에 따라 달라질 수 있습니다.
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> <...
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 파일 적용
PowerShell 창을 엽니다.
명령을 사용하여 대상 클러스터에 대한 자격 증명을 로드합니다
Get-AksHciCredential
.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 간의 트래픽을 보호하는 방법을 알아보았습니다. 다음으로, 다음을 수행할 수 있습니다.