Hejdaの見る夢

一人前のエンジニアを目指して頑張ったこととかをつらつら書くブログ

Serverless NEG を試す ~Serverless NEG とは?~

注意

この記事は 別記事の Serverless NEG とは? をコピーしています

構成

この記事の内容は長いため複数の記事に跨って作成しています。

適宜、興味のある記事を参照して下さい。

やること

Serverless Network Endpoint Groups の概要を把握します

Serverless NEG とは?

正式名称は Serverless Network Endpoint Groups です。

GCP には Network Endpoint Group (NEG) という機能があり、 Zonal Network Endpoint GroupsInternet Network Endpoint Groups という 2 種類の NEG がありました。

2020/07/08 に GCP のサーバレスなコンポーネントに対応した NEG の Beta 版が出ました。

現在、 Serverless NEG が対応しているのは Cloud Run, Cloud Functions, App Engine です。

2020/07/27 の時点では Pre-GA というステータスであり、GA までに機能やサポートの制限の変更がある可能性がある状態です。

次の図は、 HTTP(S) Load Balancing model に Serverless NEG がどのように収まるかを示しています。

上記のように、Load Balancer の実際のバックエンドサービスとして、Cloud Run などを使用することが出来るようになります。

Cloud Run や App Engine などは、単独でも強力なスケーリング機能や高い拡張性があるサーバレスなコンポーネントですが今回のアップデートにより、そのコンポーネントGCP の強力な Load Balancer のバックエンドに設定することが出来るようになり、構築出来るアプリケーションの拡張性がさらに高くなります。

上記の図では、Serverless NEG は or で表現されていますが、 URL map などを適宜設定することにより、 1 つの Load Balancer の配下に複数のサーバレスコンポーネントを設定することも出来ます。

今回は、 1 つの Load Balancer の配下に、Cloud Run, App Engine, Cloud Functions を 1 つずつ設定して、Web ブラウザで挙動を見てみようと思います :)

まとめ

これで Serverless NEG の概要を把握しました!!

次は Cloud RUN, App Engine, Cloud Functions の準備 をやっていきます!

Have fun! :)

Packer を使って GCE のカスタムイメージを作成する

最終的に出来るもの

GCE の カスタムイメージ

最終的なコードは以下に記載しています

github.com

Packer とは

Hashicorp 社が提供している、マシンイメージをマルチプラットフォームにて作成することが出来る OSS のツールです

具体的に言うと AWS なら カスタム AMI、Azure なら VM のカスタムイメージなどを作成することが出来ます

www.packer.io

今回は Pakcer を用いて GCE のカスタムイメージを作成します

また、Packer の中で Provisioners の機能を使うことで、インスタンスの構築工程をコードで管理することが出来ます

www.packer.io

今回は Ansible を使用します

Packer の中で Provisioners を使う基本例

以下のように、 packer.json の中で buildersprovisioners ブロックがあり、それぞれ設定します

今回は buildersGoogle Compute Builder (type: googlecompute)、 provisioners に Ansible Provisioner (type: ansible) を設定します

具体的な例は こちら を参照してください

{
  "builders" : [
    {
      "{{ ここに Builders の設定する : https://www.packer.io/docs/builders/index.html }}"
    }
  ],
  "provisioners": [
    {
      "{{ ここに Provisioners の設定する : https://www.packer.io/docs/provisioners/index.html }}"
    }
  ]
}

環境の準備

カスタムイメージを作成するために GCP 上のネットワークを作成します

Packer のデフォルトの設定だと defaultVPC ネットワークを使用しますが、今回は自分で VPC ネットワークを作成し、その中で作成するようにします

export _project_id='pkg-gcp-instance-packer'
export _region='asia-northeast1'
export _vpc_network_name='iganari-test-vpc'
export _subnet_name='iganari-test-subnet'
export _firewall_ssh='allow-ssh-all'
  • VPC ネットワークの作成
gcloud beta compute networks create ${_vpc_network_name} \
  --project ${_project_id} \
  --bgp-routing-mode=global \
  --subnet-mode=custom
  • サブネットの作成
