最近の開発スタイル

Posted on

Introduction

2018年現在、ある程度dockerやその周辺技術についても使い方がまとまってきた感があるので、普段どのように開発を進めているかメモしておきたい。 なおここでは個人開発でどうやっているかについて書くが、業務でも似たようなアプローチではある(というかそれを真似した)。

対象ソフトウェア

ここでは主にgoでAPIサーバを書くような場合を想定している。もちろんそれ意外でも適用可能ではあるが、僕自身が最近それしか書いてないので他環境では見落としがあるかもしれない。

全体的な使用ツールなど

  • ローカル
    • 環境
      • Macbook pro
    • オーケストレーション
      • docker-compose
  • 開発/本番環境
    • 環境
      • GCP
    • オーケストレーション
      • kubernetes
  • 共通
    • docker registry
      • hub.docker.com
    • CI
      • circle ci

ローカル環境

  • go自体は普通に手元のランタイムを使用している
    • dockerに載せても良いが考慮することが増えるし、goなら環境依存はほぼ無いのでこれで良しとしている
  • MySQLやRedisなど、ミドルウェア関連をdocker-composeで立ち上げるようにしている
    • 公式のものをそのまま使ってもいいが、migrationが必要なものは別途管理し、そのimageを使用している
  • CIや本番環境用にdocker imageをローカルで作っている
    • CI
      • go runtimeと必要なら認証周りを入れたimage
      • 認証など特別なものが必要無ければ公式のimageをそのまま使っている
        • golang:1.10-alpine など
    • 本番環境
      • buildしたgo binaryをそのまま素のalpineに入れている
      • セキュリティ上、go runtimeは入れない
      • ここでも必要があれば認証に使うものがあれば入れている

参考までにCI用のアプリケーション/DB、本番環境用のDockerfileを紹介する

CI用

  • アプリケーション
    • CIで使用するdepを事前に導入したimageを作っている
FROM golang:1.10-alpine

RUN apk update && \
    apk --no-cache add \
      git \
      make \
      openssh

RUN go get -u github.com/golang/dep/cmd/dep

CMD "cat"
FROM mysql:5.7

ENV MYSQL_ALLOW_EMPTY_PASSWORD=1 \
    MYSQL_DATABASE=lumber

COPY schema.sql /docker-entrypoint-initdb.d/

本番(開発)環境用

FROM alpine:3.7

ADD release/lumber /

CMD ["/lumber"]

本番環境

  • k8sにローカルで作ったimageを載せて動かす
  • manifestは自分で書いたものも含めてhelm chart化して管理している
  • DBなどpersistenceなものは特別な理由がなければマネージドサービスを使っている
    • マネージドサービスの認証情報などは極力k8s secretを参照するようにし、リポジトリに残さないようにしている

今後やっていきたいこと

  • git opsに合わせたCD環境を整えたい
    • ただ単に後回しになっているだけだが、手元でhelm upgrade叩く運用はさすがにちょっとツライ
    • ツールでいうとSpinnakerJenkins Xあたりを追っている
  • 監視を整えたい
    • 残念ながらこのブログを含めてほとんどトラフィックのないサービスしか持っていないのであまり問題になっていないが、監視はやはり必要

まとめ

コンテナを中心に最近の開発スタイルを紹介した。kubernetesは取っ付きづらさがあるが、運用が楽になるし、なにより面白いので手頃なところから使い始めると良いと思う。