つばろぐ

福岡のエンジニアによる技術的な備忘録です。

Visual StudioのKubernetes拡張機能がプレビュー公開されたので試してみたけどエラーが起きる

先日、Azure Kubernetes Service (AKS) が一般提供(GA)されました。ただし、西日本/東日本リージョンにはまだ提供されていないようです。

azure.microsoft.com

AKSのGAに伴ってか、Visual StudioにKubernetes拡張機能がプレビュー公開されました。ドキュメントはこちら。

Kubernetes tools tutorial - Visual Studio | Microsoft Docs

早速このチュートリアルを試してみましたが、どうもチュートリアル通りに動作しないためエラー内容を残しておきます。
なおこのチュートリアルの手順自体の説明は省きます。公式ドキュメントを参照してください。

KubernetesのCredentialsは ~/.kube/config に記載する必要がある (解決済)

AzureにAKSを作成したあと、下記のコマンドでKubernetesの認証情報を取得します。

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

私がよくKubernetesを試すとき、この認証情報は~/.kube/myAKSCluster.configのような名前のファイルに保管して、それを環境変数に指定して使用していました。
この状態でVisual StudioからAKSに発行を行おうとすると、下記のエラーが起きます。
AKSやACRの名称はダミーです。

Calling Helm
Ensuring that C:\Users\tsubaki\.kube\myAKSCluster.config is part of the KUBECONFIG environment variable
helm install --name myk8sapp "d:\src\Myk8sApp\\Myk8sApp\charts\myk8sapp" --set-string image.repository=myAKSCluster.azurecr.io/ --set-string image.tag=2018061412 --kube-context myAKSCluster
Calling helm install --name myk8sapp "d:\src\Myk8sApp\\Myk8sApp\charts\myk8sapp" --set-string image.repository=myAKSCluster.azurecr.io/ --set-string image.tag=2018061412 --kube-context myAKSCluster
Error: could not get Kubernetes config for context "myAKSCluster": context "myAKSCluster" does not exist

解決方法

このエラーを回避するには発行先のKubernetesの認証情報を~/.kube/configに追記する必要があります。
Docker for Windowsを使っていて、既に~/.kube/configが存在して別の認証情報が書いてある場合、ファイル内のclusterscontextsAKSの認証情報を追記して、current-contextに展開先のAKSの認証情報を指定します。

「tiller」が見つからないというエラーが起きる (未解決)

認証情報を正しく設定した上で改めて発行を行うと、下記のエラーが起きました。

Calling Helm
Ensuring that C:\Users\tsubaki\.kube\myAKSCluster.config is part of the KUBECONFIG environment variable
helm install --name myk8sapp "d:\src\Myk8sApp\\Myk8sApp\charts\myk8sapp" --set-string image.repository=myAKSCluster.azurecr.io/ --set-string image.tag=2018061412 --kube-context myAKSCluster
Calling helm install --name myk8sapp "d:\src\Myk8sApp\\Myk8sApp\charts\myk8sapp" --set-string image.repository=myAKSCluster.azurecr.io/ --set-string image.tag=2018061412 --kube-context myAKSCluster
Error: could not find tiller

tillerはこのチュートリアルの最初に、AKSクラスターに対して設定しているはずですが、見つからないというエラーが起きます。
どう対処してもこのエラーが解決していません。

それらしいIssueはありましたが解決せずにクローズされているため、対処法はわかっていません。

github.com

Helmやtillerそのものをもう少し勉強して理解する必要がありそうです。
何かしら解決方法がわかったら追記することにします😥

Azure Functionsの「Run-From-Zip Deployment」をデプロイできるところまで試してみた

先日開催されたde:code 2018の初日、牛尾さんのワタシハ Azure Functions チョットデキルというセッションに参加しました。

スライドはこちら

www.slideshare.net

Run-From-Zip Deploymentとは