gcloud beta compute networks subnets create ${_subnet_name} \
  --project ${_project_id} \
  --network ${_vpc_network_name} \
  --region ${_region} \
  --range 172.16.0.0/12
  • Firewall Rules を作成
    • 22 番ポート および ICMP を許可
gcloud compute firewall-rules create ${_firewall_ssh} \
  --project ${_project_id} \
  --direction=INGRESS \
  --priority=1000 \
  --network ${_vpc_network_name} \
  --action=ALLOW \
  --rules=tcp:22,icmp \
  --source-ranges=0.0.0.0/0 \
  --target-tags=allow-ssh-all

---> これで環境の準備が完了しました!!

Packer を用いて基本的なイメージを作る

上記で作成したネットワークおよび Firewall Rules を用いて、Packer を実行します

{
  "builders" : [
    {
      "type": "googlecompute",
      "project_id": "pkg-gcp-instance-packer",
      "source_image": "ubuntu-minimal-1910-eoan-v20200406",
      "disk_size": "20",
      "ssh_username": "packer",
      "zone": "asia-northeast1-a",
      "network": "iganari-test-vpc",
      "subnetwork": "iganari-test-subnet"
    }
  ]
}
  • 実行コマンド
packer build packer.json
  • 結果
# packer build packer.json
googlecompute: output will be in this color.

==> googlecompute: Checking image does not exist...
==> googlecompute: Creating temporary SSH key for instance...
==> googlecompute: Using image: ubuntu-minimal-1910-eoan-v20200406
==> googlecompute: Creating instance...
    googlecompute: Loading zone: asia-northeast1-a
    googlecompute: Loading machine type: n1-standard-1
    googlecompute: Requesting instance creation...
    googlecompute: Waiting for creation operation to complete...
    googlecompute: Instance has been created!
==> googlecompute: Waiting for the instance to become running...
    googlecompute: IP: 104.198.85.143
==> googlecompute: Using ssh communicator to connect: 104.198.85.143
==> googlecompute: Waiting for SSH to become available...
==> googlecompute: Connected to SSH!
==> googlecompute: Deleting instance...
    googlecompute: Instance has been deleted!
==> googlecompute: Creating image...
==> googlecompute: Deleting disk...
    googlecompute: Disk has been deleted!
Build 'googlecompute' finished.

==> Builds finished. The artifacts of successful builds are:
--> googlecompute: A disk image was created: packer-1588585792

---> packer-1588585792 という名前の カスタムイメージが出来ました!!

Packer の中で、Ansible を使用する

次に provisioners の設定を加えていきます

今回は Ansible の細かい説明は省きます

  • packer.json
    • provisioners の他に、 builders のブロックの中に tagsscopes を追加
    • tags は、インスタンスにネットワークタグを付与する設定であり、 Ansible (Remote) を実行するが故に 22 ポートを ALLOW する FireWall Rules が必要
    • scorep アクセススコープを設定するものであり、Ansible のなかで Monitoring agent をインストールする際に、monitoring API にアクセス出来るようにしておく必要があるから設定
{
  "builders" : [
    {
      "type": "googlecompute",
      "project_id": "pkg-gcp-instance-packer",
      "source_image": "ubuntu-minimal-1910-eoan-v20200406",
      "disk_size": "20",
      "ssh_username": "packer",
      "zone": "asia-northeast1-a",
      "network": "iganari-test-vpc",
      "subnetwork": "iganari-test-subnet",
      "tags": "allow-ssh-all",
      "scopes": [
        "https://www.googleapis.com/auth/cloud-platform"
      ]
    }
  ],
  "provisioners": [
    {
      "type": "ansible",
      "playbook_file": "./ansible/playbook.yml",
      "groups": "pkg-gcp-custom-image-ubuntu1910",
      "user": "packer"
    }
  ]
}
$ tree
.
├── ansible
│   ├── ansible.cfg
│   ├── playbook.yml
│   └── roles
│       ├── common
│       │   └── tasks
│       │       └── main.yml
│       ├── gcp_logging-agent
│       │   ├── README.md
│       │   ├── handlers
│       │   │   └── main.yml
│       │   └── tasks
│       │       └── main.yml
│       ├── gcp_monitoring-agent
│       │   ├── README.md
│       │   ├── handlers
│       │   │   └── main.yml
│       │   └── tasks
│       │       └── main.yml
│       ├── nginx
│       │   ├── README.md
│       │   ├── files
│       │   │   └── etc
│       │   │       ├── apt
│       │   │       │   └── sources.list.d
│       │   │       │       └── nginx.list
│       │   │       ├── logrotate.d
│       │   │       │   └── nginx
│       │   │       └── nginx
│       │   │           ├── nginx.conf
│       │   │           ├── sites-available
│       │   │           └── sites-enabled
│       │   │               └── default.conf
│       │   ├── handlers
│       │   │   └── main.yml
│       │   └── tasks
│       │       └── main.yml
│       └── user
│           ├── files
│           │   └── etc
│           │       └── sudoers.d
│           │           └── iganari
│           ├── readme.md
│           └── tasks
│               └── main.yml
└── packer.json
  • ansible/playbook.yml
