オイラ大地のマイクロサービス開発

 オイラ大地のマイクロサービス開発

オイラ大地では、Kubernetesを利用したシステムのマイクロサービス化を行っています。 そのマイクロサービス化において、どのように開発やリリースを行っているかについてお話しします。

Fa86300779dc08d64cc20746a9fb4e84?s=128

ohdate-yuuta

August 05, 2019
Tweet

Transcript

  1. オイラ大地の
 マイクロサービス開発
 <OiStudy #2 - パルシステムさんとオイラ大地>
 
 
 
 大舘

    雄太
 1 2019/08/05 Mon

  2. アジェンダ
 1. 自己紹介
 2. 覚えて帰ってほしいこと
 3. オイシックス・ラ・大地とは
 4. オイシックスについて
 5.

    マイクロサービス化の背景
 6. マイクロサービス開発の課題
 7. GitOpsによるマイクロサービス開発
 2
  3. 1. 自己紹介
 
 • 名前
 ◦ 大舘 雄太(おおだて ゆうた)  @utautau
 • 所属


    ◦ オイシックス・ラ・大地
 システム本部 システム基盤部 基盤刷新セクション
 • 経歴
 ◦ 入社:2018年4月
 ◦ 日々さわるもの:Java, Spring Boot, Kubernetes
 3
  4. 2. 覚えて帰ってほしいこと
 • マイクロサービス化やってます
 
 • Gitopsによるマイクロサービス開発してます
 ◦ 開発の課題を、こうやって解決してます
 


    
 
 4
  5. 3-1. オイシックス・ラ・大地とは
 5

  6. 6 3-2. オイシックス・ラ・大地とは
 3つのブランドから成り立つ会社


  7. 4-1. オイシックスについて
 2000年創業の生鮮食品のネットショップ
 7

  8. 4-2. オイシックスについて
 • ECサイトは2000年の創業当時からJavaで作成
 • ソース上のコメントで確認できる
   最古の日付は、2000年6月1日
 
 
 8

    巨大なモノリシックシステム

  9. 5-1. マイクロサービス化の背景
 一方で、近年のブランドの成長
 → 従来では発生しなかった課題
 9 1. システムの品質
 2. ローンチスピード


    3. スケーラビリティ
 マイクロサービス化

  10. 5-2. マイクロサービス化の背景
 Kubernetes
  Dockerなどで作成した沢山の
  マイクロサービスをpodという単位で
  協調して動かせる
 
   YAMLファイルで定義するだけ!
 
 10

  11. 6-1. マイクロサービス開発の課題
 Kubernetesを利用したマイクロサービス化
 →大量に増える設定ファイル(YAML)
 →大量に「kubectl apply」コマンド
 11 サービス数
 環境数
 ・本番


    ・テスト
 ・etc.
 Kubernetes用ファイル(YAML)
 ・Deployment
 ・ConfigMap
 ・Secret
 ざっくりでも...

  12. 6-2. マイクロサービス開発の課題
 ファイル管理とデプロイ作業が分離している不安...
 ◦ ちゃんと最新のマニフェストをapplyしているか
 ◦ ちゃんと対象のクラスターにapplyしているか
 ◦ ちゃんと対象のネームスペースにapplyしているか
 ◦

    ちゃんと対象の... ちゃんと... ちゃんと...
 12 GitOps
 →ファイル管理とデプロイ作業が一緒だとうれしい!

  13. 7-1. GitOpsによるマイクロサービス開発
 GitOps=プル&リクエストによるオペレーション
 13

  14. 7-2. GitOpsによるマイクロサービス開発
 
 14 ローカル開発環境
 GitHub
 CircleCI
 Docker
 Image
 manifest

    repo
 Pull
 Push
 PR
 CD
 5
 6
 7
 8
 Kubernetes
 Java repo
 PR
 CI
 Pull
 Push
 3
 4
 1
 2
 Docker Hub
 GitOpsにもとづくCI/CD

  15. 7-3. GitOpsによるマイクロサービス開発
 
 
 15 CI (Continuous Integration)
 1. Java

    Repositoryを作成 or Pull
 2. プロダクトコード/テストコードを記述
 3. Java RepositoryにPush
 a. 自動でCircle CIがテストコードを実行
 b. 自動でDocker HubにImageをPush
 

  16. 7-4. GitOpsによるマイクロサービス開発
 
 
 16 > 自動でCircle CIでテストコードを実行
 ERROR
 外部リソース(DBなど)が必要!


     じゃあ、、
 1. マネージドサービスをテスト用に立てる→自由に使えない。。
 2. インメモリDB(H2など)を使う→微妙に仕様が違ったり。。
 3. Dockerで立てる→「docker pull 」「docker run」・・・

  17. 7-5. GitOpsによるマイクロサービス開発
 
 
 17 「Testcontainers」という便利なライブラリがある
  ・テストコードからコンテナを起動できるライブラリ
  ・テスト時にイメージのpull/run/stopを自動的に行える  


  18. 7-6. GitOpsによるマイクロサービス開発
 
 18 ローカル開発環境
 GitHub
 CircleCI
 Docker
 Image
 manifest

    repo
 Pull
 Push
 PR
 CD
 5
 6
 7
 8
 Kubernetes
 Java repo
 PR
 CI
 Pull
 Push
 3
 4
 1
 2
 Docker Hub
 GitOpsにもとづくCI/CD

  19. 7-7. GitOpsによるマイクロサービス開発
 CD (Continuous Delivery)
 1. manifest Repositoryを作成 or Pull


    2. マニフェストを記述
 3. manifest RepositoryにPush
 a. 自動でCircleCI経由で、Kubernetesにデプロイ
 ※ブランチ名によって、デプロイ先を選択
 19
  20. >自動でCircleCI経由で、Kubernetesにデプロイ
  configmapリソースのみの更新の場合
 7-8. GitOpsによるマイクロサービス開発
 20 podに変更が反映されない
 podの再起動が必要!
  なぜなら、podは起動時に環境変数をキャッシュしてる 


  21. 「kustomize」というツール
 (設定ファイルを基本設定 + 差分値に分割できる)
 「configMapGenerator」を使う!
 7-9. GitOpsによるマイクロサービス開発
 21 deploymentリソースも更新することができる
 →ポッドが再起動される


  22. configMapGenerator 
 7-10.GitOpsによるマイクロサービス開発
 22 namespace: ns1 bases: - ../base patches:

    - deployment.yaml - service.yaml configMapGenerator: - name: sample-service-config literals: - SPRING_PROFILES_ACTIVE=production env: - name: SPRING_PROFILES_ACTIVE valueFrom: configMapKeyRef: name: sample-service-config key: SPRING_PROFILES_ACTIVE production-ns1/kustomization.yaml
 base/deployment.yaml

  23. 7-11.GitOpsによるマイクロサービス開発
 23 apiVersion: v1 kind: ConfigMap metadata: name: sample-service-config-tb9f7t5gh8 namespace:

    ns1 data: SPRING_PROFILES_ACTIVE: "production" --- apiVersion: v1 kind: Deployment # 省略 env: - name: SPRING_PROFILES_ACTIVE valueFrom: configMapKeyRef: name: sample-service-config-tb9f7t5gh8 key: SPRING_PROFILES_ACTIVE kustomizeによって作成されたファイル
 applyするとpodに再起動がかかる!
 ハッシュ値つきの
 configMapのnameが作成される

  24. まとめ
 • マイクロサービス化やってます
 ◦ 2000年から作ってきたシステムがモノリス化
 ◦ サービス成長に遅れをとらないように改善
 • Gitopsによるマイクロサービス開発してます
 ◦

    ミスなく高速に開発するためのCI/CD
 ▪ GitOpsに基づく開発フロー
 ▪ Testcontainersを用いたテスト
 ▪ kustomizeを用いたCD
 24