AKS(Azure Kubernetes Service) HTTP 프록시 지원

이 문서에서는 아웃바운드 인터넷 액세스에 HTTP 프록시를 사용하도록 AKS(Azure Kubernetes Service) 클러스터를 구성하는 방법에 대해 알아봅니다.

관리되는 가상 네트워크 또는 사용자 지정 가상 네트워크에 배포된 AKS 클러스터에는 제대로 작동하는 데 필요한 특정 아웃바운드 종속성이 있으므로 HTTP 프록시를 통해 인터넷 액세스를 라우팅해야 하는 환경에서 문제가 발생했습니다. 노드는 인터넷 서비스에 액세스하는 데 필요한 구성, 환경 변수 및 인증서를 부트스트랩할 방법이 없었습니다.

HTTP 프록시 기능은 AKS 클러스터에 HTTP 프록시 지원을 추가하여 프록시 종속 환경에서 AKS 필수 네트워크 트래픽을 보호하는 데 사용할 수 있는 간단한 인터페이스를 노출합니다. 이 기능을 사용하면 AKS 노드와 Pod가 모두 HTTP 프록시를 사용하도록 구성됩니다. 또한 이 기능을 사용하면 클러스터 부트스트랩의 일부로 신뢰할 수 있는 인증 기관을 노드에 설치할 수 있습니다. 보다 복잡한 솔루션에서는 네트워크 전반에 걸쳐 보안 통신을 설정하기 위해 신뢰 체인을 만들어야 할 수도 있습니다.

제한 사항 및 고려 사항

다음 시나리오는 지원되지 않습니다.

  • 노드 풀당 다른 프록시 구성
  • 사용자/암호 인증
  • API 서버 통신을 위한 사용자 지정 CA(인증 기관)
  • 신뢰할 수 있는 CA 인증서를 20개 이상 지정할 수 없습니다.
  • Windows 노드 풀이 있는 AKS 클러스터
  • VMAS(가상 머신 가용성 집합)를 사용하는 노드 풀
  • noProxy의 도메인 접미사에 연결된 와일드카드로 * 사용
  • noProxy 호스트는 RFC 1123 규격이어야 합니다.

httpProxy, httpsProxytrustedCa에는 기본적으로 값이 없습니다. Pod에는 다음 환경 변수가 삽입됩니다.

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • NO_PROXY
  • no_proxy

프록시 환경 변수 주입을 사용하지 않도록 설정하려면 Pod에 "kubernetes.azure.com/no-http-proxy-vars":"true" 주석을 달아야 합니다.

시작하기 전에

  • Azure Cloud Shell Bash 환경을 사용합니다. 자세한 내용은 Azure Cloud Shell 시작하기를 참조하세요.

  • CLI 참조 명령을 로컬로 실행하려면 Azure CLI를 설치하세요. Windows 또는 macOS에서 실행하는 경우 Docker 컨테이너에서 Azure CLI 실행하는 것이 좋습니다. 자세한 내용은 Docker 컨테이너에서 Azure CLI 실행하는 방법 참조하세요.

    • 로컬 설치를 사용하는 경우 az login 명령을 사용하여 Azure CLI 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI 사용하여 Azure 인증을 참조하세요.

    • 메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI 참조하세요.

    • az version을 실행하여 설치된 버전과 관련 종속 라이브러리를 확인합니다. 최신 버전으로 업그레이드하려면 az upgrade를 실행합니다.

  • HTTP 프록시를 사용하지 않도록 설정하려면 최소 CLI 버전 2.85.0이 필요합니다.

HTTP 프록시 값을 사용하여 구성 파일 만들기

파일을 작성하고 httpProxy, httpsProxynoProxy에 대한 값을 입력합니다. 환경에 필요한 경우 trustedCa에 대한 값을 입력합니다.

구성 파일의 스키마는 다음과 같습니다.

{
  "httpProxy": "string",
  "httpsProxy": "string",
  "noProxy": [
    "string"
  ],
  "trustedCa": "string"
}

