Minikube + ASP.NET Core でHello Worldする

# Minikube + ASP.NET Core でHello Worldする

## 概要

- Minikubeを使ってLocalで ASP.NET Core 2.1のコンテナを動かす
- Kubernetesのコマンドに色々触れる
- AKSがGAしたので、AKSを使ってもいいが、最初はローカルで

( `kubectl`は「きゅーぶこんとろーる」と読んでいる人が多いので`minikube`も個人的には「みにきゅーぶ」と読んでいる（「くーべ」と言っている人を否定しているわけではない）

## 使用環境

- Ubuntu 16.04LTS
- Docker(Install済み)
- dotnet core SDK(Install済み)

## 環境準備

- Minikubeのインストール方法に関しては[こちら](https://kubernetes.io/docs/tutorials/hello-minikube/)を参照
- ただしなぜかMac前提なので、Ubuntuは[こちら](https://github.com/kubernetes/minikube)を見る

### 1. Minikubeをインストール

```shell
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
```

VirtualBoxが入っていない場合は[入れておく](https://www.virtualbox.org/wiki/Linux_Downloads)。
下記のコマンドでminikubeを起動する。
minikubeのデフォルトのハイパーバイザーはVirtualBoxなので、下記のコマンドでは勝手にVirtualBox上にminikubeが起動する。もし宗教上の理由などでO社製品が使えないといったタブーがある場合はKVMを使って起動のオプションを変えてやるといいかもしれない。

```shell
minikube start
```

### 2. Minikubeを起動させる

kubectlはこの記事を試す前に全然別のタイミングで入れたので、kubectlが入っていない場合は[ここ](https://kubernetes.io/docs/tasks/tools/install-kubectl/)を参考に入れておく。
ちなみにkubectlはクラウドネイティブ世代のSSHと言われている。
我々がSSHでリモートのLinuxサーバや仮想マシンにアクセスしてきたように、
クラウド上にあるkubernetesにアクセスして管理するためにkubectlを使うとのこと。

```shell
kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
kubectl expose deployment hello-minikube --type=NodePort
kubectl get pod
> NAME                             READY     STATUS    RESTARTS   AGE
> hello-minikube-6c47c66d8-2dldq   1/1       Running   1          1m
```

PodというのはKubernetesを扱う上ではよく出てくる言葉で概念は知っておいたほうがいい。
どのレイヤーを抽象化しているのか[こちらの図](https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-intro/)が非常にわかりやすい。

## アプリを作って動かす

### 1. dotnetのアプリのコンテナ作成する

newしてbuildしてrun出来るアプリを作る。手元に何も無ければ以下を実行。

```shell
dotnet new sampleapp
cd sampleapp
dotnet build
dotnet run
```

これで普通のASPのhello worldページが表示されるはず。
Dockerfileを作る。

```Dockerfile
FROM microsoft/dotnet:2.1-sdk-alpine AS build
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM microsoft/dotnet:2.1-aspnetcore-runtime-alpine AS runtime
WORKDIR /app
COPY --from=build /app/out .
ENTRYPOINT ["dotnet", "aspsample.dll"]
```

Dockerのコンテナイメージをminikube上からpull出来るようにdockerの環境変数を変更。

```shell
eval $(minikube docker-env)
```

普通にbuildしてrun

```shell
docker build -t aspsample:v1 .
docker run -d -p 8080:80 --name aspapp aspsample
```

### 2. アプリをデプロイする

[Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)はこちらに詳しい。

```shell
kubectl run aspdeployment --image=aspapp:v1 --port=8080
kubectl get deployments
> NAME             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
> aspdeployment    1         1         1            1           1m
```

ポートを開けてサービスを起動する。

```shell
kubectl expose deployment aspdeployment --type=LoadBalancer --port=80
minikube service aspdeployment
```
ブラウザが開きhello worldページがみれるはず。


## 最後に

- .NET系の開発者がメインで使っているであろうWindows環境でこれらを色々試そうとすると、3時間ドハマりして出来なかったことが、Ubuntu上で色々やると10秒で出来て捗る
- Visual StudioにもKubernetesのプラグインがそのうち追加されそうだけど、([現在はプレビュー](https://blogs.msdn.microsoft.com/visualstudio/2018/06/08/preview-of-visual-studio-kubernetes-tools/))ある程度枯れるまでは全然期待してない。(プラグインが良くても他がよくならないと意味ない)
- なので、今後時代はkubernetesだー！と思っている.NETエンジニアは最初からMacやLinuxを使えばいいと思う。