Azure Functionsを従量課金プラン(Consumption Plan)で利用する場合、しばらく実行されていない関数に対してリソース節約のために「寝る」状態になります。
これを「Cold Start」という言葉で表現され、関数が実行するまでに待ち時間が発生します。
Azure Functionsを従量課金プランで利用する場合に考慮すべきアーキテクチャのポイントでもあります。

github.com

このCold Start状態の関数のパフォーマンスを改善する仕組みとして「Run-From-Zip Deployment」を使いましょうと牛尾さんの紹介がありました。

f:id:tech-tsubaki:20180527065512j:plain

デプロイ方法

その名の通り、Zipファイルを使ってデプロイします。
しかし従来のやり方である、App ServiceのKuduにアクセスしZipをアップロードする方法ではありません。

  1. 関数ファイルを含んだZipファイルを作成する。
  2. HTTP(s)経由でアクセス可能な場所にZipファイルをアップロードする。(Azure Blob Storageなど)
  3. Azure Functionsの環境変数WEBSITE_RUN_FROM_ZIP={ZipファイルのURL} を指定する。

この3つの手順でRun-From-Zip Deploymentを行うことができます。

f:id:tech-tsubaki:20180527070153j:plain

というところまでは簡単ですが、Zipファイルの構成をどうやるんだろうと疑問に思ったのでde:codeもくもく会で実際に試してみました。

牛尾さんからもアドバイスを頂きました。

C#スクリプトとNode.jsの関数でのRun-From-Zip Deployment

Azure FunctionsでC#スクリプトとNode.jsの関数を作成し、コンテンツをダウンロードすると、下記の構成のZipファイルがダウンロードされます。