#
# playbook.yml
#

- hosts: pkg-gcp-custom-image-ubuntu1910
  remote_user: packer
  become: yes
  roles:
    - role: common
      tags: common
    - role: nginx
      tags: nginx
    - role: gcp_logging-agent
      tags: gcp_logging-agent
    - role: gcp_monitoring-agent
      tags: gcp_monitoring-agent
    - role: user
      tags: user
  • 実行コマンド
packer build packer.json
  • 結果
# packer build packer.json
googlecompute: output will be in this color.

==> googlecompute: Checking image does not exist...
==> googlecompute: Creating temporary SSH key for instance...
==> googlecompute: Using image: ubuntu-minimal-1910-eoan-v20200406
==> googlecompute: Creating instance...
    googlecompute: Loading zone: asia-northeast1-a
    googlecompute: Loading machine type: n1-standard-1
    googlecompute: Requesting instance creation...
    googlecompute: Waiting for creation operation to complete...
    googlecompute: Instance has been created!
==> googlecompute: Waiting for the instance to become running...
    googlecompute: IP: 104.198.85.143
==> googlecompute: Using ssh communicator to connect: 104.198.85.143
==> googlecompute: Waiting for SSH to become available...
==> googlecompute: Connected to SSH!
==> googlecompute: Provisioning with Ansible...
==> googlecompute: Executing Ansible: ansible-playbook --extra-vars packer_build_name=googlecompute packer_builder_type=googlecompute -o IdentitiesOnly=yes -i
 /tmp/packer-provisioner-ansible505942569 /home/gcloud/package-gcp/compute/instances/create-custom-image-using-packer/ansible/playbook.yml -e ansible_ssh_priv
ate_key_file=/tmp/ansible-key999591282
    googlecompute: [DEPRECATION WARNING]: The TRANSFORM_INVALID_GROUP_CHARS settings is set to
    googlecompute: allow bad characters in group names by default, this will change, but still be
    googlecompute: user configurable on deprecation. This feature will be removed in version 2.10.
    googlecompute:  Deprecation warnings can be disabled by setting deprecation_warnings=False in
    googlecompute: ansible.cfg.
    googlecompute: [WARNING]: Invalid characters were found in group names but not replaced, use
    googlecompute: -vvvv to see details
    googlecompute:
    googlecompute: PLAY [pkg-gcp-custom-image-ubuntu1910] *****************************************
    googlecompute:
    googlecompute: TASK [Gathering Facts] *********************************************************
    googlecompute: ok: [default]
    googlecompute:
    googlecompute: TASK [common : Upgrade all packages to the latest version] *********************
    googlecompute: changed: [default]

--割愛--

    googlecompute:
    googlecompute: PLAY RECAP *********************************************************************
    googlecompute: default                    : ok=29   changed=23   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    googlecompute:
==> googlecompute: Deleting instance...
    googlecompute: Instance has been deleted!
==> googlecompute: Creating image...
==> googlecompute: Deleting disk...
    googlecompute: Disk has been deleted!
Build 'googlecompute' finished.

==> Builds finished. The artifacts of successful builds are:
--> googlecompute: A disk image was created: packer-1588587422

---> packer-1588587422 という名前の カスタムイメージが出来ました!!

var-file に変数を切り出す

packer コマンドは -var-file オプションを使うことで変数を切り出すことが出来ます

www.packer.io

