Edited at

GKEでConcourseを使うには

More than 1 year has passed since last update.


概要

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で報告されていますが、overlaybrtfsがCOSでは使用できないためです。


concourse.baggageclaimDriverの選択

イメージタイプの選択により設定が変わります。

Ubuntuであればnaivebtrfsoverlayが動作します。

2018-02-21時点ではoverlayがデフォルト値となっており、とりあえず試すにはoverlayで問題ありません。

ただしv3.9.0ではbtrfsの動作がfixされているため、今後はbtrfsがデフォルト値に戻る可能性があります。

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

エラー内容の例

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

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の設定を確認すると良いと思います。


試してみる(おまけ)

helmchartsを使った検証手順です。


事前にインストールしておくもの


  • gcloud

  • kubectl

  • helm

  • fly

# クラスター作成

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定義や運用していく際のハマリポイントをまとめたのでどぞ!