$ tree
/path/to/yutadfmokumoku
|--bin
| |--de
| | |--Microsoft.Data.Edm.resources.dll
| | |--Microsoft.Data.OData.resources.dll
| | |--System.Spatial.resources.dll
| |--es
| | |--Microsoft.Data.Edm.resources.dll
| | |--Microsoft.Data.OData.resources.dll
| | |--System.Spatial.resources.dll
| |--fr
| | |--Microsoft.Data.Edm.resources.dll
| | |--Microsoft.Data.OData.resources.dll
| | |--System.Spatial.resources.dll
| |--it
| | |--Microsoft.Data.Edm.resources.dll
| | |--Microsoft.Data.OData.resources.dll
| | |--System.Spatial.resources.dll
| |--ja
| | |--Microsoft.Data.Edm.resources.dll
| | |--Microsoft.Data.OData.resources.dll
| | |--System.Spatial.resources.dll
| |--ko
| | |--Microsoft.Data.Edm.resources.dll
| | |--Microsoft.Data.OData.resources.dll
| | |--System.Spatial.resources.dll
| |--Microsoft.AspNetCore.Authentication.Abstractions.dll
| |--Microsoft.AspNetCore.Authentication.Core.dll
| |--Microsoft.AspNetCore.Authorization.dll
| |--Microsoft.AspNetCore.Authorization.Policy.dll
| |--Microsoft.AspNetCore.Hosting.Abstractions.dll
| |--Microsoft.AspNetCore.Hosting.Server.Abstractions.dll
| |--Microsoft.AspNetCore.Http.Abstractions.dll
| |--Microsoft.AspNetCore.Http.dll
| |--Microsoft.AspNetCore.Http.Extensions.dll
| |--Microsoft.AspNetCore.Http.Features.dll
| |--Microsoft.AspNetCore.JsonPatch.dll
| |--Microsoft.AspNetCore.Mvc.Abstractions.dll
| |--Microsoft.AspNetCore.Mvc.Core.dll
| |--Microsoft.AspNetCore.Mvc.Formatters.Json.dll
| |--Microsoft.AspNetCore.Mvc.WebApiCompatShim.dll
| |--Microsoft.AspNetCore.ResponseCaching.Abstractions.dll
| |--Microsoft.AspNetCore.Routing.Abstractions.dll
| |--Microsoft.AspNetCore.Routing.dll
| |--Microsoft.AspNetCore.WebUtilities.dll
| |--Microsoft.Azure.WebJobs.dll
| |--Microsoft.Azure.WebJobs.Extensions.dll
| |--Microsoft.Azure.WebJobs.Extensions.Http.dll
| |--Microsoft.Azure.WebJobs.Host.dll
| |--Microsoft.CSharp.dll
| |--Microsoft.Data.Edm.dll
| |--Microsoft.Data.OData.dll
| |--Microsoft.DotNet.PlatformAbstractions.dll
| |--Microsoft.Extensions.Configuration.Abstractions.dll
| |--Microsoft.Extensions.Configuration.dll
| |--Microsoft.Extensions.Configuration.EnvironmentVariables.dll
| |--Microsoft.Extensions.Configuration.FileExtensions.dll
| |--Microsoft.Extensions.Configuration.Json.dll
| |--Microsoft.Extensions.DependencyInjection.Abstractions.dll
| |--Microsoft.Extensions.DependencyModel.dll
| |--Microsoft.Extensions.FileProviders.Abstractions.dll
| |--Microsoft.Extensions.FileProviders.Physical.dll
| |--Microsoft.Extensions.FileSystemGlobbing.dll
| |--Microsoft.Extensions.Hosting.Abstractions.dll
| |--Microsoft.Extensions.Logging.Abstractions.dll
| |--Microsoft.Extensions.Logging.dll
| |--Microsoft.Extensions.ObjectPool.dll
| |--Microsoft.Extensions.Options.dll
| |--Microsoft.Extensions.Primitives.dll
| |--Microsoft.Net.Http.Headers.dll
| |--Microsoft.WindowsAzure.Storage.dll
| |--mokumoku.dll
| |--mokumoku.pdb
| |--NCrontab.dll
| |--Newtonsoft.Json.Bson.dll
| |--Newtonsoft.Json.dll
| |--ru
| | |--Microsoft.Data.Edm.resources.dll
| | |--Microsoft.Data.OData.resources.dll
| | |--System.Spatial.resources.dll
| |--runtimes
| | |--unix
| | | |--lib
| | | | |--netstandard1.1
| | | | | |--System.Runtime.InteropServices.RuntimeInformation.dll
| | | | |--netstandard1.3
| | | | | |--System.Diagnostics.TraceSource.dll
| | | | | |--System.Globalization.Extensions.dll
| | |--win
| | | |--lib
| | | | |--netstandard1.1
| | | | | |--System.Runtime.InteropServices.RuntimeInformation.dll
| | | | |--netstandard1.3
| | | | | |--System.Diagnostics.TraceSource.dll
| | | | | |--System.Globalization.Extensions.dll
| |--System.AppContext.dll
| |--System.Buffers.dll
| |--System.Collections.NonGeneric.dll
| |--System.Collections.Specialized.dll
| |--System.ComponentModel.Annotations.dll
| |--System.ComponentModel.dll
| |--System.ComponentModel.Primitives.dll
| |--System.ComponentModel.TypeConverter.dll
| |--System.Diagnostics.DiagnosticSource.dll
| |--System.Dynamic.Runtime.dll
| |--System.IO.FileSystem.Primitives.dll
| |--System.Linq.dll
| |--System.Linq.Expressions.dll
| |--System.Net.Http.Formatting.dll
| |--System.ObjectModel.dll
| |--System.Reflection.Emit.dll
| |--System.Reflection.Emit.ILGeneration.dll
| |--System.Reflection.Emit.Lightweight.dll
| |--System.Reflection.TypeExtensions.dll
| |--System.Runtime.CompilerServices.Unsafe.dll
| |--System.Runtime.Serialization.Formatters.dll
| |--System.Runtime.Serialization.Primitives.dll
| |--System.Spatial.dll
| |--System.Text.Encodings.Web.dll
| |--System.Text.RegularExpressions.dll
| |--System.Threading.dll
| |--System.Threading.Tasks.Dataflow.dll
| |--System.Threading.Tasks.Extensions.dll
| |--System.Xml.ReaderWriter.dll
| |--System.Xml.XmlDocument.dll
| |--zh-Hans
| | |--Microsoft.Data.Edm.resources.dll
| | |--Microsoft.Data.OData.resources.dll
| | |--System.Spatial.resources.dll
| |--zh-Hant
| | |--Microsoft.Data.Edm.resources.dll
| | |--Microsoft.Data.OData.resources.dll
| | |--System.Spatial.resources.dll
|--echo_csx
| |--function.json
| |--run.csx
|--echo_js
| |--function.json
| |--index.js
|--host.json
|--mokumoku.deps.json

