Docker Desktop for MacでKnativeを動かす

## 概要

少々無謀ですがDocker Desktop上でKnativeを動かしてみましたので，履歴として紹介します．なお，サンプルを動作させたところまでですので，過剰な期待はなさらないでください．また，動作させたサービスが落ちることもありました．

# 環境

以下の環境で試しました．メモリ8GBだとギリギリです．

| 項目 | 利用した環境 |
|:--|:--|
| 本体 | MacBook Pro(13-inch, 2017)|
| CPU | 2.3GHz Core i5 |
| メモリ |  8GB |
| Docker | Docker Desktop for Mac (Docker CE 18.06.0-ce-mac69, edge) |
| Kubernetes | Kubernetes v1.10.3 (上記に含まれているもの） |

Kubernetesの設定は，CPUsを4に，Memoryを6GiBにしました．これ未満ではサンプルのサービスを起動する際にPODが立ち上がりません．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29889/0c16023e-fd9d-d2ca-62d1-03375a9b7181.png)

## インストールと確認

参考文献を見ながら進めます．

#### Istioのインストール

まずはIstioをインストールします．
コマンドを打ち終わってからPODが起動するまで1分ほどお待ち下さい．

```
$ curl -L https://raw.githubusercontent.com/knative/serving/v0.1.0/third_party/istio-0.8.0/istio.yaml \
  | sed 's/LoadBalancer/NodePort/' \
  | kubectl apply -f -
$ kubectl label namespace default istio-injection=enabled
```

#### Knative Servingのインストール

Knativeをインストールします．
こちらもコマンド入力後，1分ほどお待ち下さい．

```
$ curl -L https://github.com/knative/serving/releases/download/v0.1.0/release-lite.yaml \
  | sed 's/LoadBalancer/NodePort/' \
  | kubectl apply -f -
```

#### services.yamlの作成と起動

動作確認のためのサンプルサービスのためのservices.yamlを作成します．
ここでは，参考文献に従ってhelloworld-goを使用します．

```
apiVersion: serving.knative.dev/v1alpha1 # Current version of Knative
kind: Service
metadata:
  name: helloworld-go # The name of the app
  namespace: default # The namespace the app will use
spec:
  runLatest:
    configuration:
      revisionTemplate:
        spec:
          container:
            image: gcr.io/knative-samples/helloworld-go # The URL to the image of the app
            env:
            - name: TARGET # The environment variable printed out by the sample app
              value: "Go Sample v1"
```

上記をapplyします．
PODが起動するまで30秒ほどお待ち下さい．

```
$ kubectl apply -f service.yaml
```

#### PODの起動を確認

下記のようにPODの起動を確認しましょう．
CPUやメモリが不足していると，SERVICESは作られるのですがPODが作られません．
なお，ここで表示されるPODの名称は，次で使います．

```
$ kubectl get pods
NAME                                              READY     STATUS    RESTARTS   AGE
helloworld-go-00001-deployment-5b5f5f877b-l4xb4   3/3       Running   0          13s
```

#### port-forwardの設定

先程調べたPODの名称を使って，PORT FORWARDの設定を行います．

```
$ kubectl port-forward helloworld-go-00001-deployment-5b5f5f877b-l4xb4 8080:8080
```

#### curlでアクセス

ここまでできたらcurlコマンドでアクセスしてみましょう．
下記のように表示されればOKです．
または，Webブラウザで```http://localhost:8080/```にアクセスしてみてください．

```
$ curl -v localhost:8080
* Rebuilt URL to: localhost:8080/
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Wed, 01 Aug 2018 12:56:18 GMT
< Content-Length: 27
< Content-Type: text/plain; charset=utf-8
<
Hello World: Go Sample v1!
• Connection #0 to host localhost left intact
```

## まとめ

とりあえずDocker DesktopでもKnativeを動かせることが分かりました．
試し終わったら，helloworld-goやKnative，Istioのコンテナを止めたいのですが，```kubectl delete```中に無反応になってしまうこともありました．お気をつけください．

## 参考文献
https://github.com/knative/docs/blob/master/install/Knative-with-Minikube.md
https://github.com/knative/docs/blob/master/install/getting-started-knative-app.md