AKS에서 네트워크 정책을 사용하여 Pod 간 트래픽 보호

Kubernetes에서 최신 마이크로 서비스 기반 애플리케이션을 실행할 경우 어느 구성 요소들이 서로 통신할 수 있는지 제어하고 싶을 때가 있습니다. 최소 권한 원칙은 AKS(Azure Kubernetes Service) 클러스터의 Pod 간에 트래픽이 흐르는 방식에 적용되어야 합니다. 예를 들어 백 엔드 애플리케이션으로의 직접 트래픽을 차단할 수 있습니다. Kubernetes의 네트워크 정책 기능을 사용하면 클러스터의 Pod 간 송수신 트래픽의 규칙을 정의할 수 있습니다.

이 문서에서는 네트워크 정책을 사용하여 Azure Kubernetes Service에서 pod 간 트래픽 흐름을 제어하는 방법을 보여줍니다. 네트워크 정책은 AKS의 Linux 기반 또는 Windows 기반 노드 및 Pod에 사용할 수 있습니다.

네트워크 정책 개요

기본적으로 Azure Kubernetes Service 클러스터의 모든 pod는 트래픽을 제한 없이 송수신할 수 있습니다. 보안을 강화하기 위해 트래픽의 흐름을 제어하는 규칙을 정의할 수 있습니다. 예를 들어, 필요한 프런트 엔드 서비스에만 백 엔드 애플리케이션이 노출되는 경우가 많습니다. 또는 데이터베이스 구성 요소에 연결하는 애플리케이션 계층에서만 데이터베이스 구성 요소에 액세스할 수 있습니다.

네트워크 정책은 Pod 간의 통신에 대한 액세스 정책을 정의하는 Kubernetes 사양입니다. 네트워크 정책을 사용하는 경우 트래픽을 보내고 받을 순서가 지정된 규칙 집합을 정의합니다. 하나 이상의 레이블 선택기와 일치하는 Pod 컬렉션에 이러한 규칙을 적용합니다.

이 네트워크 정책 규칙은 YAML 매니페스트로 정의됩니다. 배포 또는 서비스도 만드는 보다 광범위한 매니페스트의 일부로 네트워크 정책을 포함할 수 있습니다.

Azure Kubernetes Service의 네트워크 정책 옵션

Azure는 네트워크 정책을 적용하기 위한 세 가지 네트워크 정책 엔진을 제공합니다.

Cilium은 권장되는 네트워크 정책 엔진입니다. Cilium은 일반적으로 "IPTables"보다 효율적인 Linux BPF(Berkeley Packet Filter)를 사용하여 트래픽에 네트워크 정책을 적용합니다. 자세한 내용은 Cilium을 기반으로 구동되는 Azure CNI 설명서를 참조하세요.
Linux용 Azure Network Policy Manager는 Linux IPTables를 사용하여 지정된 정책을 적용합니다. Windows용 Azure Network Policy Manager는 HNS(호스트 네트워크 서비스) ACLPolicies를 사용합니다. 정책은 허용 및 허용되지 않는 IP 쌍 집합으로 변환됩니다. 이러한 쌍은 IPTable 또는 HNS ACLPolicy 필터 규칙으로 프로그래밍됩니다.

네트워크 정책 엔진 간의 차이점: Cilium, Azure NPM 및 Calico

기능 Azure Network Policy Manager Calico Cilium
지원되는 플랫폼 Linux, Windows Server 2022(미리 보기). Linux, Windows Server 2019 및 2022. Linux
지원되는 네트워킹 옵션 Azure CNI(Container Networking Interface). Azure CNI(Linux, Windows Server 2019 및 2022) 및 kubenet(Linux). Azure CNI.
Kubernetes 사양 준수 지원되는 모든 정책 유형 모든 정책 유형이 지원됩니다. 모든 정책 유형이 지원됩니다.
기타 기능 없음 글로벌 네트워크 정책, 글로벌 네트워크 집합 및 호스트 엔드포인트로 구성된 확장 정책 모델. calicoctlCLI를 사용하여 이러한 확장 기능을 관리하는 방법에 대한 자세한 내용은 calicoctl 사용자 참조를 참조하세요. 없음
지원 Azure 지원 및 엔지니어링 팀에서 지원됩니다. Azure 지원 및 엔지니어링 팀에서 지원됩니다. Azure 지원 및 엔지니어링 팀에서 지원됩니다.

제한 사항

Azure Network Policy Manager는 IPv6을 지원하지 않습니다. 그렇지 않을 경우 Azure Network Policy Manager가 Linux의 네트워크 정책 사양을 완전히 지원합니다.