これと全く同じ構成でZipファイルを作成することで、Run-From-Zip Deploymentとして使用することができます。

C#クラスライブラリの関数でのRun-From-Zip Deployment

やり方に悩んだのはC#クラスライブラリでの関数ファイルですが、無事デプロイすることができたので方法を共有します。
ただしC#クラスライブラリの関数はまだプレビューなので、今後仕様が変更となる可能性に注意してください。

docs.microsoft.com

  1. Visual Studio 2017でAzure Functionsプロジェクトを作成する。このとき「v2 (.NET Standard)」を選択すること。
  2. 適当な関数を追加する。
  3. プロジェクトを右クリック→「発行」をクリックする。
  4. フォルダーに発行するプロファイルを作成する。
    f:id:tech-tsubaki:20180527072908j:plain
  5. 発行したフォルダーに含まれるファイルをZip化する。
    f:id:tech-tsubaki:20180527072919j:plain

これでRun-From-Zip Deploymentを行うためのZipファイルを作成することができます。
あとはこれまでと同様に、Blobストレージなどにアップロードして、Azure Functionsの環境変数に指定すればデプロイが実行されます。

コマンドライン

C#クラスライブラリの関数は「.NET Standard」がベースになっているので dotnet コマンドで扱うことができます。

dotnet restore
dotnet publish -c Release

上記のコマンドラインで発行されたファイルをZip化すれば、Run-From-Zip Deploymentとして使用することができます。

f:id:tech-tsubaki:20180527074749j:plain

最後に

牛尾さんのセッションで紹介されるまで、Run-From-Zip Deploymentを知りませんでしたが、とても素晴らしい機能だと思います。
仕組みや利点についてはもう少し調べてから記事にしたいと思います。

de:code2018で参加したセッションと公開スライド(随時更新)

f:id:tech-tsubaki:20180523132433j:plain

今年もde:code 2018に参加してきましたよっと。

https://www.microsoft.com/ja-jp/events/decode/2018/

参加したセッションと公開スライドを書いていく。

Day1(5/22)

Transforming Intelligence

www.youtube.com

日本の第一人者が語る! C# の現状と今後への展望 「.NET Core 2.x 時代の C#

www.slideshare.net

ワタシハ Azure Functions チョットデキル

www.slideshare.net

Day2 (5/23)

Rakutenのマルチリージョン対応ハイブリッドAPIゲートウェイ

(スライド未公開)

Serverless の世界を進化させるイノベーション - Durable Functions

(スライド未公開)

Microsoft 365 と Microsoft Azure で実現するサーバーレス業務アプリケーション

(スライド未公開)

DevOps エンジニアに送る ガチ Kubernetes 講座 with Azure Kubernetes Service (AKS)

www.slideshare.net

.NET Core ではじめる Cloud Native API Architecture ~ .NET Core + Entity Framework Core + AKS (Kubernetes) ~

(スライド未公開)

コンテンツ/文書をより探しやすくするための Search x AI - Cognitive Search -

(スライド未公開)


いずれも素晴らしいセッションでした。
セッションスライドは公開され次第、随時更新します。