Azure Kubernetes Service (AKS) Tips 1

てらだよしお氏と某HackFestしたので気付いた点などつらつらと書いておくことにします。

AKS … Azure Kubernetes Serviceの略

k8s … Kubernetesの略

前提としてAzureをある程度知ってる、Kubernetesもある程度知ってることとします。AKSの概要的な話やk8sの概要・詳細については省きます。

チュートリアルとか無いの?

てらだよしお氏のGitHubリポジトリにワークショップなドキュメントがあるのでそちら参照。

AKSとk8sの境界がわかりにくい

このドキュメントあたりを参考に。k8sのマスターノードがAzure側に隠ぺいされて(管理しなくてもよい)、k8sのノードがAzureのVMで展開されるという感じです。出来上がってしまえば基本的にk8sの世界です。注意点はk8sのLoadBalancerやExternalIPの挙動などかな?

image

Windows上でローカルでk8sしたい

最新のDocker for WindowsをインストールしてKubernetesを有効にしましょう。

image

kubectlとかもインストールされるのでお手軽です。

リソースグループについて

AKS用リソースグループとは別にk8sのノード用VMやそのManaged Disks、VNETなどは別リソースグループが自動生成されそちらで管理されます。誤って削除したりしないようにしましょう。

また自動生成されるリソースグループ名は

MC_<AKSのリソースグループ名>_<AKS名>_<リージョン>

のようになります。(AKSのリソースグループ名にMC_とかつけちゃうとMC_MC_とかになります)

また自動生成されたリソースグループは最小で以下のような構成かな。

image

Httpアプリケーションルーティング無し、NetworkはBasic、ノードは1台の場合。Httpアプリケーションルーティング有りにするとAzure DNSなども作成されます。

あと見えないところでService Principalがテナント上に作成されてAKSに設定されます。(Service PrincipalそのものはAKS作成時必須なので(自動作成するか既存のID/Secretを使うか)気を付けましょう)

image

image

ここで作成したService Principalを使ってリソースを作成したり管理するので注意しましょう。また自動生成されたリソースグループのIAM見るとちゃんと権限設定されていることがわかります。

image

AKSのService Principal

例えばAzure Container Registry(ACR)にDockerイメージをPushするとして、それをk8sで使いたいとします。プライベートリポジトリにアクセスする際は通常imagePullSecret使ったりしますが、AKSのService Prinsipalをうまく使うことで省略させることができます。

ACRに対して読み取り(Reader)権限をService Principalに割り当てて置くとよいです。(ポータルで見るとこんな感じ)

image

他のテナントだったりこの手法が使えない場合や外部のプライベートリポジトリを使用する場合などはおとなしくimagePullSecret使いましょう。

といったようにService Principalの使いどころを抑えておくと便利です。

※余談ですがPrincipalには(代理人に対して)本人みたいな意味合いがあるようなので、この場合だと(AKSの)Service本人みたいな感じでしょうか。(利用者としてエンドユーザーの権限でAKSなどがアクセスする場合は委任ですよね)

AKSのHttpアプリケーションルーティングって?

K8sのIngressコントローラーを追加するのとExternal-DNSコントローラーを追加してくれます。

AKS作成後にOnにする場合はaz resource updateコマンドなどで properties.addonProfiles.httpApplicationRouting の enabledをtrueにすればいけるはず。。

image

なお個別にインストールすることもできるはずです。HttpアプリケーションルーティングをOffでAKS作成直後はAzureのPublicIPアドレスやLoadBalancerといったリソースは含まれていませんがingressコントローラーをインストールすれば自動的にこれらのリソースが追加されます。

External-DNSはAzure DNSなど外部DNSにレコード追加したりしてくれます。HttpアプリケーションルーティングをOnにして作成した場合、既定で<GUID>.<リージョン>.aksapp.io といったドメインが割り当てられます。k8s上でIngressで公開する際にaddon-http-application-routingアノテーションを使うと指定DNSゾーンにAレコードを作成してくれたりします。

管理用(k8sのマスターノード)のIPアドレスやホスト名は別管理なので、インターネットに公開したい何かがある場合は最初からHttpアプリケーションルーティングをOnにしておくと手間がないかもしれません。

AKSのネットワークのBaiscとAdvanced

AKS作成時に指定できるネットワーク構成のBasicとAdvanced(基本と高度)の違いはこちら。

BasicにするとAKS専用VNETに配置されます。PODへの直接通信はNG。ノード当たりの最大POD数も110までかな。

Advancedは既存のVNETに参加したりネットワーク構成を柔軟にできます。(ただしサブネットはAKS専用にしないとだめ)
Azure Container Networking Interface (CNI)を使うのでPODを直接VNETに接続できます。他のVNET上のVMやオンプレミスからPODへ直接アクセスしたりできます。その他サービスエンドポイントを活用したりとかいろいろ。ノード当たりの最大POD数は既定値30ですが変更可。細かい点はドキュメント参照で。