Azure Network Policy Manager는 Windows에서 다음을 지원하지 않습니다.

  • 명명된 포트.
  • SCTP(Stream Control Transmission Protocol).
  • 음수 일치 레이블 또는 네임스페이스 선택기(예: debug=true를 제외한 모든 레이블)
  • except CIDR(Classless Interdomain Routing) 블록(예외가 있는 CIDR).

참고 항목

지원되지 않는 정책이 만들어지면 Azure Network Policy Manager Pod 로그에 오류가 로그됩니다.

확장

Linux용 Azure Network Policy Manager를 사용하는 경우 크기를 조정할 때 노드 250개와 Pod 20,000개를 초과할 수 없습니다. 이러한 제한을 초과하여 크기를 조정하려고 하면 “OOM(메모리 부족)” 오류가 발생할 수 있습니다. 메모리 제한을 늘리려면 지원 티켓을 만듭니다.

시작하기 전에

Azure CLI 버전 2.0.61 이상이 설치되고 구성되어 있어야 합니다. az --version을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

AKS 클러스터 만들기 및 네트워크 정책 사용

작동 중인 네트워크 정책을 보기 위해 네트워크 정책을 지원하는 AKS 클러스터를 만든 다음, 정책을 추가하는 작업을 수행합니다.

Azure Network Policy Manager를 사용하려면 Azure CNI 플러그 인을 사용해야 합니다. Calico는 Azure CNI 플러그 인이나 Kubenet CNI 플러그 인과 함께 사용할 수 있습니다.

다음 에제 스크립트에서는 시스템 할당 ID로 AKS 클러스터를 만들고 Azure Network Policy Manager를 사용하여 네트워크 정책을 사용하도록 설정합니다.

참고 항목

Calico는 --network-plugin azure 또는 --network-plugin kubenet 매개 변수와 함께 사용할 수 있습니다.

시스템 할당 ID를 사용하는 대신 사용자 할당 ID를 사용할 수도 있습니다. 자세한 내용은 관리 ID 사용을 참조하세요.

Azure Network Policy Manager를 사용하여 AKS 클러스터 만들기 - Linux만 해당

이 섹션에서는 Linux 노드 풀과 Azure Network Policy Manager를 사용하도록 설정된 클러스터를 만드는 작업을 수행합니다.

시작하려면 $RESOURCE_GROUP_NAME$CLUSTER_NAME 변수의 값을 바꿉니다.

$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$LOCATION=canadaeast

AKS 클러스터를 만들고 network-pluginnetwork-policy에 대해 azure를 지정합니다.

클러스터를 만들려면 다음 명령을 사용합니다.

az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --network-plugin azure \
    --network-policy azure

Azure Network Policy Manager를 사용하여 AKS 클러스터 만들기 - Windows Server 2022(미리 보기)

이 섹션에서는 Windows 노드 풀과 Azure Network Policy Manager를 사용하도록 설정된 클러스터를 만드는 작업을 수행합니다.

참고 항목

Windows 노드가 있는 Azure Network Policy Manager는 Windows Server 2022에서만 사용할 수 있습니다.

aks-preview Azure CLI 확장 설치

Important

AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.

aks-preview 확장을 설치하려면 다음 명령을 실행합니다.

az extension add --name aks-preview

릴리스된 확장의 최신 버전으로 업데이트하려면 다음 명령을 실행합니다.

az extension update --name aks-preview

WindowsNetworkPolicyPreview 기능 플래그 등록

다음 예제와 같이 az feature register 명령을 사용하여 WindowsNetworkPolicyPreview 기능 플래그를 등록합니다.

az feature register --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"

상태가 Registered로 표시되는 데 몇 분 정도 걸립니다. az feature show 명령을 사용하여 등록 상태를 확인합니다.

az feature show --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"

상태가 등록됨으로 나타나면 az provider register 명령을 사용하여 Microsoft.ContainerService 리소스 공급자 등록 상태를 새로 고칩니다.

az provider register --namespace Microsoft.ContainerService

AKS 클러스터 만들기

이제 $RESOURCE_GROUP_NAME, $CLUSTER_NAME$WINDOWS_USERNAME 변수의 값을 바꿉니다.

$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$WINDOWS_USERNAME=myWindowsUserName
$LOCATION=canadaeast

클러스터에서 Windows Server 컨테이너의 관리자 자격 증명으로 사용할 사용자 이름을 만듭니다. 다음 명령은 사용자 이름을 입력하라는 메시지를 표시합니다. $WINDOWS_USERNAME로 설정합니다. 이 문서의 명령은 BASH 셸에 입력됩니다.

echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME

클러스터를 만들려면 다음 명령을 사용합니다.

az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --windows-admin-username $WINDOWS_USERNAME \
    --network-plugin azure \
    --network-policy azure

