kubernetesをminikubeで触ってみたメモ

`kubernetes` を触ったのでコマンドのメモ書きです。PodとかServiceとか概念に理解が追いついていないので、何か間違っていたらご指摘下さい。

# やったこと

* `minikube` の導入
* 補完を聞くようにする
* `minikube` 上の `kubernetes` でdockerコンテナを動かす

とりあえず2048のコンテナを動かしてみました。
![スクリーンショット 2018-06-05 17.08.00.png](https://qiita-image-store.s3.amazonaws.com/0/67790/f2d0d9e2-5ea0-a07b-f5d3-42d6d340146c.png)


## 困ったときに見ると良さそうな公式リファレンス

基本的な概念: 
https://kubernetes.io/docs/reference/glossary/?fundamental=true#term-cluster

minikubeでkubernetes動かすgetting-started: 
https://kubernetes.io/docs/getting-started-guides/minikube/


## minikubeの導入

minikubeを動かすホスト用にVirtualBoxのインストール
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

Homebrewでminikubeのインストール

```sh
$ brew cask install minikube
```

## minikubeの起動／停止

```sh
$ minikube --vm-driver=virtualbox start
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.2", GitCommit:"81753b10df112992bf51bbc2c2f85208aad78335", GitTreeState:"clean", BuildDate:"2018-05-12T04:12:12Z", GoVersion:"go1.9.6", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
```

```sh
$ minikube stop
$ kubectl version
# 何も起こらないので Ctrl + C で抜ける
```

ここまではガッツリクラメソさんの記事通りです。
参考: [Minikubeを使ってローカル環境にKubernetes環境を用意する](https://dev.classmethod.jp/cloud/minikube/)


## kubectlコマンドを補完が効くようにする

補完についてのあれこれをみる

```sh
$ kubectl completion -h
Output shell completion code for the specified shell (bash or zsh). The shell code must be evaluated to provide
interactive completion of kubectl commands.  This can be done by sourcing it from the .bash _profile. 

Detailed instructions on how to do this are available here:
https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion 

Note for zsh users: [1] zsh completions are only supported in versions of zsh >= 5.2

Examples:
  # Installing bash completion on macOS using homebrew
  ## If running Bash 3.2 included with macOS
  brew install bash-completion
  ## or, if running Bash 4.1+
  brew install bash-completion@2
  ## If kubectl is installed via homebrew, this should start working immediately.
  ## If you've installed via other means, you may need add the completion to your completion directory
  kubectl completion bash > $(brew --prefix)/etc/bash_completion.d/kubectl
  
  
  # Installing bash completion on Linux
  ## Load the kubectl completion code for bash into the current shell
  source <(kubectl completion bash)
  ## Write bash completion code to a file and source if from .bash_profile
  kubectl completion bash > ~/.kube/completion.bash.inc
  printf "
  # Kubectl shell completion
  source '$HOME/.kube/completion.bash.inc'
  " >> $HOME/.bash_profile
  source $HOME/.bash_profile
  
  # Load the kubectl completion code for zsh[1] into the current shell
  source <(kubectl completion zsh)
  # Set the kubectl completion code for zsh[1] to autoload on startup
  kubectl completion zsh > "${fpath[1]}/_kubectl"

Usage:
  kubectl completion SHELL [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).
```

bashはこの辺

```sh
# Installing bash completion on macOS using homebrew
## If running Bash 3.2 included with macOS
brew install bash-completion
## or, if running Bash 4.1+
brew install bash-completion@2
# Installing bash completion on Linux
## Load the kubectl completion code for bash into the current shell
source <(kubectl completion bash)
## Write bash completion code to a file and source if from .bash_profile
kubectl completion bash > ~/.kube/completion.bash.inc
printf "
# Kubectl shell completion
source '$HOME/.kube/completion.bash.inc'
" >> $HOME/.bash_profile
source $HOME/.bash_profile
```

zshはこの辺を参照すると良さそう

```sh
# Load the kubectl completion code for zsh[1] into the current shell
source <(kubectl completion zsh)
# Set the kubectl completion code for zsh[1] to autoload on startup
kubectl completion zsh > "${fpath[1]}/_kubectl"
```

`zsh` 使っているので以下を実行

```sh
$ kubectl completion zsh > "${fpath[1]}/_kubectl"
```

一応実体を見ておく（精神衛生的に）

```sh
$ cat "${fpath[1]}/_kubectl"
# 省略…
#
#
__kubectl_bash_source <(__kubectl_convert_bash_to_zsh)
_complete kubectl 2>/dev/null
```

FPATH以下に関数置くとautoload時に実行してくれるらしい

参考: [.zshrcで見かけるautoloadの意味と使い方](https://qiita.com/yuku_t/items/77c23390e52168a2754a)

これで補完が効くようになる。

## 2048のコンテナをkubenetesで動かしてみる

2048はこれです。

![スクリーンショット 2018-06-05 17.08.00.png](https://qiita-image-store.s3.amazonaws.com/0/67790/f2d0d9e2-5ea0-a07b-f5d3-42d6d340146c.png)

使わせていただく Dockerfile はこちらです。

alexwhen/docker-2048: https://github.com/alexwhen/docker-2048

nginxで静的ファイルの2048を配信している感じですね。このDockerImageをkubernetesで動かしてみます。

DockerImageの作成

```sh
$ git clone https://github.com/alexwhen/docker-2048.git
$ docker build -t "docker-2048" .
$ docker images                                        

REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
alexwhen/docker-2048   latest              7929bcd70e47        2 years ago         8.02MB
```

Podを起動する

```sh
$ kubectl run 2048-nginx --image=alexwhen/docker-2048 --port=80
$ kubectl get pod                   
NAME                          READY     STATUS    RESTARTS   AGE
2048-nginx-7975dd56cd-m9m5m   1/1       Running   1          48m
```

Serviceを起動する

```sh
$ kubectl expose deployment 2048-nginx --name my-2048 --port 80 --type NodePort
$ kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        23h
my-2048      NodePort    10.97.40.79   <none>        80:30531/TCP   41m
```

30531番ポートが2048コンテナの80番ポートにフォワーディングされているイメージ

ServiceのTypeについては以下を参照

kubernetes - Services: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

GCP上などで `--type LoadBalancer` とかにすると外部IPとクラスター内のIPが紐づいて、EXTERNAL-IPに外部IPが表示されるようです（minikube上でどうなるかは不明。virtualboxのprivate-ipとかになるのだろうか）


Serviceからコンテナにアクセスしてみる

```sh
$ minikube service list
# minikubeにサービスが認識されている
|-------------|----------------------|-----------------------------|
|  NAMESPACE  |         NAME         |             URL             |
|-------------|----------------------|-----------------------------|
| default     | kubernetes           | No node port                |
| default     | my-test              | http://192.168.99.100:30531 |
| kube-system | kube-dns             | No node port                |
| kube-system | kubernetes-dashboard | http://192.168.99.100:30000 |
|-------------|----------------------|-----------------------------|
$ minikube service my-2048
```

ブラウザが自動で開いて2048が表示されるはず。この辺はminikubeの機能。

## dashboardを覗いてみる

`minikube service list` したときに `kubernetes-dashboard` というServiceがありました。試しに覗いてみます。

```sh
# これだとだめっぽい
$ minikube service kubernetes-dashboard

# 直接URLにアクセスしてもいいけど専用コマンドがある
$ minikube dashboard
```

![スクリーンショット 2018-06-05 17.39.10.png](https://qiita-image-store.s3.amazonaws.com/0/67790/8f71ce11-99a8-5359-fb29-a30f4bcc1adc.png)


見れました。
これが何なのかというと公式のWebUIみたいです。リファレンスみると `kubectl create` しているけど、 minikubeではデフォルトで使えるっぽい。

Running Kubernetes Locally via Minikube
 - dashboard: https://kubernetes.io/docs/getting-started-guides/minikube/#dashboard

Web UI (Dashboard): https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/