次の方法で共有


Azure Kubernetes Service (AKS) での HTTP プロキシのサポート

この記事では、送信インターネット アクセスに HTTP プロキシを使用するように Azure Kubernetes Service (AKS) クラスターを構成する方法について説明します。

マネージド仮想ネットワークまたはカスタム仮想ネットワークにデプロイされた AKS クラスターには、適切に機能するために必要な特定の送信依存関係があり、HTTP プロキシ経由でインターネット アクセスをルーティングする必要がある環境で問題が発生しました。 ノードには、インターネット サービスにアクセスするために必要な構成、環境変数、および証明書をブートストラップする方法がありませんでした。

HTTP プロキシ機能により、AKS クラスターに HTTP プロキシのサポートが追加され、プロキシに依存する環境で AKS に必要なネットワーク トラフィックをセキュリティで保護するために使用できる簡単なインターフェイスが公開されます。 この機能により、AKS ノードとポッドの両方が HTTP プロキシを使用するように構成されます。 また、この機能により、クラスターのブートストラップの一環として、信頼された証明機関をノードにインストールすることもできます。 より複雑ソリューションでは、ネットワーク全体でセキュリティで保護された通信を確立するために、信頼チェーンを作成することが必要になる場合があります。

制限と考慮事項

次のシナリオはサポートされて いません

  • ノード プールごとに異なるプロキシ構成
  • ユーザーとパスワードの認証
  • API サーバー通信用のカスタム証明機関 (CA)
  • Windows ノード プールを含む AKS クラスター
  • 仮想マシン可用性セット (VMAS) を使用したノード プール
  • noProxy のドメイン サフィックスにアタッチされたワイルドカードとして * を使用する

httpProxyhttpsProxytrustedCa には、既定では値がありません。 ポッドには、次の環境変数が挿入されます。

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

プロキシ環境変数の挿入を無効にするには、"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 プロキシ値を使用して構成ファイルを作成する

ファイルを作成し、httpProxyhttpsProxynoProxy の値を指定します。 ご自分の環境で必要な場合は、trustedCa の値を指定します。

構成ファイルのスキーマは次のようになります。

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

各パラメーターの要件を確認します。

  • httpProxy: クラスターの外部で HTTP 接続を作成するために使用するプロキシ URL。 URL スキームは http である必要があります。
  • httpsProxy: クラスターの外部で HTTPS 接続を作成するために使用するプロキシ URL。 指定しない場合、httpProxy が HTTP と HTTPS の両方の接続に使用されます。
  • noProxy: プロキシを除外する宛先ドメイン名、ドメイン、IP アドレス、または他のネットワーク CIDR の一覧。
  • trustedCa: base64 encoded 代替 CA 証明書の内容を含む文字列。 現在は、PEM 形式のみがサポートされています。

重要

Kubernetes システムの一部である Go ベースのコンポーネントとの互換性のために、証明書では、非推奨の共通名証明書ではなく、 がサポートされているSubject Alternative Names(SANs)

環境変数 http_proxyhttps_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_proxyno_proxy、およびkubectl describe podの適切な値が含まれていることを確認して、HTTP プロキシ構成がポッドとノード上にあることを確認します。

    kubectl describe {any pod} -n kube-system
    

    ポッドでプロキシ変数が設定されていることを検証するには、ノードに存在する環境変数を確認します。

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

HTTP プロキシ構成を更新する

次のような既存のクラスターで HTTP プロキシ構成を更新できます。

  • 既存のクラスターを更新して HTTP プロキシを有効にし、新しい HTTP プロキシ構成を追加する。
  • 既存のクラスターを更新して HTTP プロキシ構成を変更する。

HTTP プロキシの更新に関する考慮事項

--http-proxy-config パラメーターは、必要に応じて、httpProxyhttpsProxynoProxy、およびtrustedCaの値が更新された新しい JSON ファイルに設定する必要があります。 更新プログラムは、新しい httpProxyhttpsProxy、または noProxy 値を持つポッドに新しい環境変数を挿入します。 環境変数の値は変更アドミッション Webhook によって挿入されるため、アプリがそれを取得するには、ポッドをローテーションする必要があります。

新しいプロキシに切り替える場合、更新を成功させるには、新しいプロキシが既に存在している必要があります。 アップグレードが完了すると、古いプロキシを削除できます。

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)を使用して、再イメージ化中に重要なポッドの中断を防ぐことができます。

  1. http_proxy コマンドを使用して、環境変数にhttps_proxyno_proxy、およびkubectl describe podの適切な値が含まれていることを確認して、HTTP プロキシ構成がポッドとノード上にあることを確認します。

    kubectl describe {any pod} -n kube-system
    

    ポッドでプロキシ変数が設定されていることを検証するには、ノードに存在する環境変数を確認します。

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