각 매개 변수에 대한 요구 사항을 검토합니다.

  • httpProxy: 클러스터 외부에서 HTTP 연결을 만드는 데 사용할 프록시 URL입니다. URL 체계는 http이어야 합니다.
  • httpsProxy: 클러스터 외부에서 HTTPS 연결을 만드는 데 사용할 프록시 URL입니다. 지정하지 않으면 HTTP 및 HTTPS 연결 모두에 httpProxy가 사용됩니다.
  • noProxy: 프록시를 제외할 대상 도메인 이름, 도메인, IP 주소 또는 기타 네트워크 CIDR 목록입니다.
  • trustedCa: base64 encoded 대체 CA 인증서 콘텐츠를 포함하는 문자열입니다. 현재 PEM 형식만 지원됩니다. 인증서 20개 제한

중요

Kubernetes 시스템의 일부인 Go 기반 구성 요소와의 호환성을 위해 인증서는 사용되지 않는 일반 이름 인증서 대신 Subject Alternative Names(SANs) 합니다.

환경 변수 http_proxy, https_proxyno_proxy를 준수하는 방법에는 애플리케이션마다 차이가 있습니다. Curl 및 Python no_proxy CIDR을 지원하지 않지만 Ruby는 지원합니다.

예제 입력:

{
  "httpProxy": "http://myproxy.server.com:8080", 
  "httpsProxy": "https://myproxy.server.com:8080", 
  "noProxy": [
    "localhost",
    "127.0.0.1"
  ],
    "trustedCa": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUgvVENDQmVXZ0F3SUJB...S0tLS0="
}

Azure CLI 사용하여 HTTP 프록시 구성으로 클러스터 만들기

클러스터를 만드는 동안 HTTP 프록시 구성을 사용하여 AKS 클러스터를 구성할 수 있습니다.

  1. az aks create 명령을 사용하여 구성을 JSON 파일로 전달합니다.

    az aks create \
        --name $clusterName \
        --resource-group $resourceGroup \
        --http-proxy-config aks-proxy-config.json \
        --generate-ssh-keys
    

    클러스터는 노드에 구성된 HTTP 프록시로 초기화되어야 합니다.

  2. http_proxy 명령을 사용하여 환경 변수에 https_proxy, no_proxy, kubectl describe pod에 대한 적절한 값이 포함되어 있는지 확인하여 Pod와 노드에 HTTP 프록시 구성이 있는지 확인합니다.

    kubectl describe {any pod} -n kube-system
    

    Pod에 프록시 변수가 설정되어 있는지 유효성을 검사하려면 노드에 있는 환경 변수를 확인합니다.

    kubectl get nodes
    kubectl node-shell {node name}
    cat /etc/environment
    

HTTP 프록시 구성 업데이트

다음을 포함하여 기존 클러스터에서 HTTP 프록시 구성을 업데이트할 수 있습니다.

  • 기존 클러스터를 업데이트하여 HTTP 프록시를 사용하도록 설정하고 새로운 HTTP 프록시 구성을 추가합니다.
  • 기존 클러스터를 업데이트하여 HTTP 프록시 구성을 변경합니다.

HTTP 프록시 업데이트 고려 사항

--http-proxy-config 매개 변수는 새로운 JSON 파일에 설정되어야 하며, httpProxy, httpsProxy, noProxy, 및 trustedCa는 필요에 따라 업데이트된 값을 가져야 합니다. 업데이트는 새 httpProxy, httpsProxy 또는 noProxy 값을 사용하여 새 환경 변수를 Pod에 삽입합니다. 환경 변수 값은 허용 웹후크 변형에 의해 삽입되므로 앱이 Pod를 선택하려면 Pod를 회전해야 합니다.

참고

새 프록시로 전환하는 경우 업데이트가 성공하려면 새 프록시가 이미 존재해야 합니다. 업그레이드가 완료된 후 이전 프록시를 삭제할 수 있습니다.

클러스터를 업데이트하여 HTTP 프록시 업데이트 또는 사용

  1. az aks update 명령을 사용하여 기존 클러스터에서 HTTP 프록시 구성을 사용하도록 설정하거나 업데이트합니다.

    예를 들어, aks-proxy-config-2.json이라는 새 CA 인증서의 base64 인코딩 문자열을 사용하여 새 파일을 만들었다고 가정하겠습니다. 다음 명령을 사용하여 클러스터의 프록시 구성을 업데이트할 수 있습니다.

    az aks update --name $clusterName --resource-group $resourceGroup --http-proxy-config aks-proxy-config-2.json
    