{{user `変数名`}}

これを使い、packer.json の中で変更する可能性のものを切り出します

{
  "builders" : [
    {
      "type": "googlecompute",
      "project_id": "{{user `_project_id`}}",
      "source_image": "{{user `_source_image`}}",
      "disk_size": "{{user `_disk_size`}}",
      "ssh_username": "{{user `_ssh_username`}}",
      "zone": "{{user `_zone`}}",
      "network": "{{user `_network`}}",
      "subnetwork": "{{user `_subnetwork`}}",
      "tags": "{{user `_tags`}}",
      "image_name": "{{user `_image_name`}}-{{isotime | clean_resource_name}}",
      "scopes": [
        "https://www.googleapis.com/auth/cloud-platform"
      ]
    }
  ],
  "provisioners": [
    {
      "type": "ansible",
      "playbook_file": "{{user `_playbook_file`}}",
      "groups": "{{user `_groups`}}",
      "user": "{{user `_ssh_username`}}"
    }
  ]
}
{
  "_project_id": "pkg-gcp-instance-packer",
  "_source_image": "ubuntu-minimal-1910-eoan-v20200406",
  "_disk_size": "20",
  "_ssh_username": "packer",
  "_zone": "asia-northeast1-a",
  "_network": "projects/pkg-gcp-instance-packer/global/networks/iganari-test-vpc",
  "_subnetwork": "projects/pkg-gcp-instance-packer/regions/asia-northeast1/subnetworks/iganari-test-subnet",
  "_tags": "allow-ssh-all",
  "_image_name": "pkg-gcp-custom-image-ubuntu1910",
  "_playbook_file": "./ansible/playbook.yml",
  "_groups": "pkg-gcp-custom-image-ubuntu1910"
}
  • 実行コマンド
packer build -var-file=variables.json packer.json
  • 結果
--割愛--

==> Builds finished. The artifacts of successful builds are:
--> googlecompute: A disk image was created: pkg-gcp-custom-image-ubuntu1910-2020-05-04t10-30-09z

---> pkg-gcp-custom-image-ubuntu1910-2020-05-04t10-30-09z という名前の カスタムイメージが出来ました!!

Packer の Variables は使い方が豊富なので、運用に合わせて使い分けましょう

https://www.packer.io/docs/from-1.5/variables/

実行環境の環境変数を使う

変更する値のなかで、ホストマシンの環境変数を使いたい場合があります

その時は

{{env `_region`}}

を使用することが出来ます

変数によっては、あまり変更しないもの/よく変更するものとあるので、運用の仕方によってやりかたを変えましょう

今回は プロジェクト ID、VPC ネットワーク、サブネットワーク、Firwall Rules を環境変数にしたい場合を記載します

{
  "_project_id": "{{env `_project_id`}}",
  "_source_image": "ubuntu-minimal-1910-eoan-v20200406",
  "_disk_size": "20",
  "_ssh_username": "packer",
  "_zone": "{{env `_region`}}-a",
  "_network": "projects/{{env `_project_id`}}/global/networks/{{env `_vpc_network_name`}}",
  "_subnetwork": "projects/{{env `_project_id`}}/regions/{{env `_region`}}/subnetworks/{{env `_subnet_name`}}",
  "_tags": "allow-ssh-all",
  "_image_name": "pkg-gcp-custom-image-ubuntu1910",
  "_playbook_file": "./ansible/playbook.yml",
  "_groups": "pkg-gcp-custom-image-ubuntu1910"
}
export _project_id='pkg-gcp-instance-packer'
export _region='asia-northeast1'
export _vpc_network_name='iganari-test-vpc'
export _subnet_name='iganari-test-subnet'
export _firewall_ssh='allow-ssh-all'
  • 実行コマンド
packer build -var-file=variables.json packer.json
  • 結果
--割愛--

==> Builds finished. The artifacts of successful builds are:
--> googlecompute: A disk image was created: pkg-gcp-custom-image-ubuntu1910-2020-05-04t10-39-07z

---> pkg-gcp-custom-image-ubuntu1910-2020-05-04t10-39-07z という名前の カスタムイメージが出来ました!!

作成したカスタムイメージを使って、インスタンスを起動

