プライベート Azure Kubernetes Service (AKS) クラスターを作成する

プライベート クラスターでは、コントロール プレーンまたは API サーバーに、「RFC1918 - Address Allocation for Private Internet」 (RFC1918 - プライベート インターネットでのアドレス割り当て) で定義されている内部 IP アドレスがあります。 プライベート クラスターを使用することにより、API サーバーとノード プールの間のネットワーク トラフィックがプライベート ネットワークにのみ保持されるようにすることができます。

コントロール プレーンまたは API サーバーは、Azure Kubernetes Service (AKS) マネージドの Azure リソース グループの中にあります。 クラスターまたはノード プールはリソース グループに含まれています。 サーバーとクラスターまたはノード プールは、API サーバー仮想ネットワーク内の Azure Private Link サービスと、AKS クラスターのサブネットで公開されているプライベート エンドポイントを介して相互に通信できます。

プライベート AKS クラスターをプロビジョニングすると、既定では AKS によって、プライベート DNS ゾーンを持つプライベート FQDN と、対応する A レコードを持つ追加のパブリック FQDN が、Azure パブリック DNS に作成されます。 エージェント ノードはプライベート DNS ゾーンの A レコードを使用し続け、API サーバーとの通信のためにプライベート エンドポイントのプライベート IP アドレスを解決します。

この記事の目的は、プライベート リンクベースの AKS クラスターのデプロイに役立つことです。 必要なプライベート リンクやトンネルを使用せずに AKS クラスターを作成する場合は、「API Server VNet 統合を使用して Azure Kubernetes Service クラスターを作成する (プレビュー)」を参照してください。

利用可能なリージョン

プライベート クラスターは、AKS がサポートされているパブリック リージョン、Azure Government リージョン、および 21Vianet で運営される Microsoft Azure リージョンで使用できます。

前提条件

  • Azure CLI バージョン 2.28.0 以降。 az --version を実行してバージョンを見つけ、az upgrade を実行してバージョンをアップグレードします。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
  • aks-preview 拡張機能 0.5.29 以降。
  • Azure Resource Manager (ARM) または Azure REST API を使用する場合、AKS API バージョンは 2021-05-01 以降である必要があります。
  • Azure Private Link サービスは、Standard Azure Load Balancer でのみサポートされています。 Basic Azure Load Balancer はサポートされていません。
  • カスタム DNS サーバーを使用するには、カスタム DNS サーバーのアップストリーム DNS サーバーとして Azure パブリック IP アドレス 168.63.129.16 を追加し、このパブリック IP アドレスを 最初 の DNS サーバーとして追加してください。 Azure IP アドレスの詳細については、「IP アドレス 168.63.129.16 とは」を参照してください
    • クラスターの DNS ゾーンは、168.63.129.16 に転送するものにします。 ゾーン名の詳細については、「Azure サービス DNS ゾーンの構成」を参照してください。
  • API Server VNet 統合で有効になっている既存の AKS クラスターでは、プライベート クラスター モードを有効にすることができます。 詳細については、「API サーバー VNet 統合を使用して既存のクラスターでプライベート クラスター モードを有効または無効にする」を参照してください。

Note

Azure Linux ノード プールが一般提供 (GA) になりました。 利点とデプロイの手順については、AKS 用 Azure Linux コンテナー ホストの概要に関する記事を参照してください。

制限事項

  • 認可済み IP 範囲は、プライベート API サーバー エンドポイントには適用できません。パブリック API サーバーにのみ適用されます
  • Azure Private Link サービスの制限事項は、プライベート クラスターに適用されます。
  • Azure DevOps Microsoft でホストするエージェントとプライベート クラスターの組み合わせはサポートされていません。 セルフホステッド エージェントを使用することを検討してください。
  • Azure Container Registry がプライベート AKS クラスターと連携できるようにする必要がある場合は、クラスター仮想ネットワークにコンテナー レジストリのプライベート リンクを設定するか、Container Registry 仮想ネットワークとプライベート クラスターの仮想ネットワークの間にピアリングを設定します。
  • カスタマーのサブネット内でプライベート エンドポイントを削除または変更すると、クラスターが機能しなくなります。

プライベート AKS クラスターを作成する

リソース グループを作成する

az group create コマンドを使用して、リソース グループを作成します。 AKS クラスターに既存のリソース グループを使用することもできます。

