GKEでConcourseを使うには

## 概要
ConcourseをGKEで動かすには注意すべき点があります。
インストール自体はhelmのchartsを使用すると、コマンド一つで完了しとても簡単です。
しかしResourseを登録しJobを動かすと、さまざまなエラーが立ちはだかります。

これまで私が踏んできたGKEでConcourseを使うためのハマリポイントについて説明します。

## 環境
- Kubernetes(GKE): v1.9.2
- Concourse: v3.9.0
- COS: v4.4.86+

## ハマリポイント

### NodePoolのイメージ選択
必須ではないですがイメージタイプは標準のCOSではなくUbuntuが使用することがベターです（2018-02-22時点）。
[このIssue](https://github.com/concourse/concourse/issues/1230)で報告されていますが、`overlay`と`brtfs`がCOSでは使用できないためです。

### `concourse.baggageclaimDriver`の選択
`イメージタイプの選択`により設定が変わります。
Ubuntuであれば`naive`、`btrfs`、`overlay`が動作します。
2018-02-21時点では`overlay`がデフォルト値となっており、とりあえず試すには`overlay`で問題ありません。

ただしv3.9.0では`btrfs`の動作が[fix](https://concourse.ci/downloads.html#v3.9.0)されているため、今後は`btrfs`がデフォルト値に戻る可能性があります。

COSで使用できるのは`naive`で、その他を選択するとエラーが発生します。

エラー内容の例

``` text
{"error":"failed to create btrfs filesystem: exit status 32"}}
```

``` text
runc run: exit status 1:
container_linux.go:348: starting container process caused
process_linux.go:402: container init caused
rootfs_linux.go:58: mounting "/concourse-work-dir/3.9.0/assets/bin/init" to rootfs "/concourse-work-dir/volumes/live/{id}/volume/rootfs" at "/concourse-work-dir/volumes/live/{id}/volume/rootfs/tmp/garden-init" caused
"open /concourse-work-dir/volumes/live/{id}/volume/rootfs/tmp/garden-init: permission denied"
```

### MTUの設定を変更する
変更しなくても基本的な動作はするので、一番ハマった場所です。

Concourseのコンテナにはgardenが使用されており、MTUのデフォルト値は1500になっています。
しかしGCPのMTUは1440であるため、そのまま起動するとネットワーク遅延、パケットロスが生じます。
GKEではない場合もConcourseの処理が遅いと感じたら、MTUの設定を確認すると良いと思います。

## 試してみる（おまけ）
`helm`の`charts`を使った検証手順です。

### 事前にインストールしておくもの
- gcloud
- kubectl
- helm
- fly

``` shell
# クラスター作成
local$ gcloud beta container --project "xxx" \
  clusters create "devops-cluster" \
  --zone "asia-northeast1-a" \
  --image-type "UBUNTU" \
  --username "admin" \
  --cluster-version "1.9.2-gke.1" \
  --machine-type "n1-highcpu-8" \
  --disk-size "100" \
  --scopes "https://www.googleapis.com/auth/cloud-platform" \
  --num-nodes "1" \
  --network "default"

# kubectlの操作クラスターを設定
local$ gcloud container clusters get-credentials devops-cluster --project "xxx"

# Concourse用のRBAC設定作成
local$ cat > tiller.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: tiller-clusterrolebinding
subjects:
- kind: ServiceAccount
  name: tiller
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: ""

# RBAC適用
local$ kubectl apply -f tiller.yaml

# helm初期化
local$ helm init --service-account tiller

# インストール完了しているか確認
local$ helm version

# マニフェストをダウンロード
local$ helm fetch --untar stable/concourse

# パッチ作成
local$ cat > mtu.patch
--- concourse/templates/worker-statefulset.yaml.bk	2018-02-22 11:14:39.000000000 +0900
+++ concourse/templates/worker-statefulset.yaml	2018-02-22 11:13:23.000000000 +0900
@@ -57,6 +57,8 @@
                   - "-c"
                   - "concourse retire-worker --name=${HOSTNAME}"
           env:
+            - name: CONCOURSE_GARDEN_MTU
+              value: "1440"
             - name: CONCOURSE_TSA_HOST
               valueFrom:
                 configMapKeyRef:

# パッチ適用
local patch -p0 < mtu.patch

# Concourseインストール
local$ helm install \
  --set=imageTag=3.9.0,concourse.baggageclaimDriver=overlay,web.service.type=LoadBalancer,worker.replicas=1 \
  --name concourse \
  ./concourse

# EXTERNAL-IPが配布されるまで待つ
local$ kubectl get svc concourse-web -w
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
concourse-web   ClusterIP   10.3.245.140   xxx.xxx.xxx.xxx        8080/TCP,2222/TCP   34s

# ログインする
# ipass=concourse:concourse
local$ fly -t test login --concourse-url http://xxx.xxx.xxx.xxx:8080

# タスクを作成
local$ cat > run.yaml
platform: linux
image_resource:
  type: docker-image
  source: {repository: busybox}
run:
  path: sh
  args:
  - -ec
  - |
    echo Welcome concourse!!

# タスクを実行
local$ fly -t test execute -c run.yaml
```

## 最後に
GKEに関連したConcourseのハマリポイントは以上です。
インストールしたけど、動作しないのでとりあえず放置……という方の助けになれば!


その他にもJOB定義や運用していく際の[ハマリポイントをまとめ](https://qiita.com/watawuwu/items/eb89182f6287d3c0e8de)たのでどぞ！