AKS(Azure Kubernetes Service) 클러스터에서 부하 분산 장치 리소스를 만들 때 할당된 공용 IP 주소는 해당 리소스의 수명 동안만 유효합니다. Kubernetes 서비스를 삭제하면 연결된 부하 분산 장치 및 IP 주소도 삭제됩니다. 특정 IP 주소를 할당하거나 재배포된 Kubernetes 서비스의 IP 주소를 유지하려는 경우에는 고정 공용 IP 주소를 만들어 사용할 수 있습니다.
이 문서에서는 고정 공용 IP 주소를 만들어 Kubernetes 서비스에 할당하는 방법을 설명합니다.
시작하기 전에
- Azure CLI 2.0.59 이상 버전을 설치하고 구성해야 합니다.
az --version을 실행하여 버전을 찾습니다. 설치 또는 업그레이드를 위해서는 Azure CLI 설치를 참조하세요. - 이 문서에서는 표준 SKU 부하 분산 장치로 표준 SKU IP를 사용하는 방법을 설명합니다. 자세한 내용은 Azure에서 IP 주소 형식 및 할당 메서드를 참조하세요.
AKS 클러스터 만들기
az group create명령을 사용하여 Azure 리소스 그룹을 만듭니다.az group create --name myNetworkResourceGroup --location eastus명령을 사용하여 AKS 클러스터를 만듭니다
az aks create.az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
고정 IP 주소 만들기
az aks show명령을 사용하여 노드 리소스 그룹의 이름을 가져오고nodeResourceGroup속성을 쿼리합니다.az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv명령을 사용하여 노드 리소스 그룹에 고정 공용 IP 주소를 만듭니다
az network public-ip create.az network public-ip create \ --resource-group <node resource group name> \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static중요
AKS는 더 이상 기본 Load Balancer 지원하지 않습니다. 클러스터에서 기본 Load Balancer 사용하는 경우 고정 공용 IP 주소를 구성하기 전에 표준 Load Balancer 업그레이드합니다.
명령을 사용하여 고정 공용 IP 주소를 가져옵니다
az network public-ip show. 생성한 노드 리소스 그룹 이름과 공용 IP 주소를 지정한 다음ipAddress를 쿼리합니다.az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
고정 IP 주소를 사용하여 Kubernetes 서비스 만들기
명명
load-balancer-service.yaml된 파일을 만들고 다음 YAML 파일의 내용에 복사합니다. 고정 IP 주소 만들기 섹션에서 만든 공용 IP 리소스 이름(myAKSPublicIP)과 노드 리소스 그룹 이름을 제공합니다.AKS 컨트롤 플레인 ID에는 기본적으로 노드 리소스 그룹에 대한 기여자 권한이 있으므로 이 문서에서 만든 공용 IP에는 다른 역할 할당이 필요하지 않습니다. 다른 리소스 그룹에서 인바운드 또는 아웃바운드 공용 IP를 사용하는 경우 컨트롤 플레인 ID에 해당 리소스 그룹에 필요한 권한을 부여합니다. 자세한 내용은 AKS의 관리 ID를 참조하세요.
중요
loadBalancerIPKubernetes 서비스 매니페스트의 속성은 업스트림 Kubernetes 다음에 사용되지 않습니다. 기존 서비스는 수정 없이 계속 작동하지만 대신 서비스 주석을 사용합니다.Annotation Purpose service.beta.kubernetes.io/azure-pip-name공용 IP 리소스 이름을 지정합니다. service.beta.kubernetes.io/azure-load-balancer-ipv4IPv4 주소를 지정합니다. service.beta.kubernetes.io/azure-load-balancer-ipv6IPv6 주소를 지정합니다. apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer참고
service.beta.kubernetes.io/azure-pip-name주석을 추가하면 LoadBalancer를 가장 효율적으로 생성할 수 있으며, 잠재적인 스로틀링을 방지하기 위해 강력히 권장됩니다.service.beta.kubernetes.io/azure-dns-label-name서비스 주석을 사용하여 서비스에 공용 DNS 레이블을 설정합니다. 이렇게 하면 Azure의 퍼블릭 DNS 서버 및 최상위 도메인을 사용하여 서비스에 FQDN(정규화된 도메인 이름)이 게시됩니다. 주석 값은 Azure 위치 내에서 고유해야 하므로 충분히 정규화된 레이블을 사용하는 것이 좋습니다. Azure는<location>.cloudapp.azure.com과 같이 선택된 위치의 기본 접미사를 제공된 이름에 자동으로 추가하여 FQDN을 만듭니다.참고
고유의 도메인에 서비스를 게시하려면 Azure DNS 및 external-dns 프로젝트를 참조하세요.
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label> name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer서비스를 만들기 전에 클러스터에
app: azure-load-balancer레이블을 사용하는 Pod가 포함된 워크로드가 있는지 확인하세요. 서비스 매니페스트는 이 레이블이 있는 Pod를 선택하지만 배포를 만들지는 않습니다.명령을 사용하여 서비스를 만듭니다
kubectl apply.kubectl apply -f load-balancer-service.yaml서비스가 실행 중이며 준비 상태인 Pod를 하나 이상 선택하는지 확인합니다.
kubectl get pods -l app=azure-load-balancer부하 분산 장치의 DNS 레이블을 보려면
kubectl describe명령을 사용합니다.kubectl describe service azure-load-balancerDNS 레이블은 다음 압축된 예제 출력과 같이
Annotations아래에 나열됩니다.Name: azure-load-balancer Namespace: default Labels: <none> Annotations: service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
문제 해결
이 섹션에서는 고정 IP 주소 만들기를 완료하고, 고정 IP 주소를사용하여 Kubernetes 서비스 만들기의 단계를 시도했으며, 실행 중인 AKS 클러스터가 있다고 가정합니다. 노드 리소스 그룹 이름을 검색하려면 .를 사용합니다 az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv.
주석에 명명된 service.beta.kubernetes.io/azure-pip-name 공용 IP 리소스가 지정된 service.beta.kubernetes.io/azure-load-balancer-resource-group리소스 그룹에 없거나 AKS 컨트롤 플레인 ID가 해당 리소스 그룹에 액세스할 수 없는 경우 부하 분산 장치 서비스 만들기가 실패합니다. 문제를 해결하려면 kubectl describe 명령을 사용하여 서비스 어노테이션과 생성 이벤트를 검토하세요. 다음 예제와 같이 YAML 매니페스트에 지정된 서비스의 이름을 입력합니다.
kubectl describe service azure-load-balancer
출력에는 Kubernetes Service 리소스에 대한 정보가 표시됩니다. 다음 예제 출력에는 user supplied IP address was not found에 있는 Warning가 표시됩니다: "Events." 이 시나리오에서는 azure-pip-name 주석이 정적 공용 IP 리소스의 이름과 일치하고, azure-load-balancer-resource-group 주석이 해당 리소스를 포함하는 리소스 그룹과 일치하는지 확인합니다.
Name: azure-load-balancer
Namespace: default
Labels: <none>
Annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
Selector: app=azure-load-balancer
Type: LoadBalancer
IP: 10.0.18.125
IP: 40.121.183.52
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32582/TCP
Endpoints: <pod-ip>:80
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CreatingLoadBalancer 7s (x2 over 22s) service-controller Creating load balancer
Warning CreatingLoadBalancerFailed 6s (x2 over 12s) service-controller Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found
다음 단계
애플리케이션에 대한 네트워크 트래픽을 더 자세히 제어하려면 AKS용 애플리케이션 라우팅 추가 기능을 사용합니다. 앱 라우팅 추가 기능에 대한 자세한 내용은 애플리케이션 라우팅 추가 기능을 사용한 관리형 NGINX Ingress를 참조하세요.