オイラ大地では、Kubernetesを利用したシステムのマイクロサービス化を行っています。 そのマイクロサービス化において、どのように開発やリリースを行っているかについてお話しします。
オイラ大地の マイクロサービス開発 <OiStudy #2 - パルシステムさんとオイラ大地> 大舘 雄太 12019/08/05 Mon
View Slide
アジェンダ 1. 自己紹介 2. 覚えて帰ってほしいこと 3. オイシックス・ラ・大地とは 4. オイシックスについて 5. マイクロサービス化の背景 6. マイクロサービス開発の課題 7. GitOpsによるマイクロサービス開発 2
1. 自己紹介 ● 名前 ○ 大舘 雄太(おおだて ゆうた) @utautau ● 所属 ○ オイシックス・ラ・大地 システム本部 システム基盤部 基盤刷新セクション ● 経歴 ○ 入社:2018年4月 ○ 日々さわるもの:Java, Spring Boot, Kubernetes 3
2. 覚えて帰ってほしいこと ● マイクロサービス化やってます ● Gitopsによるマイクロサービス開発してます ○ 開発の課題を、こうやって解決してます 4
3-1. オイシックス・ラ・大地とは 5
63-2. オイシックス・ラ・大地とは 3つのブランドから成り立つ会社
4-1. オイシックスについて 2000年創業の生鮮食品のネットショップ 7
4-2. オイシックスについて ● ECサイトは2000年の創業当時からJavaで作成 ● ソース上のコメントで確認できる 最古の日付は、2000年6月1日 8巨大なモノリシックシステム
5-1. マイクロサービス化の背景 一方で、近年のブランドの成長 → 従来では発生しなかった課題 91. システムの品質 2. ローンチスピード 3. スケーラビリティ マイクロサービス化
5-2. マイクロサービス化の背景 Kubernetes Dockerなどで作成した沢山の マイクロサービスをpodという単位で 協調して動かせる YAMLファイルで定義するだけ! 10
6-1. マイクロサービス開発の課題 Kubernetesを利用したマイクロサービス化 →大量に増える設定ファイル(YAML) →大量に「kubectl apply」コマンド 11サービス数 環境数 ・本番 ・テスト ・etc. Kubernetes用ファイル(YAML) ・Deployment ・ConfigMap ・Secret ざっくりでも...
6-2. マイクロサービス開発の課題 ファイル管理とデプロイ作業が分離している不安... ○ ちゃんと最新のマニフェストをapplyしているか ○ ちゃんと対象のクラスターにapplyしているか ○ ちゃんと対象のネームスペースにapplyしているか ○ ちゃんと対象の... ちゃんと... ちゃんと... 12GitOps →ファイル管理とデプロイ作業が一緒だとうれしい!
7-1. GitOpsによるマイクロサービス開発 GitOps=プル&リクエストによるオペレーション 13
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
7-3. GitOpsによるマイクロサービス開発 15CI (Continuous Integration) 1. Java Repositoryを作成 or Pull 2. プロダクトコード/テストコードを記述 3. Java RepositoryにPush a. 自動でCircle CIがテストコードを実行 b. 自動でDocker HubにImageをPush
7-4. GitOpsによるマイクロサービス開発 16> 自動でCircle CIでテストコードを実行 ERROR 外部リソース(DBなど)が必要! じゃあ、、 1. マネージドサービスをテスト用に立てる→自由に使えない。。 2. インメモリDB(H2など)を使う→微妙に仕様が違ったり。。 3. Dockerで立てる→「docker pull 」「docker run」・・・
7-5. GitOpsによるマイクロサービス開発 17「Testcontainers」という便利なライブラリがある ・テストコードからコンテナを起動できるライブラリ ・テスト時にイメージのpull/run/stopを自動的に行える
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
7-7. GitOpsによるマイクロサービス開発 CD (Continuous Delivery) 1. manifest Repositoryを作成 or Pull 2. マニフェストを記述 3. manifest RepositoryにPush a. 自動でCircleCI経由で、Kubernetesにデプロイ ※ブランチ名によって、デプロイ先を選択 19
>自動でCircleCI経由で、Kubernetesにデプロイ configmapリソースのみの更新の場合 7-8. GitOpsによるマイクロサービス開発 20podに変更が反映されない podの再起動が必要! なぜなら、podは起動時に環境変数をキャッシュしてる
「kustomize」というツール (設定ファイルを基本設定 + 差分値に分割できる) 「configMapGenerator」を使う! 7-9. GitOpsによるマイクロサービス開発 21deploymentリソースも更新することができる →ポッドが再起動される
configMapGenerator 7-10.GitOpsによるマイクロサービス開発 22namespace: ns1bases:- ../basepatches:- deployment.yaml- service.yamlconfigMapGenerator:- name: sample-service-configliterals:- SPRING_PROFILES_ACTIVE=productionenv:- name: SPRING_PROFILES_ACTIVEvalueFrom:configMapKeyRef:name: sample-service-configkey: SPRING_PROFILES_ACTIVEproduction-ns1/kustomization.yaml base/deployment.yaml
7-11.GitOpsによるマイクロサービス開発 23apiVersion: v1kind: ConfigMapmetadata:name: sample-service-config-tb9f7t5gh8namespace: ns1data:SPRING_PROFILES_ACTIVE: "production"---apiVersion: v1kind: Deployment# 省略env:- name: SPRING_PROFILES_ACTIVEvalueFrom:configMapKeyRef:name: sample-service-config-tb9f7t5gh8key: SPRING_PROFILES_ACTIVEkustomizeによって作成されたファイル applyするとpodに再起動がかかる! ハッシュ値つきの configMapのnameが作成される
まとめ ● マイクロサービス化やってます ○ 2000年から作ってきたシステムがモノリス化 ○ サービス成長に遅れをとらないように改善 ● Gitopsによるマイクロサービス開発してます ○ ミスなく高速に開発するためのCI/CD ■ GitOpsに基づく開発フロー ■ Testcontainersを用いたテスト ■ kustomizeを用いたCD 24