az group create --location eastus --name myResourceGroup

既定の基本ネットワーク

--enable-private-cluster フラグを指定した az aks create コマンドを使用して、既定の基本ネットワークでプライベート クラスターを作成します。

az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --generate-ssh-keys

[高度] ネットワーク

次のフラグを指定して az aks create コマンドを使用し、高度なネットワークを備えたプライベート クラスターを作成します。

az aks create \
    --resource-group <private-cluster-resource-group> \
    --name <private-cluster-name> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --network-plugin azure \
    --vnet-subnet-id <subnet-id> \
    --dns-service-ip 10.2.0.10 \
    --service-cidr 10.2.0.0/24 
    --generate-ssh-keys

カスタム ドメインを使用する

内部でのみ解決できるカスタム ドメインを構成する場合は、「カスタム ドメインを使用する」を参照してください。

パブリック FQDN を無効にする

新しい AKS クラスターでパブリック FQDN を無効にする

--disable-public-fqdn フラグを使用してプライベート AKS クラスターを作成するときに、パブリック FQDN を無効にします。

az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resourceID> \
    --private-dns-zone <private-dns-zone-mode> \
    --disable-public-fqdn \
    --generate-ssh-keys

既存のクラスターでパブリック FQDN を無効にする

--disable-public-fqdn フラグを指定した az aks update コマンドを使用して、既存の AKS クラスターでパブリック FQDN を無効にします。

az aks update --name <private-cluster-name> --resource-group <private-cluster-resource-group> --disable-public-fqdn

プライベート DNS ゾーンを構成する

プライベート DNS ゾーンは、次のパラメーターを使用して構成できます。

  • system: これが既定値です。 --private-dns-zone 引数を省略すると、AKS によって、ノード リソース グループにプライベート DNS ゾーンが作成されます。
  • none: 既定値はパブリック DNS です。 AKS では、プライベート DNS ゾーンは作成されません。
  • CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID: これにより、Azure グローバル クラウド用に privatelink.<region>.azmk8s.io または <subzone>.privatelink.<region>.azmk8s.io の形式でプライベート DNS ゾーンを作成する必要があります。 今後使用するために、プライベート DNS ゾーンのリソース ID が必要になります。 プライベート DNS ゾーンの共同作成者およびネットワーク共同作成者のロールを持つユーザー割り当て ID またはサービス プリンシパルも必要です。 API サーバー VNet 統合を使用してデプロイする場合、プライベート DNS ゾーンでは、private.<region>.azmk8s.io または <subzone>.private.<region>.azmk8s.io の名前付け形式がサポートされます。
    • プライベート DNS ゾーンが AKS クラスターとは異なるサブスクリプションにある場合は、両方のサブスクリプションで Azure プロバイダーの Microsoft.ContainerServices を登録する必要があります。
    • "fqdn-subdomain" は、サブドメインの機能を privatelink.<region>.azmk8s.io に提供するためにのみ、"CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID" と共に使用できます。
    • AKS クラスターが Active Directory サービス プリンシパルで構成されている場合、AKS では、カスタム プライベート DNS ゾーンでのシステム割り当てマネージド ID の使用はサポートされません。 クラスターでは、ユーザー割り当てマネージド ID 認証を使用する必要があります。
    • <subzone> を指定する場合、<subzone> 名には 32 文字の制限があります。

Note

CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID は、Azure CLI に加えて、ARM テンプレートを使用しても構成できます。 privateDNSZone は、次の例に示すように、プライベート DNZ ゾーン resourceID を受け入れます。

properties.apiServerAccessProfile.privateDNSZone.
"apiServerAccessProfile": {
"enablePrivateCluster": true,
"privateDNSZone": "system|none|[resourceId(..., 'Microsoft.Network/privateDnsZones', 'privatelink.<region>.azmk8s.io']"
}

重要

クラスターの作成後に CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID を変更することはできません。また、削除することもできません。 そうしないと、クラスターでアップグレード操作の実行に問題が発生します。

プライベート DNS ゾーンがあるプライベート AKS クラスターを作成する

次のフラグを指定した az aks create コマンドを使用して、プライベート DNS ゾーンを持つプライベート AKS クラスターを作成します。

az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resourceID> \
    --private-dns-zone [system|none] \
    --generate-ssh-keys

