概要
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で報告されていますが、overlay
とbrtfs
がCOSでは使用できないためです。
concourse.baggageclaimDriver
の選択
イメージタイプの選択
により設定が変わります。
Ubuntuであればnaive
、btrfs
、overlay
が動作します。
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の設定を確認すると良いと思います。
試してみる(おまけ)
helm
のcharts
を使った検証手順です。
事前にインストールしておくもの
- 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定義や運用していく際のハマリポイントをまとめたのでどぞ!