클러스터를 만드는 데 몇 분이 걸립니다. 기본적으로 클러스터는 Linux 노드 풀만 사용하여 만들어집니다. Windows 노드 풀을 사용하려는 경우 노드 풀 하나를 추가하면 됩니다. 예를 들면 다음과 같습니다.

az aks nodepool add \
    --resource-group $RESOURCE_GROUP_NAME \
    --cluster-name $CLUSTER_NAME \
    --os-type Windows \
    --name npwin \
    --node-count 1

Calico를 사용하는 AKS 클러스터 만들기

AKS 클러스터를 만들고 --network-plugin azure--network-policy calico를 지정합니다. --network-policy calico를 지정하면 Linux 및 Windows 노드 풀 모두에서 Calico를 사용할 수 있습니다.

Windows 노드 풀을 클러스터에 추가하려는 경우 Windows Server 암호 요구 사항을 충족하는 클러스터에 windows-admin-usernamewindows-admin-password 매개 변수를 포함합니다.

Important

현재 Windows 노드와 함께 Calico 네트워크 정책을 사용하는 것은 Calico 3.17.2가 설치된 Kubernetes 버전 1.20 이상을 사용하는 새 클러스터에서 제공되며, Azure CNI 네트워킹을 사용해야 합니다. Calico가 사용하도록 설정된 AKS 클러스터의 Windows 노드에는 기본적으로 부동 IP도 사용하도록 설정되어 있습니다.

이전 버전의 Calico에서 Kubernetes 1.20을 실행하는 Linux 노드 풀만 사용하는 클러스터의 경우에는 Calico 버전이 자동으로 3.17.2로 업그레이드됩니다.

클러스터에서 Windows Server 컨테이너의 관리자 자격 증명으로 사용할 사용자 이름을 만듭니다. 다음 명령은 사용자 이름을 입력하라는 메시지를 표시합니다. $WINDOWS_USERNAME로 설정합니다. 이 문서의 명령은 BASH 셸에 입력됩니다.

echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --windows-admin-username $WINDOWS_USERNAME \
    --network-plugin azure \
    --network-policy calico

클러스터를 만드는 데 몇 분이 걸립니다. 기본적으로 클러스터는 Linux 노드 풀만 사용하여 만들어집니다. Windows 노드 풀을 사용하려는 경우 노드 풀 하나를 추가하면 됩니다. 예시:

az aks nodepool add \
    --resource-group $RESOURCE_GROUP_NAME \
    --cluster-name $CLUSTER_NAME \
    --os-type Windows \
    --name npwin \
    --node-count 1

기존 클러스터에 Azure Network Policy Manager 또는 Calico 설치

기존 AKS 클러스터에 Azure Network Policy Manager 또는 Calico를 설치하는 것도 지원됩니다.

Warning

업그레이드 프로세스는 각 노드 풀을 동시에 이미지로 다시 생성하도록 트리거합니다. 각 노드 풀을 개별적으로 업그레이드하는 것은 지원되지 않습니다. 클러스터 네트워킹 중단은 노드 풀의 각 노드가 다시 이미지화되는 노드 이미지 업그레이드 또는 Kubernetes 버전 업그레이드와 유사합니다.

Azure Network Policy Manager를 설치하기 위한 예제 명령:

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy azure

Calico를 설치하기 위한 예제 명령:

Warning

이 경고는 Calico가 사용하도록 설정된 Kubenet 클러스터를 Calico를 사용하도록 설정된 Azure CNI 오버레이로 업그레이드하는 데 적용됩니다.

  • Calico가 사용하도록 설정된 Kubenet 클러스터에서 Calico는 CNI 및 네트워크 정책 엔진으로 사용됩니다.
  • Azure CNI 클러스터에서 Calico는 CNI가 아닌 네트워크 정책 적용에만 사용됩니다. 이로 인해 Pod가 시작되는 시간과 Calico가 Pod에서 아웃바운드 트래픽을 허용하는 시점 사이에 짧은 지연이 발생할 수 있습니다.

이 문제를 방지하려면 Calico 대신 Cilium을 사용하는 것이 좋습니다. Cilium으로 구동되는 Azure CNI에서 Cilium에 대해 자세히 알아보세요.

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy calico

Azure NPM 또는 Calico가 설치된 기존 클러스터를 Cilium으로 구동되는 Azure CNI로 업그레이드

네트워크 정책 엔진이 설치된 기존 클러스터를 Cilium으로 구동되는 Azure CNI로 업그레이드하려면 Cilium으로 구동되는 Azure CNI로 기존 클러스터 업그레이드를 참조하세요.

네트워크 정책 설정 확인

클러스터가 준비되면 az aks get-credentials 명령을 사용하여 Kubernetes 클러스터에 연결하도록 kubectl을 구성합니다. 이 명령은 자격 증명을 다운로드하고 해당 자격 증명을 사용하도록 Kubernetes CLI를 구성합니다.