実際に意図したカスタムイメージに仕上がっているか確認します

今回は Ansible にて、nginx をインストールしておいたので、それを確認します

  • Firewall Rules を作成
    • 80 番ポートおよび、 ICMP を許可
export _firewall_http='allow-http-all'
gcloud compute firewall-rules create ${_firewall_http} \
  --project ${_project_id} \
  --direction=INGRESS \
  --priority=1001 \
  --network ${_vpc_network_name} \
  --action=ALLOW \
  --rules=tcp:80,icmp \
  --source-ranges=0.0.0.0/0 \
  --target-tags=${_firewall_http}
  • gcloud コマンドによるインスタンス作成
    • 先程作成したカスタムイメージ pkg-gcp-custom-image-ubuntu1910-2020-05-04t10-39-07z を使用
export _custom_image='pkg-gcp-custom-image-ubuntu1910-2020-05-04t10-39-07z'
gcloud beta compute instances create packer-test\
  --project=${_project_id}\
  --zone=${_region}-a\
  --machine-type=f1-micro\
  --subnet=${_subnet_name}\
  --scopes=https://www.googleapis.com/auth/cloud-platform\
  --tags=${_firewall_ssh},${_firewall_http}\
  --image=${_custom_image}\
  --image-project=${_project_id}\
  --boot-disk-size=20GB\
  --boot-disk-type=pd-standard
  • 結果
# gcloud beta compute instances create packer-test\
>   --project=${_project_id}\
>   --zone=${_region}-a\
>   --machine-type=f1-micro\
>   --subnet=${_subnet_name}\
>   --scopes=https://www.googleapis.com/auth/cloud-platform\
>   --tags=${_firewall_ssh},${_firewall_http}\
>   --image=${_custom_image}\
>   --image-project=${_project_id}\
>   --boot-disk-size=20GB\
>   --boot-disk-type=pd-standard
WARNING: You have selected a disk size of under [200GB]. This may result in poor I/O performance. For more information, see: https://developers.google.com/compute/docs/disks#performance.
Created [https://www.googleapis.com/compute/beta/projects/pkg-gcp-instance-packer/zones/asia-northeast1-a/instances/packer-test].
NAME         ZONE               MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
packer-test  asia-northeast1-a  f1-micro                   172.16.0.18  104.198.85.143  RUNNING
  • nginx の確認
# curl 104.198.85.143
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

f:id:nari_kyu:20200504211433p:plain

---> nginx が起動していることが分かり、意図したカスタムイメージの作成は成功しているようです!!

リソース削除

作業が完了したので、余計なリソースは削除しておきましょう

gcloud beta compute instances delete packer-test\
  --project=${_project_id}\
  --zone=${_region}-a
gcloud compute firewall-rules delete ${_firewall_ssh}
gcloud compute firewall-rules delete ${_firewall_http}
  • サブネットの削除
gcloud beta compute networks subnets delete ${_subnet_name} \
  --project ${_project_id}
  • VPC ネットワークの削除
gcloud beta compute networks delete ${_vpc_network_name} \
  --project ${_project_id}

まとめ

Packer を使って GCE のカスタムイメージを作成する一例をまとめることが出来ました

Packer の使い方はもっといろいろあるので、是非試してみてください ;)

Have fun!

Microsoft Learn Day Online #1 に参加してきました🖊

概要

【オンライン開催】Microsoft Learn Day Online #1 に参加した際の感想です。

mslearn.connpass.com

趣旨としては Microsoft Learn をみんなでもくもくする会で、東京以外の支部も活発に活動しているらしいです。

いつもはオフラインでやっているようですが、昨今の状況を鑑みてオンラインで行うこととなり、今回がオンライン 1 回目とのこと。

過去にオフライン勉強会を各支部にて同日に行ない、それをオンラインで繋いだ経緯はあるようです。

わたしは去年に エア参加 した以来の 2 回目の参加でした ;)

iganari.hatenablog.com

勉強会の流れ

  • Youtube Live と Slack にて @akiyoshi さんの開始宣言、諸注意など
  • 完全にもくもくの時間
    • この間は YouTube Live は無音 + 直近のオンライン勉強会の紹介動画を淡々とループ
  • 終了宣言と成果報告のすゝめなど。

