ローカル環境（Win7）でKubernetesを動かす

## Minikubeとは

* ローカル環境で動作可能なKubernetes（Win/Mac/Linux...）
* Dockerホストが別途必要（Docker for Windows...）
* ハイパーバイザーが別途必要（Hyper-V、VirtualBox...）
  - Minikube用のVMイメージの作成は不要

## インストール

* **Docker for Windowsインストール**
  - （省略）
* **VirtualBoxインストール**
  - （省略）
* **minikube.exeダウンロード**
  - https://github.com/kubernetes/minikube/releases
     - minikube-windows-amd64.exeをダウンロード
     - 保存先パスを環境変数PATHに追加
     - ファイル名を「minikube.exe」にリネームし、任意のフォルダに保存（例：c:\minikube）

## Kubernetesクラスタの作成

ハイパーバイザーをVirtualBoxに設定

```bash
minikube config set vm-driver virtualbox
```

Kubernetesクラスタの作成

```bash
minikube start
```

状態確認

```bash
minikube status
```

ダッシュボード（ブラウザ）の起動

```bash
minikube dashboard
```

## Minikubeへのデプロイ（Podの作成）
* **kubectl.exeダウンロード**
  - 最新バージョンの確認
     - https://storage.googleapis.com/kubernetes-release/release/stable.txt
     - 2018.05.28時点で「v1.10.3」
  - ダウンロード
     - 下記URLのバージョンのところを最新のものに書き換える
         - https://storage.googleapis.com/kubernetes-release/release/v1.10.3/bin/windows/amd64/kubectl.exe
     - minikube.exeと同じフォルダに保存してパスを通す(例：c:\minikube)
* **deployment.yml作成**

```yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deployment-sample
spec:
  replicas: 2  // 同じ仕様のPodを2個起動する
  template:
    metadata:
      labels:
        app: deployment-sample  // Service作成時に指定するラベル名
    spec:
      containers:  // Podに含めるコンテナイメージの設定
      - name: nginx
        image: nginx:1.1
      - name: myapp
        image: myapp:1.1
```

* **ymlの内容を登録（Podのデプロイ、起動）**

```bash
kubectl apply -f deployment-sample.yml
```

* **デプロイ後のイメージ**
* 
![01.png](https://qiita-image-store.s3.amazonaws.com/0/33137/2ce8a1ee-7212-44c6-e9c5-91bab20651c9.png)

## CI/CDの流れ

* **全体構成イメージ**

![02.png](https://qiita-image-store.s3.amazonaws.com/0/33137/1106d053-47fb-67a6-1ca4-cf9eb0607ed7.png)

* **検証環境（Kubernetes）へデプロイ**
  - **開発環境（ローカル）**
     - Gitのdevブランチにpush
  - **CIサーバ**
     - devブランチをチェックアウト
     - ビルド・単体テスト
     - Dockerイメージの作成（docker build）
     - イメージをDockerレジストリに登録（docker push）
     - 検証環境にデプロイ（kubectl apply）
         - DockerレジストリからDockerイメージを取得
         - Pod作成・起動
     - （Integration Test実行）
         - テストに失敗したらデプロイをロールバック（kubectl rollout）
  - **デプロイ後のイメージ**
     - すでにDeploymentが存在する状態でkubectl applyを実行すると、新しいDeployment（Pod）が作成される
     - 新旧バージョンが混在した期間を経て、最終的に新バージョンに切り替わる（ローリングアップデート）

![03.png](https://qiita-image-store.s3.amazonaws.com/0/33137/41c2147d-6f39-807f-82db-69ffb1749b26.png)

* **本番環境（Kubernetes）へデプロイ**
  - **開発環境（ローカル）**
     - devブランチをmasterブランチにマージ
  - **CIサーバ**
     - masterブランチをチェックアウト
     - ビルド・単体テスト
     - Dockerイメージの作成（docker build）
     - イメージをDockerレジストリに登録（docker push）
     - 本番環境にデプロイ（kubectl apply）
          - DockerレジストリからDockerイメージを取得
          - Pod作成・起動
          - リリースに失敗したらデプロイをロールバック（kubectl rollout）

## 課題

* Dockerイメージのバージョン付け方
  - そもそもつけるものなのかどうか
  - docker buildとdeployment.ymlのバージョンをCIで更新する？？
* 本番環境へのデプロイはローリングアップデートでいいのか？
  - ブルーグリーンとかカナリヤの場合はどうやる？
     - ブルーグリーンの場合は、新VerのPodに旧Verと異なるラベルを付与する
* Dockerイメージ毎回作ると容量の問題は？
* どういうNWの動きになってるの？

## 参考

* **Minikube**
  - [Kubernetes超入門 with java](https://www.slideshare.net/yasu7ri/kubernetes-with-java)
  - [minikubeで始めるカンタンKubernetes(Windows 10用)](https://qiita.com/komattaka/items/05241645ee83ef189f6d)
  - [minikubeとVirtualBoxで手元でKubernetesを試す](https://qiita.com/kkam0907/items/33cf47bab872b4dee933)
  - [Minikube ではじめる Kubernetes 入門](https://qiita.com/nirasan/items/6207cf7ef94e04640fbf)
  - [minikubeでローカルのdocker imageを使う](https://qiita.com/ocadaruma/items/efe720e46ae7ecb9ec25)
* **Kubernetes**
  - [k8s pod 概要について自習ノート](https://qiita.com/MahoTakara/items/f5130bb6e9e493c46c6b)
  - [SpringBootをKubernetes上で動かしてみる](https://qiita.com/Yuki10/items/bdd7a3f197371d573f51)
  - [Kubernetesのチュートリアルをやる](https://www.kaitoy.xyz/2017/10/11/goslings-on-kubernetes-cont/)
  - [Kubernetesアンチパターン](http://nekop.github.io/slides/hbstudy78.html#/)
  - [kubernetes学習その３ スケールとかB/Gデプロイとか](https://blue1st-tech.hateblo.jp/entry/2017/05/05/120000)
* **Kubernetes（CI/CD）**
  - [オペレーションとルールを統一化し、Kubernetesを使った変化に強いインフラを構築](https://codezine.jp/article/detail/10428)
  - [Kubernetes Deploymentを理解する](https://qiita.com/komattaka/items/bd1d8d32f6cb24a32f53)
  - [Kubernetes: Deployment の仕組み](https://qiita.com/tkusumi/items/01cd18c59b742eebdc6a)
  - [マイクロサービスの設計: 継続的インテグレーション](https://docs.microsoft.com/ja-jp/azure/architecture/microservices/ci-cd)
* **Helm（k8sのパッケージマネージャ）**
  - [Kubernetes: パッケージマネージャHelm](https://qiita.com/tkusumi/items/12857780d8c8463f9b9c)
  - [Helm を使って Kubernetes を管理する](https://jedipunkz.github.io/blog/2016/11/20/helm/)
  - [Kubernetes のパッケージマネジャー helm の導入と使い方](https://qiita.com/quickguard/items/48ea2b69395afde3517b)
  - [Kubernetes関連の便利ツール: Helm](https://blue1st-tech.hateblo.jp/entry/2018/03/11/212421)