はじめてのGKEとkompose

GKEにdeployするのにdocker-composeを使いたいが、変換してくれるkomposeそのままでいけるわけじゃないという記録

# まず変換

```
kompose convert -f docker-compose.yml
```

こんなファイルができる

```
-rw-r--r-- 1 root root  241 2018-03-16 09:34:24 web-claim0-persistentvolumeclaim.yaml
-rw-r--r-- 1 root root  241 2018-03-16 09:34:24 web-claim1-persistentvolumeclaim.yaml
-rw-r--r-- 1 root root 1.5K 2018-03-16 09:34:24 web-deployment.yaml
-rw-r--r-- 1 root root  361 2018-03-16 09:34:24 web-service.yaml
```

deploy~がpods、serviceがLB。両方コレで起動できる


```
kubectl create -f foo.yaml
```


# ダメな点
## 1. volumes

これがpersistentVolumes に変換？してくれるみたいだけどデータuploadまでしてくれる感じがしない。

今はyamlからcomment outして、image build内でcopyして使ってる。つまり、micro servicesにしかこの手は使えない。

ここは要調査。

## 2. image name

komposeはcomposeのサービス名をk8sのアプリ名、サービス名、そして `まさかのイメージ名` などあらゆるところに使う。

今回自分の場合は `web` というサービス名だったのでこうなった

```yml
$ cat web-deployment.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
...
metadata:
...
  labels:
    io.kompose.service: web                        <=============
  name: web                                        <=============
spec:
...
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: web                  <=============
    spec:
...
        image: web                                <============= ココがガン。
```

このimage名に合わせて `gcr.io/${PROJECT_ID}/` のprefixをつけたimageでpushしないといけないのだが、問題はこのサービス名を yml からパースして取る方法がないところ。

それぽいstackoverflowの回答は0だったので考えることにした（回答書いといた）

> https://stackoverflow.com/questions/37249755/can-i-reference-the-service-name-docker-compose-yml

僕がgo/pythonのプロなら今すぐdocker-compose にPRを送るのだが、そんな技術はなかった。


今の回答はこれ

    KOMPOSE_SERVICE_NAME=$(docker-compose images | tail -n +3 | awk '{print $2}' | sed s/.*_//)

今回は one image なのでコレで行く（適当）。

で、それを使ってimageを作る

    IMAGE=gcr.io/${PROJECT_ID}/${KOMPOSE_SERVICE_NAME}

これをpushするようにすれば、komposeが作ったymlに書かれるimage名と一致するはず。

・・・と思ったがなんかうまくいかなげ。

volumesもダメだった。これはkomposeが書き出したyaml群をシェル芸で消すようにした。



# 今日のコマンドメモ

途中からhello-clusterとhello-appとかhello-webが混在してるが、同じものにすること

```python
# get prepared
gcloud -v

gcloud components update
gcloud components install kubectl

# info

gcloud compute zones list
gcloud compute regions list

gcloud config set compute/zone asia-northeast1
gcloud config get-value project -q

gcloud info


# project start
PROJECT_ID=my-project-id-123456
export PROJECT_ID="$(gcloud config get-value project -q)"

### create clusters
# not work
gcloud container clusters create hello-cluster --num-nodes=3
gcloud beta container clusters create hello-cluster --num-nodes=3

# works
gcloud container clusters create hello-cluster --num-nodes=3 --zone=asia-northeast1-a

# consoleで作った場合に必要
gcloud container clusters get-credentials hello-app --zone=asia-northeast1-a 
gcloud compute instances list

# image
docker build -t gcr.io/${PROJECT_ID}/hello-app:v1 .
gcloud docker -- push gcr.io/${PROJECT_ID}/hello-app:v1

# run locally
docker run --rm -p 8080:8080 gcr.io/${PROJECT_ID}/hello-app:v1

# start pods
kubectl run hello-web --image=gcr.io/${PROJECT_ID}/hello-app:v1 --port 8080
kubectl get pods
kubectl describe deployment hello-web

# Load Balancer it is called as a service
kubectl expose deployment hello-web --type=LoadBalancer --port 80 --target-port 8080
kubectl get service
gcloud compute forwarding-rules list
kubectl describe service hello-web

# update image
docker build -t gcr.io/${PROJECT_ID}/hello-app:v2 .
gcloud docker -- push gcr.io/${PROJECT_ID}/hello-app:v2
kubectl set image deployment/hello-web hello-web=gcr.io/${PROJECT_ID}/hello-app:v2

# delete
#
# pods は deployment にいて
# LB は service にいる。

## firewall called service
kubectl delete service hello-web
## pods
kubectl delete deployment  hello-web 
## cluster
gcloud container clusters delete hello-cluster --zone=asia-northeast1-a

## 動かない
kubectl delete deployment,service --all


## export
kubectl get deployment hello-web -o yaml --export > deployment.yaml
kubectl get service hello-web -o yaml --export > service.yaml

## import/start from yml
kubectl create -f deployment.yaml 
kubectl create -f service.yaml 


kubectl get deployments

# kompose
kompose convert -f docker-compose.yml
```

時間出来次第書き足す予定。今日はココまで