kubernetes(k8s)環境構築編

# モチベーション

もうDockerから逃げることはできない。戦わねばならないか。
ということで、そのへんをまとめて面倒を見てくれるくーべねてぃすさんをお試ししてみます。(コンテナオーケストレーションというらしい)
何がいいって、本番でも開発でもローカルでもリモートでも同じ環境を構築できると言っていてそれがどうやら本当らしい。ってところでしょうか。
k8sはkとsの間に8文字アルファベットが入るのでk8sなんですってよ。
APサーバとアプリケーションをk8sさんで管理する感じになる。dockerコンテナの配布まで行ってくれるので楽だよと。

[3分で分かった気になる、Kubernetes とは？](https://qiita.com/r548/items/e6d1e4dcfdd9f8a7874d) 

# 単語

- マスター
    - クラスタ全体の管理をする。ノードやDNS,ルーティングなど。ここのAPIに向かってコマンドを投げる。
- クラスタ
    - ノードの集合
- ノード
    - Podが動作するマシン
    - 1ノード内に複数のPodが動作できる。
- Pod
    - docker コンテナの集合. docker コンテナは Pod 単位で Node に配備される


各種コンテナを管理する。コンテナ単体はPodと呼ばれる。(例えばpodがdockerインスタンス1個1個ってことになるね！

[今さら人に聞けない Kubernetes とは？](https://qiita.com/MahoTakara/items/85096f8b2632c802ab22) 
[[第1回]Kubernetesの公式チュートリアルをやって基本を抑える -アプリのデプロイ-](https://dev.classmethod.jp/cloud/kubernetes-tutorial-1/) 


# セットアップ

開発環境ではminikubeというものを利用してVirtualBoxのインスタンスの中にminikubeをセットアップしてくれます。実際のpodsたちはDockerコンテナにより提供されますよ。

## Dockerを入れる

k8sのキモとなるdockerはどの場合でもインストールしておく必要があるよ。
公式ドキュメントを参考にdocker CEをいれましょう。(CEはcommunity editionのこと)
https://docs.docker.com/

dockerさんでsudoを不要にする。[Dockerコマンドをsudoなしで実行する方法](https://qiita.com/DQNEO/items/da5df074c48b012152ee) 


## 開発環境(ローカルVirtualBox)

### minikube

minikubeを手順の通りインストールする。https://github.com/kubernetes/minikube

### kubectl

yum.repos.dにk8sのリポジトリを追加してインストールするのが良い模様。macの場合はbrew, portsお好みで。
https://kubernetes.io/docs/tasks/tools/install-kubectl/

### 起動

`$ minikube start --vm-driver=virtualbox`をするとVirtualBox内にminikubeっていうインスタンスが出来上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/366737f7-cbad-9c76-adf8-d859727b6c72.png)

`$ minikube config set vm-driver virtualbox` としておくことでデフォルトのvmがvirtualboxになります。


いろいろDLやインストールをするみたいなので少し時間がかかる。

参考)
[Minikubeを使ってローカル環境にKubernetes環境を用意する](https://dev.classmethod.jp/cloud/minikube/) 
[minikube でローカルでのテスト用 Kubernetes を構築](https://blog.1q77.com/2016/10/setup-kubernetes-1-4-using-minikube/) 

### 状態を見てみる
`$ eval $(minikube docker-env)`でk8sのdockerに切り替えてdockerのコンテナをみてみる。

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

~
❯ docker container ls
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS               NAMES
d769c12297f7        k8s.gcr.io/k8s-dns-sidecar-amd64           "/sidecar --v=2 --lo…"   9 minutes ago       Up 9 minutes                            k8s_sidecar_kube-dns-86f4d74b45-xnfqj_kube-system_60b5af05-a05d-11e8-9f57-08002710bdf8_0                                               
baa923e10d6e        k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64     "/dnsmasq-nanny -v=2…"   9 minutes ago       Up 9 minutes                            k8s_dnsmasq_kube-dns-86f4d74b45-xnfqj_kube-system_60b5af05-a05d-11e8-9f57-08002710bdf8_0                                               
65771e2d6627        k8s.gcr.io/kubernetes-dashboard-amd64      "/dashboard --insecu…"   9 minutes ago       Up 9 minutes                            k8s_kubernetes-dashboard_kubernetes-dashboard-5498ccf677-dqsq2_kube-system_6169a034-a05d-11e8-9f57-08002710bdf8_0                      
5d0b249a7ff1        gcr.io/k8s-minikube/storage-provisioner    "/storage-provisioner"   9 minutes ago       Up 9 minutes                            k8s_storage-provisioner_storage-provisioner_kube-system_6176f65d-a05d-11e8-9f57-08002710bdf8_0                                         
3f4daa2c5947        k8s.gcr.io/k8s-dns-kube-dns-amd64          "/kube-dns --domain=…"   9 minutes ago       Up 9 minutes                            k8s_kubedns_kube-dns-86f4d74b45-xnfqj_kube-system_60b5af05-a05d-11e8-9f57-08002710bdf8_0                                               
90b490fb4367        k8s.gcr.io/kube-proxy-amd64                "/usr/local/bin/kube…"   9 minutes ago       Up 9 minutes                            k8s_kube-proxy_kube-proxy-7kmc9_kube-system_60c42408-a05d-11e8-9f57-08002710bdf8_0
0916e618dc36        k8s.gcr.io/pause-amd64:3.1                 "/pause"                 9 minutes ago       Up 9 minutes                            k8s_POD_storage-provisioner_kube-system_6176f65d-a05d-11e8-9f57-08002710bdf8_0
55da6fcae752        k8s.gcr.io/pause-amd64:3.1                 "/pause"                 9 minutes ago       Up 9 minutes                            k8s_POD_kubernetes-dashboard-5498ccf677-dqsq2_kube-system_6169a034-a05d-11e8-9f57-08002710bdf8_0                                       
8ed1ebf28eca        k8s.gcr.io/pause-amd64:3.1                 "/pause"                 9 minutes ago       Up 9 minutes                            k8s_POD_kube-proxy-7kmc9_kube-system_60c42408-a05d-11e8-9f57-08002710bdf8_0
c09adc3a2dca        k8s.gcr.io/pause-amd64:3.1                 "/pause"                 9 minutes ago       Up 9 minutes                            k8s_POD_kube-dns-86f4d74b45-xnfqj_kube-system_60b5af05-a05d-11e8-9f57-08002710bdf8_0
441124e64de1        k8s.gcr.io/kube-apiserver-amd64            "kube-apiserver --ad…"   9 minutes ago       Up 9 minutes                            k8s_kube-apiserver_kube-apiserver-minikube_kube-system_92521198f9c138763b520ca1ecb8b5a9_0                                              
1b4191945ee1        k8s.gcr.io/kube-scheduler-amd64            "kube-scheduler --le…"   9 minutes ago       Up 9 minutes                            k8s_kube-scheduler_kube-scheduler-minikube_kube-system_099f1c2b79126109140a1f77e211df00_0                                              
9df8b82ea9e2        k8s.gcr.io/kube-addon-manager              "/opt/kube-addons.sh"    9 minutes ago       Up 9 minutes                            k8s_kube-addon-manager_kube-addon-manager-minikube_kube-system_3afaf06535cc3b85be93c31632b765da_0                                      
f763df18bf81        k8s.gcr.io/etcd-amd64                      "etcd --peer-trusted…"   9 minutes ago       Up 9 minutes                            k8s_etcd_etcd-minikube_kube-system_79bd0d0dce95148e72fa3b2e8fded604_0
f1953be6f3aa        k8s.gcr.io/kube-controller-manager-amd64   "kube-controller-man…"   10 minutes ago      Up 10 minutes                           k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_6fd9ec17a3b368568d0a6a2d5d243308_0                            
7f7e7c941ceb        k8s.gcr.io/pause-amd64:3.1                 "/pause"                 10 minutes ago      Up 10 minutes                           k8s_POD_kube-apiserver-minikube_kube-system_92521198f9c138763b520ca1ecb8b5a9_0
796933ddc98e        k8s.gcr.io/pause-amd64:3.1                 "/pause"                 10 minutes ago      Up 10 minutes                           k8s_POD_kube-controller-manager-minikube_kube-system_6fd9ec17a3b368568d0a6a2d5d243308_0                                                
508da264c993        k8s.gcr.io/pause-amd64:3.1                 "/pause"                 10 minutes ago      Up 10 minutes                           k8s_POD_kube-addon-manager-minikube_kube-system_3afaf06535cc3b85be93c31632b765da_0
2bf305a85652        k8s.gcr.io/pause-amd64:3.1                 "/pause"                 10 minutes ago      Up 10 minutes                           k8s_POD_kube-scheduler-minikube_kube-system_099f1c2b79126109140a1f77e211df00_0
39232155ebdc        k8s.gcr.io/pause-amd64:3.1                 "/pause"                 10 minutes ago      Up 10 minutes                           k8s_POD_etcd-minikube_kube-system_79bd0d0dce95148e72fa3b2e8fded604_0
```
コンテナがこんなにいっぱい！

`$ minikube dashboard` でブラウザでダッシュボードが見れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/6392df15-4a19-7603-719f-e74ffae561b4.png)




`$ minikube service list` で公開しているサービスの一覧が見れます。

```
❯ minikube service list
|-------------|----------------------|-----------------------------|
|  NAMESPACE  |         NAME         |             URL             |
|-------------|----------------------|-----------------------------|
| default     | kubernetes           | No node port                |
| kube-system | kube-dns             | No node port                |
| kube-system | kubernetes-dashboard | http://192.168.99.100:30000 |
|-------------|----------------------|-----------------------------|
```

その他状態確認はこんな感じかな。

```
❯  kubectl get node -o wide
NAME       STATUS    ROLES     AGE       VERSION   EXTERNAL-IP   OS-IMAGE            KERNEL-VERSION   CONTAINER-RUNTIME
minikube   Ready     master    15m       v1.10.0   <none>        Buildroot 2018.05   4.15.0           docker://17.12.1-ce

~
❯ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

~
❯ kubectl config get-contexts
CURRENT   NAME       CLUSTER    AUTHINFO   NAMESPACE
*         minikube   minikube   minikube   
```

### テスト

試しにhello-minikubeを動かしてみる。

```
$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
deployment.apps/hello-minikube created
```

サービスが増える。

```
$ minikube service list
|-------------|----------------------|-----------------------------|
|  NAMESPACE  |         NAME         |             URL             |
|-------------|----------------------|-----------------------------|
| default     | hello-minikube       | http://192.168.99.100:30430 |
| default     | kubernetes           | No node port                |
| kube-system | kube-dns             | No node port                |
| kube-system | kubernetes-dashboard | http://192.168.99.100:30000 |
|-------------|----------------------|-----------------------------|
```

公開する。
```
$ kubectl expose deployment hello-minikube --type=NodePort
service "hello-minikube" exposed
```
curlでアクセスしてみると。

```
❯ curl $(minikube service hello-minikube --url)                                                                                                                                                     
CLIENT VALUES:                                                                                                                                                                                      
client_address=172.17.0.1
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://192.168.99.100:8080/

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

HEADERS RECEIVED:
accept=*/*
host=192.168.99.100:30430
user-agent=curl/7.59.0
BODY:
-no body in request-
```

いるぞ！


## 開発環境(kvm上の場合)

kvmインスタンスの上に設定する場合。
KVMインスタンスの上にVMは普通乗らないので、minikube start時にvm-driverはnoneで同じサーバに置くことになる。
`$ minikube start --vm-driver=none`


# 本番(GCP)

GKE(Google Kubernetes Engine)を使う。きっとgcloudでGoogle認証をして、minikube部分を変更するだけだと思う。googleのチュートリアルをやってみたところ、storageにredis, フロントにphpをつかっていた。 https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
のリポジトリを使っていた。

AWSの場合にはAmazon Elastic Container Service for Kubernetes (Amazon EKS) というものがあるぞ。
AzureはAzure Kubernetes Service (AKS)だそうです。

オンプレの場合はこのへんかな。
[快適な kubernetes オンプレミス環境を構築する(1. 設計編)](https://qiita.com/kaishuu0123/items/0f5f4dfca637f9a00676) 
[CentOS7にKubernetes1.9をインストール](https://qiita.com/sheepland/items/d63bfe24c8e363132f7a) 


# 感想

また覚えることが増えた！基礎知識としてDockerは知っておかないとワケワカメかもしれない。次回はアプリケーションとのデプロイ方法を試してみよう。