この記事はGRIPHONE Advent Calendar 2019 25日目の記事です 。
こんにちは。サーバーサイドエンジニアの西村です。
前回記事の続きになり、Droneのserverをkubernetes化する記事になります。
構成
- GitHub
- Drone server + mysql (kubernetes)
- Drone runner (windows exec)
前回はserverをngrok+Dockerで行ったので、その部分をkubernetesに書き換えます。
今回はDrone serverのstorageでmysqlを使います。
kubernetesで分からない事があれば
弊社徳田のブログのkubernetesのまとめが大変優秀なので、これを一通り見れば分かるはずです!
構築時ハマった事
$ kubectl apply -f ./drone_service.yml
error: SchemaError(io.k8s.api.core.v1.Taint): invalid object doesn't have additional properties
なんか適応出来ないエラー出てるんだけどー?と思って調べたら
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.11", GitCommit:"637c7e288581ee40ab4ca210618a89a555b6e7e9", GitTreeState:"clean", BuildDate:"2018-11-26T14:38:32Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.8-gke.17", GitCommit:"188432a69210ca32cafded81b4dd1c063720cac0", GitTreeState:"clean", BuildDate:"2019-11-13T20:47:11Z", GoVersion:"go1.12.11b4", Compiler:"gc", Platform:"linux/amd64"}
とてもとても古いClientのバージョンを使っていた模様・・・。
Clientのバージョンをあげれば無事apply出来ました。
kubernetesのmysql準備
https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/
基本的に上の公式ドキュメントに沿ってmysqlを構築すればOKです!
storageの設定変えてみるかー^^みたいなノリで色々とするとハマりました。
今回はせっかくなのでStatefulSetを使って構築します。
https://cstoku.dev/posts/2018/k8sdojo-13/
こちらのブログを参考にManifestを準備します。
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
serviceName: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-storage
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 2Gi
kubernetesのDroneService準備
下記のServiceを準備します。
ここではkubernetesのServiceが発行するEXTERNAL-IPを使ってアクセスするようにしますが、本来は予め発行されているドメインを設定してアクセスする事になると思います。
apiVersion: v1
kind: Service
metadata:
name: drone-test-service-lb
spec:
type: LoadBalancer
selector:
app: drone-test-app
ports:
- protocol: TCP
port: 80
targetPort: 80
kubernetesのDeployment準備
下記のDeploymentを準備します
DRONE_GITHUB_CLIENT_IDとDRONE_GITHUB_CLIENT_SECRETとDRONE_RPC_SECRETは前回同様の値を使用します。
GitHubのOAuth AppsのHomepage URLとAuthorization callback URLとDRONE_SERVER_HOSTが前回から変わり、上のServiceが発行するEXTERNAL-IPに変更してください。
DRONE_DATABASE_DRIVERとDRONE_DATABASE_DATASOURCEは下記のリンクを参考にしてください。
https://docs.drone.io/installation/reference/drone-database-driver/
https://docs.drone.io/installation/reference/drone-database-datasource/
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: drone-test
spec:
replicas: 1
template:
metadata:
labels:
app: drone-test-app
spec:
containers:
- name: drone-test
image: drone/drone:1
env:
- name: DRONE_GITHUB_SERVER
value: https://github.com
- name: DRONE_GITHUB_CLIENT_ID
value: ${DRONE_GITHUB_CLIENT_ID}
- name: DRONE_GITHUB_CLIENT_SECRET
value: ${DRONE_GITHUB_CLIENT_SECRET}
- name: DRONE_RPC_SECRET
value: ${DRONE_RPC_SECRET}
- name: DRONE_SERVER_PROTO
value: http
- name: DRONE_SERVER_HOST
value: ${EXTERNAL_IP}
- name: DRONE_DATABASE_DRIVER
value: mysql
- name: DRONE_DATABASE_DATASOURCE
value: root:password@tcp(${MYSQL_SERVICE_NAME}:3306)/drone
ports:
- containerPort: 80
runnerをwindowsで実行する
後は前回同様runnerの設定を行います。
今回もLocalのWindowsマシーンのRunnerを使います。
基本的に前回と同じ設定ですが記載します。
前回と違う箇所はDRONE_RPC_HOSTにEXTERNAL-IPを設定する所です。
DRONE_RPC_PROTO=http
DRONE_RPC_HOST=${EXTERNAL_IP}
DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
DRONE_LOG_FILE=C:\Drone\drone-runner-exec\log.txt
DRONE_DEBUG=TRUE
DRONE_TRACE=TRUE
DRONE_RPC_DUMP_HTTP=TRUE
EXTERNAL-IPにアクセスすると無事アクセスでき、Drone serverとrunnerが動いている事が確認できるはずです!
mysqlに接続して対象のdatabaseに接続するとテーブルが増えており、テーブルに対してselectを実行するとデータが増えている事が確認できると思います。
お疲れ様でした。
総括
前回が無事動作すれば今回はすぐに動作確認が出来ると思います。
CI/CDツールを検討する際、参考になれば幸いです。
最後まで読んで頂いてありがとうございました。
Advent Calendar 2019 最後までやり切りました!