Azure PowerShellでAKSを管理したい

PowerShell Core版のAzure PowerShellにはAKS関連あるらしい。Azure CLI使うのが無難な予感。(今時点の話)

余談ですがk8sの管理はkubectl使うのが一番わかりやすいです。(k8sのノードの増減などはAKS側の管理範囲です)

Windows Serverコンテナーも使いたい

AKS作成をARMテンプレートで行う際にosTypeをWindowsにして作りましょう。あわせてwindowsProfile(Adminのユーザー名やパスワード)も必要です。(今時点の話)※非推奨かも

image

デプロイ後、kubectl describe nodsで見るとちゃんとWindowsでした。

image

Windows Server Version 1803みたいですね。Windows Serverコンテナー動かすときのイメージには注意しましょう。(作成はポータルやCLIで対応してほしいところ)

※WindowsのノードはAKS作成時のみ指定可能なようなので注意しましょう。

ちなみにLinux、Windows両方のノードを展開している状態でスケール(ノードの台数増減)すると既定と思われるLinuxのノードだけスケールします。注意しましょう。

それ以外の選択肢としてはAzure Container Instancesを使うVirtual Kubeletを使う方法もあります。(通信がAKS外にでちゃいますけど)

※Hyper-Vコンテナー対応(PODをHyper-Vで分離する)はk8s 1.10でサポート入ったようですがACS Engineのバグ?かまだまだAKS上だと厳しいかもしれない。(そもそも今時点の制限で1コンテナー/1podのみ構成可みたいだし使いどころが難しいですね)※未確認です

接続先のk8sのクラスターを切り替えたい

az aks get-credential すると指定したクラスターの情報が ~/.kube/configにマージされるので、あとは kubectl config use-context で楽に切り替えられます。

※Docker for Windows の kubernetesメニューでもコンテキストの切り替えができます。

Visual Studioでデバッグしたい

Visual Studio Tools for KubernetesAzure Dev Spacesを使うことでパブリックな環境で動作しているASP.NET Webアプリケーションのデバッグが可能です。(接続先のAKSはHTTアプリケーションルーティングが有効なAKSかつk8sが1.9.6以降のクラスターが必要です)

imageimage

構成後、Azure Dev Spacesプロファイルで起動するとAKSの指定したネームスペースにアプリがデプロイされます。デバッグで起動するブラウザーのURLはlocalhostなので一瞬ローカルと思いますが、実際にはポートフォワードしてAKS上に接続しています。

image

Dev Spacesに関する情報などはVisual Studioに追加された azds.yaml ファイルにあります。展開される内容については同じく追加されたchartsフォルダ内にいろいろあるのでそちらを編集しましょう。(Helm Chartなので良しなにしましょう)

※external-DNSとか構成するようにすれば外部からのアクセスも行えるはずです。

Visual Studio CodeもExtensionをインストールすれば同じような理屈でデバッグできます。

Azure Key Vaultを使いたい

FlexVolumeというのがあるのでそちらを使うといいかもしれません。

Helm使いたい

Azure Cloud Shell上で実行するのが手間がないかも。。kubectlもAzure CLIも入っているので楽です。

Helmでingress追加しようとすると”Could not find tiller”エラーになる

 helm install stable/nginx-ingress --namespace kube-system 

するとCloud not find tiller エラーになる場合は以下のようにしてみるといいかも。

 
helm init --upgrade 

kubectl create serviceaccount --namespace kube-system tiller 
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller  
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

その後以下のような感じで。(RBAC無しでAKS構成した場合)

helm install stable/nginx-ingress --namespace kube-system --set rbac.create=false 

CI/CDしたい

お手軽なのはAzure DevOps ProjectでVisual Studio Team Services上にプロジェクトを作り、デプロイ先をk8sにすることです。(AzureポータルからDevOps Project作るとAKSを新規作成することになりますが…)

一度出来上がったプロジェクトを見て、Helmを使ったビルドやリリースのパイプラインを参考にすればよいかと思います。

image

※DevOps Project作成時に含まれるサンプルプロジェクトにHelm Chartの設定もあるので、そのあたりも必要になるかな。(上述のVisual Studioのk8s対応プロジェクト作るとHelm Chartも含まれるのでその状態でソース管理してパイプライン作ればたぶん行けるんじゃないかな!知らんけど)

RBACがよくわからない

RBACの話は重いので別Postで…

… 気が向いたら続きます。

Azure Kubernetes Service (AKS) Tips 1」への1件のフィードバック

  1. ピンバック: Azure Kubernetes Service (AKS ) Tips 2 / RBAC | ブチザッキ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中