주의

az aks update 명령을 사용하여 클러스터의 프록시 구성을 업데이트하면 AKS는 클러스터의 모든 노드 풀을 자동으로 이미지로 다시 설치합니다. PDB(Pod 중단 예산)를 사용하면 이미지로 다시 설치 중에 중요한 Pod가 중단되는 것을 방지할 수 있습니다.

  1. http_proxy 명령을 사용하여 환경 변수에 https_proxy, no_proxy, kubectl describe pod에 대한 적절한 값이 포함되어 있는지 확인하여 Pod와 노드에 HTTP 프록시 구성이 있는지 확인합니다.

    kubectl describe {any pod} -n kube-system
    

    Pod에 프록시 변수가 설정되어 있는지 유효성을 검사하려면 노드에 있는 환경 변수를 확인합니다.

    kubectl get nodes
    kubectl node-shell {node name}
    cat /etc/environment
    

기존 클러스터에서 HTTP 프록시 사용 안 함

클러스터를 업데이트하여 HTTP 프록시 사용 안 함

  1. az aks update 명령과 --disable-http-proxy 플래그를 사용하여 HTTP 프록시를 사용하지 않도록 설정하도록 클러스터를 업데이트합니다.

    az aks update --name $clusterName --resource-group $resourceGroup --disable-http-proxy
    

주의

az aks update 명령을 사용하여 클러스터의 프록시 구성을 업데이트하면 AKS는 클러스터의 모든 노드 풀을 자동으로 이미지로 다시 설치합니다. PDB(Pod 중단 예산)를 사용하면 이미지로 다시 설치 중에 중요한 Pod가 중단되는 것을 방지할 수 있습니다.

  1. kubectl describe pod 명령을 사용하여 Pod와 노드에 HTTP 프록시 구성이 설정되어 있지 않은지 유효성을 검사하여 HTTP 프록시가 사용하지 않도록 설정되었는지 확인합니다.

    kubectl describe {any pod} -n kube-system
    

    Pod에 프록시 변수가 설정되지 않았는지 유효성을 검사하려면 노드에 있는 환경 변수를 확인합니다.

    kubectl get nodes
    kubectl node-shell {node name}
    cat /etc/environment
    

기존 클러스터에서 HTTP 프록시를 다시 사용하도록 설정합니다.

클러스터를 만들면 기본적으로 HTTP 프록시가 사용하도록 설정됩니다. 클러스터에서 HTTP 프록시를 사용하지 않도록 설정하면 프록시 구성은 데이터베이스에 저장되지만 프록시 변수는 Pod와 노드에서 제거됩니다.

기존 클러스터에서 HTTP 프록시를 다시 사용하도록 설정하려면 az aks update 플래그와 함께 --enable-http-proxy 명령을 사용합니다.

az aks update --name $clusterName --resource-group $resourceGroup --enable-http-proxy

주의

az aks update 명령을 사용하여 클러스터의 프록시 구성을 업데이트하면 AKS는 클러스터의 모든 노드 풀을 자동으로 이미지로 다시 설치합니다. PDB(Pod 중단 예산)를 사용하면 이미지로 다시 설치 중에 중요한 Pod가 중단되는 것을 방지할 수 있습니다.

중요

사용하지 않도록 설정하기 전에 클러스터에 HTTP 프록시 구성이 있었던 경우 해당 클러스터에서 HTTP 프록시를 다시 사용하도록 설정하면 기존 HTTP 프록시 구성이 자동으로 적용됩니다. 계속 진행하기 전에 구성이 현재 요구 사항을 충족하는지 확인하는 것이 좋습니다. HTTP 프록시를 다시 사용하도록 설정한 후 HTTP 프록시 구성을 변경하려면 기존 클러스터에서 HTTP 프록시 구성 업데이트 단계를 수행합니다.

ARM(Azure Resource Manager) 템플릿을 사용하여 HTTP 프록시 구성 구성

