てらだよしお氏と某HackFestしたので気付いた点などつらつらと書いておくことにします。
AKS … Azure Kubernetes Serviceの略
k8s … Kubernetesの略
前提としてAzureをある程度知ってる、Kubernetesもある程度知ってることとします。AKSの概要的な話やk8sの概要・詳細については省きます。
チュートリアルとか無いの?
てらだよしお氏のGitHubリポジトリにワークショップなドキュメントがあるのでそちら参照。
AKSとk8sの境界がわかりにくい
このドキュメントあたりを参考に。k8sのマスターノードがAzure側に隠ぺいされて(管理しなくてもよい)、k8sのノードがAzureのVMで展開されるという感じです。出来上がってしまえば基本的にk8sの世界です。注意点はk8sのLoadBalancerやExternalIPの挙動などかな?
Windows上でローカルでk8sしたい
最新のDocker for WindowsをインストールしてKubernetesを有効にしましょう。
kubectlとかもインストールされるのでお手軽です。
リソースグループについて
AKS用リソースグループとは別にk8sのノード用VMやそのManaged Disks、VNETなどは別リソースグループが自動生成されそちらで管理されます。誤って削除したりしないようにしましょう。
また自動生成されるリソースグループ名は
MC_<AKSのリソースグループ名>_<AKS名>_<リージョン>
のようになります。(AKSのリソースグループ名にMC_とかつけちゃうとMC_MC_とかになります)
また自動生成されたリソースグループは最小で以下のような構成かな。
Httpアプリケーションルーティング無し、NetworkはBasic、ノードは1台の場合。Httpアプリケーションルーティング有りにするとAzure DNSなども作成されます。
あと見えないところでService Principalがテナント上に作成されてAKSに設定されます。(Service PrincipalそのものはAKS作成時必須なので(自動作成するか既存のID/Secretを使うか)気を付けましょう)
ここで作成したService Principalを使ってリソースを作成したり管理するので注意しましょう。また自動生成されたリソースグループのIAM見るとちゃんと権限設定されていることがわかります。
AKSのService Principal
例えばAzure Container Registry(ACR)にDockerイメージをPushするとして、それをk8sで使いたいとします。プライベートリポジトリにアクセスする際は通常imagePullSecret使ったりしますが、AKSのService Prinsipalをうまく使うことで省略させることができます。
ACRに対して読み取り(Reader)権限をService Principalに割り当てて置くとよいです。(ポータルで見るとこんな感じ)
他のテナントだったりこの手法が使えない場合や外部のプライベートリポジトリを使用する場合などはおとなしくimagePullSecret使いましょう。
といったようにService Principalの使いどころを抑えておくと便利です。
※余談ですがPrincipalには(代理人に対して)本人みたいな意味合いがあるようなので、この場合だと(AKSの)Service本人みたいな感じでしょうか。(利用者としてエンドユーザーの権限でAKSなどがアクセスする場合は委任ですよね)
AKSのHttpアプリケーションルーティングって?
K8sのIngressコントローラーを追加するのとExternal-DNSコントローラーを追加してくれます。
AKS作成後にOnにする場合はaz resource updateコマンドなどで properties.addonProfiles.httpApplicationRouting の enabledをtrueにすればいけるはず。。
なお個別にインストールすることもできるはずです。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のユーザー名やパスワード)も必要です。(今時点の話)※非推奨かも
デプロイ後、kubectl describe nodsで見るとちゃんとWindowsでした。
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 KubernetesとAzure Dev Spacesを使うことでパブリックな環境で動作しているASP.NET Webアプリケーションのデバッグが可能です。(接続先のAKSはHTTアプリケーションルーティングが有効なAKSかつk8sが1.9.6以降のクラスターが必要です)
構成後、Azure Dev Spacesプロファイルで起動するとAKSの指定したネームスペースにアプリがデプロイされます。デバッグで起動するブラウザーのURLはlocalhostなので一瞬ローカルと思いますが、実際にはポートフォワードしてAKS上に接続しています。
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を使ったビルドやリリースのパイプラインを参考にすればよいかと思います。
※DevOps Project作成時に含まれるサンプルプロジェクトにHelm Chartの設定もあるので、そのあたりも必要になるかな。(上述のVisual Studioのk8s対応プロジェクト作るとHelm Chartも含まれるのでその状態でソース管理してパイプライン作ればたぶん行けるんじゃないかな!知らんけど)
RBACがよくわからない
RBACの話は重いので別Postで…
… 気が向いたら続きます。
ピンバック: Azure Kubernetes Service (AKS ) Tips 2 / RBAC | ブチザッキ