カスタム プライベート DNS ゾーンまたはプライベート DNS サブゾーンを持つプライベート AKS クラスターを作成する

次のフラグを指定した az aks create コマンドを使用して、カスタム プライベート DNS ゾーンまたはサブゾーンを持つプライベート AKS クラスターを作成します。

# The custom private DNS zone name should be in the following format: "<subzone>.privatelink.<region>.azmk8s.io"

az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resourceID> \
    --private-dns-zone <custom private dns zone or custom private dns subzone resourceID> \
    --generate-ssh-keys

カスタム プライベート DNS ゾーンとカスタム サブドメインがあるプライベート AKS クラスターを作成する

次のフラグを指定した az aks create コマンドを使用して、カスタム プライベート DNS ゾーンおよびサブドメインを持つプライベート AKS クラスターを作成します。

# The custom private DNS zone name should be in one of the following formats: "privatelink.<region>.azmk8s.io" or "<subzone>.privatelink.<region>.azmk8s.io"

az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resourceID> \
    --private-dns-zone <custom private dns zone resourceID> \
    --fqdn-subdomain <subdomain> \
    --generate-ssh-keys

プライベート クラスターをプライベート DNS ゾーンからパブリックに更新する

Note

この機能には、aks-preview 拡張機能のバージョン >= 0.5.97 が必要です

次のフラグを指定した az aks update コマンドを使用して、プライベート クラスターを byo または system から none に更新します。

az aks update --name <private-cluster-name> --resource-group <private-cluster-resource-group> --private-dns-zone none

Note

byo または system から none にのみ更新できます。 それ以外の更新値の組み合わせはサポートされていません。

プライベート クラスターに接続するための選択肢

API サーバー エンドポイントには、パブリック IP アドレスがありません。 API サーバーを管理するには、AKS クラスターの Azure Virtual Network (VNet) にアクセスできる VM を使用する必要があります。 プライベート クラスターへのネットワーク接続を確立するには、いくつかの選択肢があります。

Note

AKS クラスターと同じ VNet に VM を作成するのが最も簡単な方法です。 Express Route と VPN にはコストがかかり、ネットワークがさらに複雑になります。 仮想ネットワーク ピアリングを利用する場合、重複する範囲がないようにネットワーク CIDR 範囲を計画する必要があります。

仮想ネットワーク ピアリング

仮想ネットワーク ピアリングはプライベート クラスターにアクセスする方法の 1 つです。 仮想ネットワーク ピアリングを使用するには、仮想ネットワークとプライベート DNS ゾーンの間にリンクを設定する必要があります。

  1. Azure portal 内でノードのリソース グループに移動し、プライベート DNS ゾーンのリソースを選択します。
  2. サービス メニュー内で、[DNS の管理] の下にある [仮想ネットワーク リンク]>[追加] を選択します。
  3. [仮想ネットワーク リンクの追加] ページ上で、次の設定を構成します。
    • [リンク名]: 仮想ネットワーク リンクの名前を入力します。
    • [仮想ネットワーク]: VM を含む仮想ネットワークを選択します。
  4. [作成] を選択して仮想ネットワーク リンクを作成します。
  5. クラスターの仮想ネットワークを含むリソース グループに移動し、仮想ネットワークのリソースを選択します。
  6. サービス メニュー内で、[設定] の下にある [ピアリング]>[追加] を選択します。
  7. [ピアリングの追加] ページ上で、次の設定を構成します。
    • [Peering link name]: ピアリング リンクの名前を入力します。
    • [仮想ネットワーク]: VM の仮想ネットワークを選択します。
  8. [追加] を選択してピアリング リンクを作成します。

詳細については、「[仮想ネットワーク ピアリング](../virtual-network/virtual-network-peering-overview.md)」をご覧ください。

カスタム DNS を使用したハブとスポーク

ハブとスポークのアーキテクチャは、Azure でネットワークをデプロイするためによく使用されます。 これらのデプロイの多くでは、オンプレミスと Azure ベースの DNS 解決が可能となるよう、スポーク VNet の DNS 設定は中央の DNS フォワーダーを参照するように構成されます。 このようなネットワーク環境に AKS クラスターをデプロイする場合、いくつかの特別な考慮事項があります。

