$30 off During Our Annual Pro Sale. View Details »

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

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

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

ohdate-yuuta

August 05, 2019
Tweet

More Decks by ohdate-yuuta

Other Decks in Technology

Transcript

  1. オイラ大地の

    マイクロサービス開発

    <OiStudy #2 - パルシステムさんとオイラ大地>




    大舘 雄太

    1
    2019/08/05 Mon


    View Slide

  2. アジェンダ

    1. 自己紹介

    2. 覚えて帰ってほしいこと

    3. オイシックス・ラ・大地とは

    4. オイシックスについて

    5. マイクロサービス化の背景

    6. マイクロサービス開発の課題

    7. GitOpsによるマイクロサービス開発

    2

    View Slide

  3. 1. 自己紹介


    ● 名前

    ○ 大舘 雄太(おおだて ゆうた)  @utautau

    ● 所属

    ○ オイシックス・ラ・大地

    システム本部 システム基盤部 基盤刷新セクション

    ● 経歴

    ○ 入社:2018年4月

    ○ 日々さわるもの:Java, Spring Boot, Kubernetes

    3

    View Slide

  4. 2. 覚えて帰ってほしいこと

    ● マイクロサービス化やってます


    ● Gitopsによるマイクロサービス開発してます

    ○ 開発の課題を、こうやって解決してます




    4

    View Slide

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

    5

    View Slide

  6. 6
    3-2. オイシックス・ラ・大地とは

    3つのブランドから成り立つ会社


    View Slide

  7. 4-1. オイシックスについて

    2000年創業の生鮮食品のネットショップ

    7

    View Slide

  8. 4-2. オイシックスについて

    ● ECサイトは2000年の創業当時からJavaで作成

    ● ソース上のコメントで確認できる

      最古の日付は、2000年6月1日



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


    View Slide

  9. 5-1. マイクロサービス化の背景

    一方で、近年のブランドの成長

    → 従来では発生しなかった課題

    9
    1. システムの品質

    2. ローンチスピード

    3. スケーラビリティ

    マイクロサービス化


    View Slide

  10. 5-2. マイクロサービス化の背景

    Kubernetes

     Dockerなどで作成した沢山の

     マイクロサービスをpodという単位で

     協調して動かせる


      YAMLファイルで定義するだけ!

    
 10

    View Slide

  11. 6-1. マイクロサービス開発の課題

    Kubernetesを利用したマイクロサービス化

    →大量に増える設定ファイル(YAML)

    →大量に「kubectl apply」コマンド

    11
    サービス数
 環境数

    ・本番

    ・テスト

    ・etc.

    Kubernetes用ファイル(YAML)

    ・Deployment

    ・ConfigMap

    ・Secret

    ざっくりでも...


    View Slide

  12. 6-2. マイクロサービス開発の課題

    ファイル管理とデプロイ作業が分離している不安...

    ○ ちゃんと最新のマニフェストをapplyしているか

    ○ ちゃんと対象のクラスターにapplyしているか

    ○ ちゃんと対象のネームスペースにapplyしているか

    ○ ちゃんと対象の... ちゃんと... ちゃんと...

    12
    GitOps

    →ファイル管理とデプロイ作業が一緒だとうれしい!


    View Slide

  13. 7-1. GitOpsによるマイクロサービス開発

    GitOps=プル&リクエストによるオペレーション

    13

    View Slide

  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


    View Slide

  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


    View Slide

  16. 7-4. GitOpsによるマイクロサービス開発



    16
    > 自動でCircle CIでテストコードを実行

    ERROR

    外部リソース(DBなど)が必要!

     じゃあ、、

    1. マネージドサービスをテスト用に立てる→自由に使えない。。

    2. インメモリDB(H2など)を使う→微妙に仕様が違ったり。。

    3. Dockerで立てる→「docker pull 」「docker run」・・・


    View Slide

  17. 7-5. GitOpsによるマイクロサービス開発



    17
    「Testcontainers」という便利なライブラリがある

     ・テストコードからコンテナを起動できるライブラリ

     ・テスト時にイメージのpull/run/stopを自動的に行える  


    View Slide

  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


    View Slide

  19. 7-7. GitOpsによるマイクロサービス開発

    CD (Continuous Delivery)

    1. manifest Repositoryを作成 or Pull

    2. マニフェストを記述

    3. manifest RepositoryにPush

    a. 自動でCircleCI経由で、Kubernetesにデプロイ

    ※ブランチ名によって、デプロイ先を選択

    19

    View Slide

  20. >自動でCircleCI経由で、Kubernetesにデプロイ

     configmapリソースのみの更新の場合

    7-8. GitOpsによるマイクロサービス開発

    20
    podに変更が反映されない

    podの再起動が必要!

     なぜなら、podは起動時に環境変数をキャッシュしてる 


    View Slide

  21. 「kustomize」というツール

    (設定ファイルを基本設定 + 差分値に分割できる)

    「configMapGenerator」を使う!

    7-9. GitOpsによるマイクロサービス開発

    21
    deploymentリソースも更新することができる

    →ポッドが再起動される


    View Slide

  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


    View Slide

  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が作成される


    View Slide

  24. まとめ

    ● マイクロサービス化やってます

    ○ 2000年から作ってきたシステムがモノリス化

    ○ サービス成長に遅れをとらないように改善

    ● Gitopsによるマイクロサービス開発してます

    ○ ミスなく高速に開発するためのCI/CD

    ■ GitOpsに基づく開発フロー

    ■ Testcontainersを用いたテスト

    ■ kustomizeを用いたCD

    24

    View Slide