az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME

네트워크 정책 확인을 시작하기 위해 샘플 애플리케이션을 만들고 트래픽 규칙을 설정합니다.

먼저 예제 Pod를 실행하는 demo라는 네임스페이스를 만듭니다.

kubectl create namespace demo

이제 클러스터에 clientserver라는 두 개의 Pod를 만듭니다.

참고 항목

특정 노드에서 클라이언트 또는 서버를 예약하려면 Pod 만들기 kubectl run 명령의 --command 인수 앞에 다음 비트를 추가합니다.

--overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux|windows"}}}'

server Pod를 만듭니다. 이 Pod는 TCP 포트 80에서 제공됩니다.

kubectl run server -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --labels="app=server" --port=80 --command -- /agnhost serve-hostname --tcp --http=false --port "80"

client Pod를 만듭니다. 다음 명령은 client Pod에서 Bash를 실행합니다.

kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --command -- bash

이제 별도의 창에서 다음 명령을 실행하여 서버 IP를 가져옵니다.

kubectl get pod --output=wide -n demo

출력은 다음과 같습니다.

NAME     READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATES
server   1/1     Running   0          30s   10.224.0.72   akswin22000001   <none>           <none>

네트워크 정책 없이 연결 테스트

클라이언트 셸에서 다음 명령을 실행하여 서버와의 연결을 확인합니다. 이전 명령을 실행해 출력에 있는 IP를 사용하여 server-ip를 바꿉니다. 연결에 성공하면 출력이 표시되지 않습니다.

/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp

네트워크 정책으로 연결 테스트

demo-policy.yaml이라는 파일을 만들고 다음 YAML 매니페스트를 붙여넣어 네트워크 정책을 추가합니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: demo-policy
  namespace: demo
spec:
  podSelector:
    matchLabels:
      app: server
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: client
    ports:
    - port: 80
      protocol: TCP

YAML 매니페스트의 이름을 지정하고 kubectl apply를 사용하여 적용합니다.

kubectl apply –f demo-policy.yaml

이제 클라이언트 셸에서 다음 /agnhost 명령을 실행하여 서버와의 연결을 확인합니다.

/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp

서버에 app=server라는 레이블이 지정되어 있지만 클라이언트에는 레이블이 지정되지 않았기 때문에 트래픽과의 연결이 차단됩니다. 위의 connect 명령은 다음 출력을 생성합니다.

TIMEOUT

다음 명령을 실행하여 client에 레이블을 지정하고 서버와의 연결을 확인합니다. 출력에는 아무것도 반환되지 않습니다.

kubectl label pod client -n demo app=client

Azure Network Policy Manager 또는 Calico(미리 보기) 제거

요구 사항:

  • aks-preview Azure CLI 확장 버전 0.5.166 이상 aks-preview Azure CLI 확장 설치를 참조하세요.
  • Azure CLI 버전 2.54 이상
  • AKS REST API 버전 2023-08-02-preview 이상

참고 항목

  • 제거 프로세스는 Calico에서 사용하는 CRD(사용자 지정 리소스 정의) 및 CR(사용자 지정 리소스)을 제거하지 않습니다. 이러한 CRD 및 CR은 모두 이름이 "projectcalico.org" 또는 "tigera.io"로 끝납니다. 이러한 CRD 및 관련 CR은 Calico가 올바르게 제거된 수동으로 삭제할 수 있습니다(Calico를 제거하기 전에 CRD를 삭제하면 클러스터가 중단됨).
  • 업그레이드는 클러스터의 NetworkPolicy 리소스를 제거하지 않지만 제거한 후에는 이러한 정책이 더 이상 적용되지 않습니다.

Warning

업그레이드 프로세스는 각 노드 풀을 동시에 이미지로 다시 생성하도록 트리거합니다. 각 노드 풀을 개별적으로 업그레이드하는 것은 지원되지 않습니다. 클러스터 네트워킹 중단은 노드 풀의 각 노드가 다시 이미지화되는 노드 이미지 업그레이드 또는 Kubernetes 버전 업그레이드와 유사합니다.

클러스터에서 Azure Network Policy Manager 또는 Calico를 제거하려면 다음 명령을 실행합니다.

az aks update
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --network-policy none

리소스 정리

이 문서에서는 네임스페이스와 두 개의 Pod를 만들고 네트워크 정책을 적용했습니다. 이러한 리소스를 정리하려면 kubectl delete 명령을 사용하고 리소스 이름을 지정합니다.

kubectl delete namespace demo

다음 단계

네트워크 리소스에 대한 자세한 내용은 애플리케이션에 대한 AKS(Azure Kubernetes Service)의 네트워크 개념을 참조하세요.

정책에 대한 자세한 내용은 Kubernetes 네트워크 정책을 참조하세요.