プライベート クラスターのハブとスポーク

  • 既定では、プライベート クラスターがプロビジョニングされると、プライベート エンドポイント (1) とプライベート DNS ゾーン (2) がクラスター管理対象リソース グループに作成されます。 クラスターによりプライベート ゾーンの A レコードが使用され、API サーバーとの通信のためにプライベート エンドポイントの IP が解決されます。
  • プライベート DNS ゾーンは、クラスター ノードが接続されている VNet にのみリンクされます (3)。 つまり、プライベート エンドポイントは、そのリンクされた VNet 内のホストによってのみ解決できます。 VNet にカスタム DNS が一切構成されていないシナリオ (既定) では、これは問題なく機能します。リンクされているためにプライベート DNS ゾーン内のレコードを解決できる DNS の 168.63.129.16 が、ホストによって指定されるためです。
  • クラスターを含む VNet にカスタム DNS 設定があるシナリオでは (4)、プライベート DNS ゾーンがカスタム DNS リゾルバーを含む VNet にリンクされていない限り (5)、クラスターのデプロイは失敗します。 このリンクは、クラスターのプロビジョニング中にプライベート ゾーンを作成した後に手動で、またはイベントベースのデプロイ メカニズム (Azure Event Grid や Azure Functions など) を使用したゾーンの作成の検出時に自動で、作成することができます。 初期デプロイの間にクラスターの障害を回避するため、プライベート DNS ゾーンのリソース ID を使ってクラスターをデプロイできます。 これは、リソースの種類 Microsoft.ContainerService/managedCluster と API バージョン 2022-07-01 でのみ機能します。 ARM テンプレートまたは Bicep リソース定義での古いバージョンの使用はサポートされていません。

Note

条件付き転送では、サブドメインはサポートされていません。

Note

kubernet で独自のルート テーブルを使用し、プライベート クラスターで独自の DNS を使用する場合、クラスターの作成は失敗します。 作成を成功させるためには、クラスターの作成に失敗した後、ノード リソース グループの RouteTable をサブネットに関連付ける必要があります。

プライベート エンドポイント接続を使用する

プライベート エンドポイントを設定して、VNet がプライベート クラスターと通信するためにピアリングする必要がないようにすることができます。 使用リソースを含む仮想ネットワーク内に新しいプライベート エンドポイントを作成した後、仮想ネットワークと同じネットワーク内の新しいプライベート DNS ゾーンの間にリンクを作成します。

重要

仮想ネットワークがカスタム DNS サーバーで構成されている場合は、環境に適切なプライベート DNS を設定する必要があります。 詳細については、仮想ネットワークの名前解決のドキュメントを参照してください。

プライベート エンドポイントの作成のリソース

VNet にプライベート エンドポイント リソースを作成します。

  1. Azure portal の [ホーム] ページから [リソースの作成] を選択します。
  2. プライベート エンドポイント」を検索して、[作成] >[プライベート エンドポイント] を選択します。
  3. [作成] を選択します
  4. [基本] タブで次の設定を構成します。
    • プロジェクトの詳細
      • サブスクリプション: プライベート クラスターがあるサブスクリプションを選択します。
      • [リソース グループ]: 仮想ネットワークを含むリソース グループを選択します。
    • インスタンスの詳細
      • [名前]: プライベート エンドポイントの名前を入力します (「myPrivateEndpoint」など)。
      • [地域]: 仮想ネットワークと同じ地域を選びます。
  5. [次: リソース >] を選択し、次の設定を構成します。
    • 接続方法: [マイ ディレクトリ内の Azure リソースに接続する] を選択します。
    • サブスクリプション: プライベート クラスターがあるサブスクリプションを選択します。
    • リソースの種類: Microsoft.ContainerService/managedClusters を選択します。
    • リソース: プライベート クラスターを選択します。
    • ターゲット サブリソース: [管理] を選択します。
  6. [次: 仮想ネットワーク >] を選択し、次の設定を構成します。
    • ネットワーク
      • 仮想ネットワーク:仮想ネットワークを選択します。
      • サブネット: サブネットを選択します。
  7. [次へ: DNS]>[次へ: タグ] を選択し、(オプションで) 必要に応じて Key-Value を設定します。
  8. [次: 確認および作成]>[作成] を選択します。

リソースが作成されたら、将来使用するためにプライベート エンドポイントのプライベート IP アドレスを記録します。

プライベート DNS ゾーンの作成