ARM 템플릿을 사용하여 HTTP 프록시로 AKS 클러스터를 배포할 수 있습니다.

  1. 각 매개 변수에 대한 요구 사항을 검토합니다.

    • httpProxy: 클러스터 외부에서 HTTP 연결을 만드는 데 사용할 프록시 URL입니다. URL 체계는 http이어야 합니다.
    • httpsProxy: 클러스터 외부에서 HTTPS 연결을 만드는 데 사용할 프록시 URL입니다. 지정하지 않으면 HTTP 및 HTTPS 연결 모두에 httpProxy가 사용됩니다.
    • noProxy: 프록시를 제외할 대상 도메인 이름, 도메인, IP 주소 또는 기타 네트워크 CIDR 목록입니다.
    • trustedCa: base64 encoded 대체 CA 인증서 콘텐츠를 포함하는 문자열입니다. 현재 PEM 형식만 지원됩니다.

    중요

    Kubernetes 시스템의 일부인 Go 기반 구성 요소와의 호환성을 위해 인증서는 사용되지 않는 일반 이름 인증서 대신 Subject Alternative Names (SANs) 합니다.

    환경 변수 http_proxy, https_proxyno_proxy를 준수하는 방법에는 애플리케이션마다 차이가 있습니다. Curl 및 Python no_proxy CIDR을 지원하지 않지만 Ruby는 지원합니다.

  2. HTTP 프록시 매개 변수를 사용하여 템플릿을 만듭니다. 템플릿에서 httpProxy, httpsProxynoProxy에 대한 값을 입력합니다. 필요한 경우 trustedCa에 대한 값을 입력합니다. 다음 예시에서 볼 수 있듯이, CLI 배포에 사용되는 것과 동일한 스키마가 "properties" 아래의 Microsoft.ContainerService/managedClusters 정의에 존재합니다.

    "properties": {
        ...,
        "httpProxyConfig": {
          "enabled": "true",
            "httpProxy": "string",
            "httpsProxy": "string",
            "noProxy": [
                "string"
            ],
            "trustedCa": "string"
        }
    }
    
  3. HTTP 프록시 구성을 사용하여 ARM 템플릿을 배포합니다. 클러스터는 노드에 구성된 HTTP 프록시로 초기화되어야 합니다.

HTTP 프록시 구성 업데이트

다음을 포함하여 기존 클러스터에서 HTTP 프록시 구성을 업데이트할 수 있습니다.

  • 기존 클러스터를 업데이트하여 HTTP 프록시를 사용하도록 설정하고 새로운 HTTP 프록시 구성을 추가합니다.
  • 기존 클러스터를 업데이트하여 HTTP 프록시 구성을 변경합니다.

HTTP 프록시 업데이트 고려 사항

--http-proxy-config 매개 변수는 새로운 JSON 파일에 설정되어야 하며, httpProxy, httpsProxy, noProxy, 및 trustedCa는 필요에 따라 업데이트된 값을 가져야 합니다. 업데이트는 새 httpProxy, httpsProxy 또는 noProxy 값을 사용하여 새 환경 변수를 Pod에 삽입합니다. 환경 변수 값은 허용 웹후크 변형에 의해 삽입되므로 앱이 Pod를 선택하려면 Pod를 회전해야 합니다.

참고

새 프록시로 전환하는 경우 업데이트가 성공하려면 새 프록시가 이미 존재해야 합니다. 업그레이드가 완료된 후 이전 프록시를 삭제할 수 있습니다.

HTTP 프록시를 구성하기 위해 ARM 템플릿 업데이트

  1. 템플릿에서 httpProxy, httpsProxy, noProxy에 대한 새 값을 제공합니다. 필요한 경우 trustedCa에 대한 값을 입력합니다.

    CLI 배포에 사용되는 동일한 스키마는 다음 예제에 나타난 바와 같이 "properties" 아래의 Microsoft.ContainerService/managedClusters 정의에 존재합니다.

    "properties": {
        ...,
        "httpProxyConfig": {
            "enabled": "true",
            "httpProxy": "string",
            "httpsProxy": "string",
            "noProxy": [
                "string"
            ],
            "trustedCa": "string"
        }
    }
    
  2. 업데이트된 HTTP 프록시 구성을 사용하여 ARM 템플릿을 배포합니다.

주의

