hello-minikube

# はじめに

[hello-minikube](https://kubernetes.io/ja/docs/tutorials/hello-minikube/) をやってみた。

簡単かと思いきや、[2020/4/28 のコミット](https://github.com/kubernetes/website/commit/cbb73498559fb5b4981d08754b7cf4f37e5b2439) で誤記が埋め込まれていて混乱した。

イメージがHello worldを表示するものからHTTP Requestをechoするだけのものに変わっていて、何一つHello Worldが絶対出てこない手順になっている…。

# 前提条件

- [minikubeのインストール手順](https://kubernetes.io/ja/docs/tasks/tools/install-minikube/)に従ってminikube, kubectrlをインストール済であること。

# k8sのコンテナ管理の構成

[hello-minikube](https://kubernetes.io/ja/docs/tutorials/hello-minikube/) をやる前に、k8sの管理するコンテナの構成を確認する。
[hello-minikube](https://kubernetes.io/ja/docs/tutorials/hello-minikube/)はとにかく jargon が多く、そのままだと理解不能なので。

![stack-container-orchestration (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/c91c8904-0b5f-38dd-5c30-5bb224a10528.png)

- Deployment  
  1つ以上のReplicaSetの集合。k8sのデプロイの最大単位。
- ReplicaSet  
  1つ以上に複製されたPodの集合。
- Pod  
  1つ以上のコンテナの集合。k8sのデプロイの最小単位。
- Service  
  外部からk8sの管理するコンテナにアクセスする最小単位。エンドポイント。
- Node  
  VMまたは物理サーバ。k8sのデプロイ先の最小単位。1つのPodは必ず1つの
Nodeにデプロイされる。
- Volume  
  永続データを保持するデータ領域。
- Secret  
  認証関係のデータを保持するデータ領域。パスワード等。

# Minikubeクラスタの作成

1. minikubeを起動する。

    ```shell
    $ minikube start
    😄  Ubuntu 18.04 上の minikube v1.9.2
    ✨  Using the docker driver based on existing profile
    👍  Starting control plane node m01 in cluster minikube
    🚜  Pulling base image ...
    🔄  Restarting existing docker container for "minikube" ...
    🐳  Docker 19.03.2 で Kubernetes v1.18.0 を準備しています...
        ▪ kubeadm.pod-network-cidr=10.244.0.0/16
    E0506 10:06:08.828823    8108 kubeadm.go:331] Overriding stale ClientConfig host https://172.17.0.3:8443 with https://172.17.0.2:8443
    🌟  アドオンを有効化しています: default-storageclass, storage-provisioner
    🏄  Done! kubectl is now configured to use "minikube"
    ```

    絵文字がいっぱい出てきてうざい。

2. ブラウザーでkubernetesダッシュボードを開く。

    ```shell
    $ minikube dashboard
    🔌  ダッシュボードを有効化しています...
    🤔  Verifying dashboard health ...
    🚀  プロキシを起動しています...
    🤔  Verifying proxy health ...

    🎉  Opening http://127.0.0.1:45967/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
    既存のブラウザ セッションで開いています。
    ```

    絵文字がいっぱい出てきて(以下略)

    画面はこんな感じ。

    ![dashboard](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/a3ed9426-2b74-aca1-e323-9a76f0c2b96b.png)

# Deploymentの作成

まずは、デプロイの最大単位であるDeployを作る。ReplicaSetやPodは、Deployment作成時にk8sが自動生成するようなので気にしなくて良い。

1. `create`コマンドを使用してDeploymentを作成する。

    ```shell
    $ kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
    deployment.apps/hello-node created
    ```

2. Deploymentを確認する。

    ![deployment](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/a837d42d-3a16-11a1-8961-c06b733d720d.png)


# Serviceの作成

次に、Serviceを作成して、クライアントからアクセスできるようにする。

1. `expose`コマンドでPodを公開する。

    ```shell
    $ kubectl expose deployment hello-node --type=LoadBalancer --port=8080
    ```

2. サービスをブラウザで表示する。

    ```shell
    $ minikube service hello-node
    ```

    ![hello world](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/d7b5b330-d6e0-acee-e64f-d873b48e79b6.png)


3. サービスを`curl`から実行する。

    ```shell
    $ echo hogehoge | curl http://172.17.0.2:32053/ -d @-
    CLIENT VALUES:
    client_address=172.18.0.1
    command=POST
    real path=/
    query=nil
    request_version=1.1
    request_uri=http://172.17.0.2:8080/

    SERVER VALUES:
    server_version=nginx: 1.10.0 - lua: 10001

    HEADERS RECEIVED:
    accept=*/*
    content-length=8
    content-type=application/x-www-form-urlencoded
    host=172.17.0.2:32053
    user-agent=curl/7.58.0
    BODY:
    hogehoge
    ```

# クリーンアップ

最後に、後始末。作ったServiceとDeploymentを削除する。
ReplicaSetやPodは、Deployment削除時にk8sが自動削除するようなので気にしなくて良い。

```shell
$ kubectl delete service hello-node
service "hello-node" deleted
$ kubectl delete deployment hello-node
deployment.apps "hello-node" deleted
```

![dashboard](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/a3ed9426-2b74-aca1-e323-9a76f0c2b96b.png)