既存のクラスターで HTTP プロキシを無効にする (プレビュー)

拡張機能 aks-preview インストールする

  1. aks-preview コマンドを使って Azure CLI 拡張機能 az extension add をインストールします。

    重要

    AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。

    az extension add --name aks-preview
    
  2. az extension update コマンドを使って拡張機能の最新バージョンに更新します。 HTTP プロキシを無効にするには、少なくとも 18.0.0b13 が必要です

    az extension update --name aks-preview
    

機能フラグ DisableHTTPProxyPreview 登録する

  1. DisableHTTPProxyPreview コマンドを使用して、az feature register 機能フラグを登録します。

    az feature register --namespace Microsoft.ContainerService --name DisableHTTPProxyPreview
    
  2. az feature show コマンドを使用して、登録の状態を確認します。 状態が [登録済み] と表示されるまでに数分かかります。

    az feature show --namespace Microsoft.ContainerService --name DisableHTTPProxyPreview
    
  3. 状態が Registered と表示されたら、 コマンドを使用して az provider register リソース プロバイダーの登録を最新の情報に更新します。

    az provider register --namespace Microsoft.ContainerService
    

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)を使用して、再イメージ化中に重要なポッドの中断を防ぐことができます。

  1. kubectl describe pod コマンドを使用して、ポッドとノードで HTTP プロキシ構成が設定されていないことを検証して、HTTP プロキシが無効になっていることを確認します。

    kubectl describe {any pod} -n kube-system
    

    ポッドでプロキシ変数が設定されていないことを検証するには、ノードに存在する環境変数を確認できます。

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

既存のクラスターで HTTP プロキシを再度有効にする

クラスターを作成すると、HTTP プロキシが既定で有効になります。 クラスターで HTTP プロキシを無効にすると、プロキシ構成はデータベースに保存されますが、プロキシ変数はポッドとノードから削除されます。

既存のクラスターで HTTP プロキシを再度有効にするには、az aks update フラグを指定して --enable-http-proxy コマンドを使用します。

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

注意事項

az aks update コマンドを使用してクラスターのプロキシ構成を更新すると、AKS によってクラスター内のすべてのノード プールが自動的に再イメージ化されます。 ポッド中断バジェット (PDB)を使用して、再イメージ化中に重要なポッドの中断を防ぐことができます。

重要

無効にする前にクラスターに HTTP プロキシ構成がある場合は、そのクラスターで HTTP プロキシを再度有効にすると、既存の HTTP プロキシ構成が自動的に適用されます。 先に進む前に、構成が現在の要件を満たしていることを確認することをお勧めします。 HTTP プロキシを再度有効にした後で HTTP プロキシ構成を変更する場合は、 既存のクラスターで HTTP プロキシ構成を更新する手順に従います。

Azure Resource Manager (ARM) テンプレートを使用して HTTP プロキシ構成を構成する

ARM テンプレートを使用して、HTTP プロキシを備えた AKS クラスターをデプロイできます。

  1. 各パラメーターの要件を確認します。

    • httpProxy: クラスターの外部で HTTP 接続を作成するために使用するプロキシ URL。 URL スキームは http である必要があります。
    • httpsProxy: クラスターの外部で HTTPS 接続を作成するために使用するプロキシ URL。 指定しない場合、httpProxy が HTTP と HTTPS の両方の接続に使用されます。
    • noProxy: プロキシを除外する宛先ドメイン名、ドメイン、IP アドレス、または他のネットワーク CIDR の一覧。
    • trustedCa: base64 encoded 代替 CA 証明書の内容を含む文字列。 現在は、PEM 形式のみがサポートされています。

    重要

    Kubernetes システムの一部である Go ベースのコンポーネントとの互換性のために、証明書では、非推奨の共通名証明書ではなく、 がサポートされているSubject Alternative Names (SANs)

    環境変数 http_proxyhttps_proxyno_proxy に準拠する方法は、アプリケーションによって異なります。 Curl と Python では no_proxy で CIDR がサポートされていませんが、Ruby ではサポートされています。

  2. HTTP プロキシ パラメーターを使用してテンプレートを作成します。 テンプレートで、httpProxyhttpsProxynoProxy の値を指定します。 必要に応じて、trustedCa の値を指定します。 次の例に示すように、CLI デプロイに使用されるのと同じスキーマが、Microsoft.ContainerService/managedClusters"properties" 定義に存在します。

    "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 パラメーターは、必要に応じて、httpProxyhttpsProxynoProxy、およびtrustedCaの値が更新された新しい JSON ファイルに設定する必要があります。 更新プログラムは、新しい httpProxyhttpsProxy、または noProxy 値を持つポッドに新しい環境変数を挿入します。 環境変数の値は変更アドミッション Webhook によって挿入されるため、アプリがそれを取得するには、ポッドをローテーションする必要があります。

