🎼

AKS の API Server の VNET 統合を試してみた

2022/09/17に公開

タイトルの機能がプレビュー提供されましたね!

早速、試してみました。

環境・準備

  • Windows 10
  • Windows PowerShell
  • Azure CLI (v2.40.0)

プレビュー機能を使う準備

公式ドキュメントの「aks-preview CLI 拡張機能をインストールする」「EnableAPIServerVnetIntegrationPreview プレビュー機能を登録する」を実施しておきます。

やってみた

VNET 統合を使うということは、基本的に自分で VNET およびサブネットを設計していきたいものだと思うので、自分で作成した VNET に構築する方法を実施してみました。

リソースグループの作成

$RGNAME = "<リソースグループ名>"
$CLUSTERNAME = "<クラスター名>"
$LOCATION = "eastus2"

az group create -l $LOCATION -n $RGNAME

仮想ネットワーク (VNET) の作成

まずは仮想ネットワークを作成。

$VNETNAME = "<仮想ネットワーク名>"

# Create the virtual network
az network vnet create -n $VNETNAME `
    -l $LOCATION `
    -g $RGNAME `
    --address-prefixes 172.19.0.0/16

各サブネットを作成します。

$APISUBNETNAME = "<API サーバーサブネット名>"

az network vnet subnet create --vnet-name $VNETNAME `
    -g $RGNAME `
    --name $APISUBNETNAME `
    --delegations Microsoft.ContainerService/managedClusters `
    --address-prefixes 172.19.0.0/28

$CLUSTERSUBNETNAME = "<クラスターサブネット名>"

az network vnet subnet create --vnet-name $VNETNAME `
    -g $RGNAME `
    --name $CLUSTERSUBNETNAME `
    --address-prefixes 172.19.1.0/24

ここで、上記コマンドの出力から id の箇所をコピーして変数に入れておきます。

$APISUBNETID = "<API サーバーサブネット作成コマンドの出力の id の値>"
$CLUSTERSUBNETID = "<クラスターサブネット作成コマンドの出力の id の値>"

マネージド ID を作成し、仮想ネットワークに対するアクセス許可を付与する

$MANAGEDIDNAME = "<マネージド ID 名>"

az identity create -n $MANAGEDIDNAME -l $LOCATION -g $RGNAME

上記コマンドの出力から clientId および id の箇所をコピーして変数に入れて、仮想ネットワークに対するアクセス許可を付与します。

$MANAGEDID = "<マネージド ID 作成コマンドの出力の clientId の値>"
$MANAGEDID_RID = "<マネージド ID 作成コマンドの出力の id の値>"

az role assignment create --scope $APISUBNETID `
    --role "Network Contributor" --assignee $MANAGEDID

az role assignment create --scope $CLUSTERSUBNETID `
    --role "Network Contributor" --assignee $MANAGEDID

AKS クラスターを作成する

az aks create -n $CLUSTERNAME `
    -g $RGNAME `
    -l $LOCATION `
    --network-plugin azure `
    --enable-private-cluster `
    --enable-apiserver-vnet-integration `
    --vnet-subnet-id $CLUSTERSUBNETID `
    --apiserver-subnet-id $APISUBNETID `
    --assign-identity $MANAGEDID_RID

接続確認

ローカル環境では、クラスターに接続はできないはずです。

> az aks get-credentials -n $CLUSTERNAME -g $RGNAME
The behavior of this command has been altered by the following extension: aks-preview
Merged "xxxxxxxxxxx" as current context in C:\Users\xxxxx\.kube\config

> kubectl get pods
Unable to connect to the server: dial tcp: lookup xxxxxxxxxx.private.eastus2.azmk8s.io: no such host

ということで、OK ですね。

次に、対象の VNET (クラスターサブネット) に Ubuntu VM を新規作成し、Azure CLI と kubectl をインストールして接続してみます。

$ kubectl get nodes
NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-19647542-vmss000000   Ready    agent   21m   v1.23.8
aks-nodepool1-19647542-vmss000001   Ready    agent   21m   v1.23.8
aks-nodepool1-19647542-vmss000002   Ready    agent   22m   v1.23.8

ということで、こちら (クラスターサブネット) からならアクセスすることができました!

まとめ

プライベートな Kubernetes 環境を構成するための機能が更に充実しましたね!

ちなみに、API サーバーサブネットには VM (管理用 VM など) を作成できないようなので、更に別に管理用のサブネットを設計しておくのが良いかもしれません。

#ネットワークの内部構造は複雑なので引き続き勉強が必要です🙄

Discussion