kubernetesでDrone1.0うごかしてみた

この記事は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 最後までやり切りました!