新しいプロキシに切り替える場合、更新を成功させるには、新しいプロキシが既に存在している必要があります。 アップグレードが完了すると、古いプロキシを削除できます。

ARM テンプレートを更新して HTTP プロキシを構成する

  1. テンプレートで、 httpProxyhttpsProxy、および noProxyの新しい値を指定します。 必要に応じて、trustedCa の値を指定します。

    次の例に示すように、CLI デプロイに使用されるのと同じスキーマが、Microsoft.ContainerService/managedClusters"properties" 定義に存在します。

    "properties": {
        ...,
        "httpProxyConfig": {
            "enabled": "true",
            "httpProxy": "string",
            "httpsProxy": "string",
            "noProxy": [
                "string"
            ],
            "trustedCa": "string"
        }
    }
    
  2. 更新された HTTP プロキシ構成を使用して ARM テンプレートをデプロイします。

注意事項

az aks update コマンドを使用してクラスターのプロキシ構成を更新すると、AKS によってクラスター内のすべてのノード プールが自動的に再イメージ化されます。 ポッド中断バジェット (PDB)を使用して、再イメージ化中に重要なポッドの中断を防ぐことができます。

  1. http_proxy コマンドを使用して、環境変数にhttps_proxyno_proxy、およびkubectl describe podの適切な値が含まれていることを確認して、HTTP プロキシ構成がポッドとノード上にあることを確認します。

    kubectl describe {any pod} -n kube-system
    

    ポッドでプロキシ変数が設定されていることを検証するには、ノードに存在する環境変数を確認します。

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

ARM テンプレートを使用して既存のクラスターで HTTP プロキシを無効にする (プレビュー)

拡張機能 aks-preview インストールする

  1. aks-preview コマンドを使って Azure CLI 拡張機能 az extension add をインストールします。

    重要

    AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。

    az extension add --name aks-preview
    
  2. az extension update コマンドを使って拡張機能の最新バージョンに更新します。 HTTP プロキシを無効にするには、少なくとも 18.0.0b13 が必要です

    az extension update --name aks-preview
    

機能フラグ DisableHTTPProxyPreview 登録する

  1. DisableHTTPProxyPreview コマンドを使用して、az feature register 機能フラグを登録します。

    az feature register --namespace Microsoft.ContainerService --name DisableHTTPProxyPreview
    
  2. az feature show コマンドを使用して、登録の状態を確認します。 状態が [登録済み] と表示されるまでに数分かかります。

    az feature show --namespace Microsoft.ContainerService --name DisableHTTPProxyPreview
    
  3. 状態が Registered と表示されたら、 コマンドを使用して az provider register リソース プロバイダーの登録を最新の情報に更新します。

    az provider register --namespace Microsoft.ContainerService
    

HTTP プロキシを無効にするようにクラスターを更新する

  1. enabledfalse に設定して、クラスター ARM テンプレートを更新して HTTP プロキシを無効にします。 次の例に示すように、CLI デプロイに使用されるのと同じスキーマが、Microsoft.ContainerService/managedClusters"properties" 定義に存在します。

    "properties": {
        ...,
        "httpProxyConfig": {
           "enabled": "false",
        }
    }
    
  2. HTTP プロキシを無効にして ARM テンプレートをデプロイします。

注意事項

az aks update コマンドを使用してクラスターのプロキシ構成を更新すると、AKS によってクラスター内のすべてのノード プールが自動的に再イメージ化されます。 ポッド中断バジェット (PDB)を使用して、再イメージ化中に重要なポッドの中断を防ぐことができます。

  1. kubectl describe pod コマンドを使用して、ポッドとノードで HTTP プロキシ構成が設定されていないことを検証して、HTTP プロキシが無効になっていることを確認します。

    kubectl describe {any pod} -n kube-system
    

    ポッドでプロキシ変数が設定されていないことを検証するには、ノードに存在する環境変数を確認できます。

    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 でクラスター ノードに対するエグレス トラフィックを制御する」を参照してください。