az aks update 명령을 사용하여 클러스터의 프록시 구성을 업데이트하면 AKS는 클러스터의 모든 노드 풀을 자동으로 이미지로 다시 설치합니다. PDB(Pod 중단 예산)를 사용하면 이미지로 다시 설치 중에 중요한 Pod가 중단되는 것을 방지할 수 있습니다.

  1. http_proxy 명령을 사용하여 환경 변수에 https_proxy, no_proxy, kubectl describe pod에 대한 적절한 값이 포함되어 있는지 확인하여 Pod와 노드에 HTTP 프록시 구성이 있는지 확인합니다.

    kubectl describe {any pod} -n kube-system
    

    Pod에 프록시 변수가 설정되어 있는지 유효성을 검사하려면 노드에 있는 환경 변수를 확인합니다.

    kubectl get nodes
    kubectl node-shell {node name}
    cat /etc/environment
    

ARM 템플릿을 사용하여 기존 클러스터에서 HTTP 프록시 사용 안 함

클러스터를 업데이트하여 HTTP 프록시 사용 안 함

  1. 클러스터 ARM 템플릿을 업데이트하고 enabledfalse로 설정하여 HTTP 프록시를 사용하지 않도록 설정합니다. 다음 예시에서 볼 수 있듯이, CLI 배포에 사용되는 것과 동일한 스키마가 "properties" 아래의 Microsoft.ContainerService/managedClusters 정의에 존재합니다.

    "properties": {
        ...,
        "httpProxyConfig": {
           "enabled": "false",
        }
    }
    
  2. HTTP 프록시를 사용하지 않도록 설정하여 ARM 템플릿을 배포합니다.

주의

az aks update 명령을 사용하여 클러스터의 프록시 구성을 업데이트하면 AKS는 클러스터의 모든 노드 풀을 자동으로 이미지로 다시 설치합니다. PDB(Pod 중단 예산)를 사용하면 이미지로 다시 설치 중에 중요한 Pod가 중단되는 것을 방지할 수 있습니다.

  1. kubectl describe pod 명령을 사용하여 Pod와 노드에 HTTP 프록시 구성이 설정되지 않았는지 유효성을 검사하여 HTTP 프록시가 사용하지 않도록 설정되었는지 확인합니다.

    kubectl describe {any pod} -n kube-system
    

    Pod에 프록시 변수가 설정되지 않았는지 유효성을 검사하려면 노드에 있는 환경 변수를 확인합니다.

    kubectl get nodes
    kubectl node-shell {node name}
    cat /etc/environment
    

기존 클러스터에서 HTTP 프록시를 다시 사용하도록 설정합니다.

클러스터를 만들면 기본적으로 HTTP 프록시가 사용하도록 설정됩니다. 클러스터에서 HTTP 프록시를 사용하지 않도록 설정하면 해당 클러스터에 HTTP 프록시 구성을 더 이상 추가할 수 없습니다.

HTTP 프록시를 다시 사용하도록 설정하려면 ARM 템플릿을 사용하여 HTTP 프록시 구성 업데이트 단계를 수행합니다.


외부 서비스를 위한 Istio 추가 기능 HTTP 프록시

AKS용 Istio 기반 서비스 메시 추가 기능을 사용하는 경우 메시의 애플리케이션이 HTTP 프록시를 통해 비클러스터 또는 외부 리소스에 액세스할 수 있도록 서비스 항목을 만들어야 합니다.

예시:

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
    name: proxy
spec:
    hosts:
    - my-company-proxy.com # ignored
    addresses:
    - $PROXY_IP/32
    ports:
    - number: $PROXY_PORT
        name: tcp
        protocol: TCP
    location: MESH_EXTERNAL
  1. 파일을 만들고 PROXY_IPPROXY_PORT에 대한 값을 제공합니다.

  2. 다음을 사용하여 서비스 항목을 배포할 수 있습니다.

    kubectl apply -f service_proxy.yaml
    

애드온 구성 모니터링

모니터링 추가 기능이 있는 HTTP 프록시는 다음 구성을 지원합니다.

  • 인증이 없는 아웃바운드 프록시
  • Log Analytics 엔드포인트에 대해 신뢰할 수 있는 인증서가 있는 아웃바운드 프록시

다음 구성은 지원되지 않습니다.

  • 신뢰할 수 있는 인증서가 있는 프록시를 사용할 때 사용자 지정 메트릭 및 권장 경고 기능

다음 단계

AKS 클러스터의 네트워크 요구 사항에 대한 자세한 내용은 AKS의 클러스터 노드에 대한 송신 트래픽 제어를 참조하세요.