流れとしてはこれだけです!!

感想など

もくもくの時間が始まったら、基本的に運営側からの強制的なものは一切なく、個人の裁量に任せられている感じでした。

また、このコミュニティにも良い意味の「賑やかし」の方々が何人か居まして、この回は特に @mappie_kochi さんが自身のアウトプットをしつつ、他の方のサポートも精力的に行われていたのはすごく良かったと思います。

こういう方はとても重要ですよね ;)

私も初っ端でオススメのコレクションを聞き、それを学習しました

f:id:nari_kyu:20200328222838p:plain

  • お勧めされた @MS_odasho さんのコレクション
    • 20191210_AdventCalendar2019_MSLearn_Collection

docs.microsoft.com

まとめ

もくもく会としては過不足無く、かつ、周りとの進捗の違いによるプレッシャーも無いので、@akiyoshi さんの雰囲気作りが良いとともに「オンラインのもくもく会」の大きな可能性が見いだせたと思います。

今後とも是非、継続して行ってほしいと思います :)

Enjoy MSLearn !! :)

[2020/03/24 版] Private Azure Kubernetes Service cluster を構築する方法

内容を簡潔に。

  • 2020/03/09 に General Availability (GA) になった Private Azure Kubernetes Service (AKS) cluster を公式ドキュメントに沿って構築してみましたが出来ませんでした。
  • GitHub の Issue で解決方法が議論されていたので、それを参考に Private AKS cluster を構築することが出来ました。

ドキュメント

  • 公式ドキュメント

docs.microsoft.com

  • Bug 報告 Issue

github.com

重要なこと

このポストは公式ドキュメント及び Azure を責めるものではありません。

GA しているとはいえバグは付きものです。

皆でそれを積極的に報告し、GitHub 上で議論・解決策を模索している方々に助けられました。

とても感謝しているので記事に残しておこうと思いました。 (-人-)感謝

実際のコマンド

  • 必須条件
The Azure CLI version 2.2.0 or later
  • 変数の設定
export myclsname='my-private-aks-cluster'
export myrg='my-private-aks-cluster-resource-group'
export spname='my-private-aks-cluster-service-principal-name'
  • Resource Group の作成
az group create --location japaneast --name ${myrg}
  • Service Principal の作成
az ad sp create-for-rbac --name ${spname}
### ex

# az ad sp create-for-rbac --name ${spname}
Changing "my-private-aks-cluster-service-principal-name" to a valid URI of "http://my-private-aks-cluster-service-principal-name", which is the required format used for service principal names
Creating a role assignment under the scope of "/subscriptions/wwwwwwwwwwwwwwwwwwwwwwwwwwww"
  Retrying role assignment creation: 1/36
  Retrying role assignment creation: 2/36
{
  "appId": "xxxxxxxxxxxxxxxxxxxxxxxxx",
  "displayName": "my-private-aks-cluster-service-principal-name",
  "name": "http://my-private-aks-cluster-service-principal-name",
  "password": "yyyyyyyyyyyyy-yyyy-yyyy-yyyyyyyyyyyy",
  "tenant": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
}

---> appIdpassword を使用します。

  • 変数の設定
export spid='xxxxxxxxxxxxxxxxxxxxxxxxx'
export sppass='yyyyyyyyyyyyy-yyyy-yyyy-yyyyyyyyyyyy'
  • Private AKS cluster を作成
az aks create \
    --name ${myclsname} \
    --resource-group ${myrg} \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --service-principal ${spid} \
    --client-secret ${sppass}

Azure ポータルで確認

  • Private AKS cluster

f:id:nari_kyu:20200324061320p:plain

  • 通常の AKS cluster

f:id:nari_kyu:20200324061332p:plain

---> 詳しくは省きますが、Private AKS cluster を構築すると、通常の AKS cluster に比べ、上記のコンポーネントが増えるようです!!

まとめ

Bug 報告 Issue にて報告されてる方法、すなわち、

Service Principal を自分で作成して、az aks create 時に指定してあげることで、

無事に Private AKS cluster を構築することが出来るました。

この記事は Private AKS cluster を構築するところまでしかしていませんが、是非アプリを動かすところまでやってみて下さい。

Have fun !! :)