kubernetesでgolangを動かす

前回まで
[kubernetesでサーバーを立てられるか試してみる](https://qiita.com/lughshot/items/b0c86917ba905192dcb6)
[Kubernetesでnginxを立てる](https://qiita.com/lughshot/items/5f7165c1fc5b55779746)

まずは、現状のnodesを確認します。これは前回までやった内容です。

```console
$ kubectl get nodes
NAME                          STATUS    ROLES     AGE       VERSION
gke-aura-blue-5bef3904-gf47   Ready     <none>    2h        v1.11.8-gke.6
```


いろんなサンプルをみてやったのですが、何かが足りなかったりで、うまく起動せず、苦労しました。
結果すごいシンプルになりました。

では、順番に実行していきます。
まず適当に作業フォルダを作ります。
その中で以下を作っていきます。

main.go

```main.go
package main

import (
    "time"
    "net/http"
)

const layout = "2006-01-02 15:04:05"

func main() {
    http.HandleFunc("/time", func(writer http.ResponseWriter, request *http.Request) {
        l := request.URL.Query().Get("tz")
        location, err := time.LoadLocation(l)
        if err != nil {
            panic(err)
        }
        writer.Write([]byte(time.Now().In(location).Format(layout)))
    })

    http.ListenAndServe(":8080", nil)
}
```

Dockerfile

```Dockerfile
FROM scratch

COPY clock /clock

ENV GOROOT /usr/local/go
ADD https://github.com/golang/go/raw/master/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip

ENTRYPOINT ["/clock"]
```

これを「clock」というバイナリーにマルチビルドします。

```sh
GOOS=linux GOARCH=amd64 go build -o clock main.go
```

Docker buildします

```sh
docker build -t gcr.io/<プロジェクトID>/hello ./
```

この段階でローカルから表示できるか確認します

```sh
docker run -p 8080:8080 clock
```

上記を立ち上げたままで、ローカルから確認します

```sh
curl localhost:8080/time
```

Docker buildした結果を、gcp側にあげます

```sh
gcloud docker -- push gcr.io/<プロジェクト名>/hello
```


deployment.yamlを作成する

```deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello
  labels:
    app: hello
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: gcr.io/<プロジェクト名>/hello:latest
        imagePullPolicy: Always
        ports:
        - name: http-server
          containerPort: 8080
```

service.yamlを作る

```service.yaml
apiVersion: v1
kind: Service
metadata:
  name: hello
  labels:
    app: hello
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: http-server
  selector:
    app: hello
```

順番に実行する

```console
$kubectl create -f deployment.yaml 
$kubectl create -f service.yaml 
```

LoadBalancerに表示されたipでアクセスする

```console
$kubectl describe service hello

LoadBalancer Ingress: xx.xx.xx
```

ブラウザからアクセスして、時間が表示されれば完了です。

```
http://LoadBalancerに表示されたip/time
```

### 便利なコマンド(おまけ)

```sh
//deploymentの削除
kubectl delete deployment <name>
//serviceの削除
kubectl delete service <name>
```

参考)
[FROM scratchから始める軽量Docker image for Go - Qiita](https://qiita.com/Saint1991/items/dcd6a92e5074bd10f75a)

[【Linux】Docker / Kubernetes 入門 | FiS Project](https://fisproject.jp/2018/11/introduction-to-docker-and-kubernetes/)

[Kubernetes Engine での Go Bookshelf の実行  |  Go  |  Google Cloud](https://cloud.google.com/go/docs/tutorials/bookshelf-on-kubernetes-engine?hl=ja)

[GCPのCloud Buildを使おう | CyberAgent Developers Blog](https://developers.cyberagent.co.jp/blog/archives/17034/)

[GKE を使って golang アプリケーションコンテナを稼働させる - at kaneshin](https://blog.kaneshin.co/entry/2016/12/15/133943)

dockerの状態確認
[Docker一括削除コマンドまとめ - Qiita](https://qiita.com/boiyaa/items/9972601ffc240553e1f3)