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

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

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

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

制限と考慮事項

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

  • ノード プールごとに異なるプロキシ構成
  • ユーザーとパスワードの認証
  • API サーバー通信用のカスタム証明機関 (CA)
  • HTTP プロキシを使って既存の AKS クラスターを構成することはサポートされていません。HTTP プロキシ機能は、クラスターの作成時に有効にする必要があります。
  • Windows ベースのクラスター
  • 仮想マシン可用性セット (VMAS) を使用したノード プール
  • noProxy のドメイン サフィックスにアタッチされたワイルドカードとして * を使用する

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

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

プロキシ環境変数の挿入を無効にするには、"kubernetes.azure.com/no-http-proxy-vars":"true" を使用してポッドに注釈を付ける必要があります。

開始する前に

  • 最新バージョンの Azure CLI が必要です。 az --version を実行してバージョンを見つけ、az upgrade を実行してバージョンをアップグレードします。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
  • 利用可能な AKS クラスターのアップグレードを確認して、最新バージョンの AKS が実行されていることを確認します。 アップグレードする必要がある場合は、「AKS クラスターのアップグレード」を参照してください。
  • プロキシ構成の更新に必要な OS ファイルは、ノード イメージのアップグレード プロセス中にのみ更新できます。 プロキシを構成した後、ノード イメージをアップグレードして変更を適用する必要があります。 詳細については、AKS ノード イメージのアップグレードに関する記事を参照してください。

Azure CLI を使用した HTTP プロキシの構成

az aks create コマンドを使用し、構成を JSON ファイルとして渡すことで、クラスターの作成時に HTTP プロキシを使用して AKS クラスターを構成できます。

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

{
  "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 ではサポートされています。

入力例:

Note

CA 証明書は、PEM 形式の証明書コンテンツの base64 でエンコードされた文字列である必要があります。

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

ファイルを作成し、httpProxyhttpsProxynoProxy の値を指定します。 ご自分の環境で必要な場合は、trustedCa の値を指定します。 次に、--http-proxy-config パラメーターを作成したファイルに設定して、az aks create コマンドを使用してクラスターをデプロイできます。 クラスターは、ノードに構成されている HTTP プロキシを使用して初期化する必要があります。

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

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

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

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

テンプレートで、httpProxyhttpsProxynoProxy の値を指定します。 必要に応じて、trustedCa の値を指定します。 次に、テンプレートをデプロイできます。 クラスターは、ノードに構成されている 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

ファイルを作成し、PROXY_IPPROXY_PORT の値を指定します。 次を使用してサービス エントリをデプロイできます。

kubectl apply -f service_proxy.yaml

プロキシ構成の更新

Note

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

必要に応じて、httpProxyhttpsProxynoProxytrustedCa の値が更新された新しい JSON ファイルに --http-proxy-config パラメーターを設定した az aks update コマンドを使用して、クラスター上のプロキシ構成を更新できます。 更新プログラムは、新しい httpProxyhttpsProxy、または noProxy 値を持つポッドに新しい環境変数を挿入します。 環境変数の値は変更アドミッション Webhook によって挿入されるため、アプリがそれを取得するには、ポッドをローテーションする必要があります。 containerd やノード自体など、Kubernetes の下のコンポーネントについては、ノード イメージのアップグレードが実行されるまで有効になりません。

たとえば、aks-proxy-config-2.json という名前の新しい CA 証明書の base64 でエンコードされた文字列を含む新しいファイルを作成したとします。 次のコマンドを使用して、クラスターのプロキシ構成を更新できます。

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

AKS ノード イメージをアップグレードする

プロキシを構成した後、ノード イメージをアップグレードして変更を適用する必要があります。 ノード イメージのアップグレード プロセスは、プロキシ構成の更新に必要な OS ファイルを更新する唯一の方法です。 ノード イメージのアップグレード プロセスは、ノード プール内の各ノードの OS イメージを更新するローリング アップグレードです。 AKS コントロール プレーンは、実行中のアプリケーションに中断しないアップグレード プロセスを処理します。

AKS ノード イメージをアップグレードするには、「Azure Kubernetes Service (AKS) ノード イメージのアップグレード」に関するページを参照してください。

アドオン構成の監視

監視アドオンを使用する HTTP プロキシでは、次の構成がサポートされます。

  • 認証なしの送信プロキシ
  • ユーザー名とパスワードの認証を使用した送信プロキシ
  • Log Analytics エンドポイント用の信頼された証明書を使用した送信プロキシ

次の構成はサポートされていません。

  • 信頼された証明書でプロキシを使用する場合のカスタム メトリックと推奨アラート機能

次のステップ

AKS クラスターのネットワーク要件に関する詳細については、「AKS でクラスター ノードに対するエグレス トラフィックを制御する」を参照してください。