プライベート エンドポイントの作成が完了したら、プライベート クラスターによって作成されたプライベート DNS ゾーンと同じ名前で、新しいプライベート DNS ゾーンを作成します。 この DNS ゾーンは、使用リソースを含む VNet 内に作成することに注意してください。

  1. Azure portal 内で、ノードのリソース グループに移動し、プライベート DNS ゾーンのリソースを選択します。
  2. サービス メニュー内で、[DNS の管理] の下にある [レコードセット] を選択し、次の情報をメモに書き留めてください。
    • プライベート DNS ゾーンの名前。*.privatelink.<region>.azmk8s.io のパターンに従います。
    • A レコードの名前 (プライベート DNS 名を除く)。
    • 有効期限 (TTL)。
  3. Azure portal の [ホーム] ページから [リソースの作成] を選択します。
  4. プライベート DNS ゾーン」を検索し、[作成]>[プライベート DNS ゾーン] を選択します。
  5. [基本] タブで次の設定を構成します。
    • プロジェクトの詳細:
      • サブスクリプションを選択します。
      • プライベート エンドポイントを作成したリソース グループを選択します。
    • インスタンスの詳細
      • [名前]: 前の手順で取得した DNS ゾーンの名前を入力します。
      • リージョンの既定値は、リソース グループの場所です。
  6. [確認と作成]>[作成] の順に選択します。

A レコードを作成する

プライベート DNS ゾーンが作成されたら、プライベート エンドポイントをプライベート クラスターに関連付ける A レコードを作成します。

  1. 前の手順で作成したプライベート DNS ゾーンに移動します。
  2. サービス メニュー内で、[DNS の管理] の下にある [レコードセット]>[追加] を選択します。
  3. [レコード セットの追加] ページ上で、次の設定を構成します。
    • [名前]: プライベート クラスターの DNS ゾーン内で A レコードから取得した名前を入力します。
    • 種類: [A - アドレス レコード]を選択します。
    • TTL: プライベート クラスターの DNS ゾーンの A レコードの番号を入力します。
    • TTL ユニット: プライベート クラスターの DNS ゾーンの A レコードと一致するようにドロップダウン値を変更します。
    • IP アドレス: 作成したプライベート エンドポイントの IP アドレスを入力します。
  4. [追加] を選択し、A レコードを作成します。

重要

A レコードを作成する際は、完全修飾ドメイン名 (FQDN) ではなく、名前のみを使用します。

A レコードが作成されたら、プライベート DNS ゾーンを、プライベート クラスターにアクセスする仮想ネットワークにリンクします。

  1. 前の手順で作成したプライベート DNS ゾーンに移動します。
  2. サービス メニュー内で、[DNS の管理] の下にある [仮想ネットワーク リンク]>[追加] を選択します。
  3. [仮想ネットワーク リンクの追加] ページ上で、次の設定を構成します。
    • リンク名: 仮想ネットワークの名前を入力します。
    • サブスクリプション: プライベート クラスターがあるサブスクリプションを選択します。
    • [仮想ネットワーク]: プライベート クラスターの仮想ネットワークを選択します。
  4. [作成] を選択して、リンクを作成します。

この操作が完了するまで数分かかる場合があります。 仮想ネットワーク リンクが作成されたら、手順 2 の中で使用した [仮想ネットワーク リンク] タブからアクセスできます。

警告

  • プライベート クラスターが停止して再起動されると、プライベート クラスターの元のプライベート リンク サービスが削除され、再作成されるため、プライベート エンドポイントとプライベート クラスター間の接続が切断されます。 この問題を解決するには、プライベート クラスターにリンクされているユーザーが作成したプライベート エンドポイントを削除して、再作成します。 再作成されたプライベート エンドポイントに新しい IP アドレスが含まれる場合は、DNS レコードも更新する必要があります。
  • プライベート DNS ゾーンで DNS レコードを更新する場合は、接続しようとしているホストが更新された DNS レコードを使用していることを確認します。 これは、nslookup コマンドを使用して確認できます。 更新内容が出力に反映されていないことに気付いた場合は、マシン上の DNS キャッシュをフラッシュして、もう一度やり直す必要があるかもしれません。

次のステップ

関連付けられているベスト プラクティスについては、AKS でのネットワーク接続とセキュリティに関するベスト プラクティスに関するページを参照してください。