Docker for Mac で Kubernetes をちょっと試す

勉強用に書いときます。

# 参考にする資料
 [今こそ始めよう！　Kubernetes入門 記事一覧](https://thinkit.co.jp/series/7342)
 [数時間で完全理解！わりとゴツいKubernetesハンズオン！！](https://qiita.com/Kta-M/items/ce475c0063d3d3f36d5d)
 [Kubernetes道場 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/k8s-dojo)

# 初期設定

## kubernetesを有効化
DockerアプリのPreferences->Kubernetesから有効にする
<img width="241" alt="スクリーンショット 2019-09-19 17.32.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28820/aa7c73fd-8baf-ac1c-7825-c5983c5f7946.png">

 [x] Enable Kubernetes にチェックを入れてApply

<img width="515" alt="スクリーンショット 2019-09-20 13.41.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28820/45a303ba-56ef-35c7-135d-950d3dfed5ab.png">

ここまででkubectlコマンドが有効になっている

```
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.6", GitCommit:"96fac5cd13a5dc064f7d9f4f23030a6aeface6cc", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:49Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.6", GitCommit:"96fac5cd13a5dc064f7d9f4f23030a6aeface6cc", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:16Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
```

## contextsの設定

私の環境では2つある。

```
$ kubectl config get-contexts
CURRENT   NAME                 CLUSTER          AUTHINFO         NAMESPACE
*         docker-desktop       docker-desktop   docker-desktop
          docker-for-desktop   docker-desktop   docker-desktop
```

contextsは複数の異なるクラスタ、ユーザーを管理できるよう、接続先や使用するユーザーを切り替えるための仕組みで
2つともCLUSTERとAUTHINFOが指している物が同じな為、このままでも問題ないとは思うのだが、
ひとまず各種記事にある docker-for-desktopに変更する

```
$ kubectl config use-context docker-for-desktop
Switched to context "docker-for-desktop".
```
確認

```
$ kubectl config get-contexts
CURRENT   NAME                 CLUSTER          AUTHINFO         NAMESPACE
          docker-desktop       docker-desktop   docker-desktop
*         docker-for-desktop   docker-desktop   docker-desktop
```

## 状況確認
まだ立ち上げただけだが、この状態で、下記のようなPod([Podについてとkubectlの簡単な使い方](https://cstoku.dev/posts/2018/k8sdojo-03/))が動作している。

```
$ kubectl get pods --namespace=kube-system
NAME                                     READY   STATUS    RESTARTS   AGE
coredns-584795fc57-cvgn9                 1/1     Running   0          15m
coredns-584795fc57-j6kr5                 1/1     Running   0          15m
etcd-docker-desktop                      1/1     Running   0          14m
kube-apiserver-docker-desktop            1/1     Running   0          14m
kube-controller-manager-docker-desktop   1/1     Running   0          14m
kube-proxy-kxcxn                         1/1     Running   0          15m
kube-scheduler-docker-desktop            1/1     Running   0          14m
```

どういったものなのかは下記のリンク先にわかりやすい図で説明してくれてる。
[Kubernetesの概要](https://qiita.com/advent-calendar/2018/k8s-dojo)

# 構築作業

### Dashbordの導入

[Kubernetes Dashboard](https://github.com/kubernetes/dashboard)というものが用意されているそうなので、まずはこれを導入してみる。

Podの中身を見ながらやりたい為、一度ダウンロードする

```
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
```

```
$ kubectl apply -f kubernetes-dashboard.yaml.txt 
secret/kubernetes-dashboard-certs created
serviceaccount/kubernetes-dashboard created
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
deployment.apps/kubernetes-dashboard created
service/kubernetes-dashboard created
```

```
$ kubectl proxy
```

下記の長いURLでアクセスできる

```
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
```

### Dashbord 認証

#### Tokenを探す

「default-token-」から始まるsecretを探す。

```
$ kubectl -n kube-system get secret
NAME  
...                                           TYPE                                  DATA   AGE
default-token-r9tz9                              kubernetes.io/service-account-token   3      3h45m
...
```

「default-token-r9tz9」の詳細を確認し、Tokenをコピー

```
$ kubectl -n kube-system describe secret default-token-r9tz9 
Name:         default-token-r9tz9
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: default
              kubernetes.io/service-account.uid: 90968fa6-db60-11e9-a391-025000000001

Type:  kubernetes.io/service-account-token

Data
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.ey...

```

先ほどの画面のToken欄に貼り付けてログイン

<img width="958" alt="スクリーンショット 2019-09-20 17.30.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28820/0d76ef02-6e4b-823f-fd0b-b3046e12fa47.png">

<img width="1680" alt="スクリーンショット 2019-09-20 17.30.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28820/14fcfff8-0123-5ac2-fae0-6eb7e1e148ec.png">


# Node.jsの環境を立ててみる。

Node.js環境のDockerを作成。
ソースはnuxt-createとかで作成したものを利用

```dockerfile
FROM node:12.10.0-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install
COPY . .

EXPOSE 3000

CMD [ "npm", "start" ]
```

ビルドを実行

```
docker build --no-cache -t test-app .
```

## Deploymentを作成

k8s/deployment.yaml

```yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: test-app
  labels:
    app: test-app
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: test-app
    spec:
      containers:
      - name: test-app
        image: test-app
        imagePullPolicy: IfNotPresent # localのimageを利用する場合に必要
        command:
        ports:
          - containerPort: 3000

 ```

## Serviceを作成
k8s/service.yaml


```yaml
kind: Service
apiVersion: v1
metadata:
  name: test-app-service
spec:
  type: LoadBalancer
  selector:
    app: test-app
  ports:
  - protocol: TCP
    port: 3000
    targetPort: 3000
```


## 起動~確認〜削除
立ち上げ

```
$kubectl apply -f k8s/deployment.yaml
$kubectl apply -f k8s/service.yaml
```


確認、この状態でlocalhost:3000へ接続すれば画面が確認できる。


```
$ kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
test-app-5df7f6678c-hvzqg   1/1     Running   0          4m18s
test-app-5df7f6678c-rrfc6   1/1     Running   0          4m18s
```

ダッシュボードを確認すると前回とは違い、グラフや動いているpodが確認できた。

<img width="1194" alt="スクリーンショット 2019-10-01 13.14.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28820/560a2b3e-9735-387d-0368-4ee58945acef.png">


削除


```
$kubectl delete -f k8s/deployment.yaml
$kubectl delete -f k8s/service.yaml
```

apply delete等は、ファイルが増えてくると大変なので、Makefileとかに書いとくのが良さそう。