Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CI/CD Pipeline for Minimalist
Search
pannpers
October 24, 2019
Programming
4
2.7k
CI/CD Pipeline for Minimalist
『Kubernetes Meetup Tokyo #24』でのLT。
https://k8sjp.connpass.com/event/149872/
pannpers
October 24, 2019
Tweet
Share
Other Decks in Programming
See All in Programming
高度なUI/UXこそHotwireで作ろう Kaigi on Rails 2025
naofumi
4
3.5k
アメ車でサンノゼを走ってきたよ!
s_shimotori
0
140
(Extension DC 2025) Actor境界を越える技術
teamhimeh
1
230
非同期jobをtransaction内で 呼ぶなよ!絶対に呼ぶなよ!
alstrocrack
0
550
iOS 17で追加されたSubscriptionStoreView を利用して5分でサブスク実装チャレンジ
natmark
0
620
XP, Testing and ninja testing ZOZ5
m_seki
3
320
Things You Thought You Didn’t Need To Care About That Have a Big Impact On Your Job
hollycummins
0
160
Breaking Up with Big ViewModels — Without Breaking Your Architecture (droidcon Berlin 2025)
steliosf
PRO
1
340
Your Perfect Project Setup for Angular @BASTA! 2025 in Mainz
manfredsteyer
PRO
0
130
あなたの知らない「動画広告」の世界 - iOSDC Japan 2025
ukitaka
0
410
Go Conference 2025: Goで体感するMultipath TCP ― Go 1.24 時代の MPTCP Listener を理解する
takehaya
7
1.6k
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
340
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.2k
The Language of Interfaces
destraynor
162
25k
Why Our Code Smells
bkeepers
PRO
339
57k
Statistics for Hackers
jakevdp
799
220k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Balancing Empowerment & Direction
lara
4
680
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
30
2.9k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Music & Morning Musume
bryan
46
6.8k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
Transcript
CI/CD Pipeline for Minimalist
hello! I am Yoshimasa Hamada I am Web Developer and
work for Zeals. You can find me at @panchan9 or @pannpers. 2
実際に、Kubernetes 導入してますか? (or 直近に導入予定) 3 1.
CD専用ツール使ってますか? 4 2. • Spinnaker • Jenkins X • Argo
CD • Flux by Weaveworks • Tekton • GoCD
Hard Way to introduce CD Tool in Initial Phase ✘
CDツールの選択肢が多過ぎる ✘ そして、どれも多機能なので比較検討のコストが高い ✘ というかKubernetesだけでも、導入コスト高い
とはいえ、 CD Pipelineを構築していないと・・・
Problems ✘ k8s Contextを間違って、意図した環境とは異なる Manifestsをデプロイしてしまう ✘ Gitでコード管理されていない変更が行われている (しかも意図が分からない) ✘ デプロイ作業が属人化してしまい、新規メンバーの学習
コストが高くなる
Don’t use kubectl by hand 8
どうすればよいか?
GitOps is current Best Practices https://www.weave.works/technologies/ci-cd-for-kubernetes/
GitOps is just Principles. How implement GitOps approach?
Summary of Problems ✘ k8s導入初期で最適なCD Pipeline構築は難しい ✘ 一方、マニュアルオペレーションはリスク大・・・ ✘ 理想はGitOps。あとはどう実現するか?
◦ できればラーニングコストが低く ◦ 複雑性をできるだけ排除した方法で
CI/CD Pipeline for Minimalist
まずは前提とゴールを整理 ✘ Git Branch Model どうする? ✘ Project Layout は?(GCPを例にします)
✘ いきなりGitOpsとかできるん?
GitHub Flow 1. Git Branch Model Master Feature PipelineのTriggerを変えれば、Git FlowやGitLab
Flowでも同じことができます
• zeals-dev • zeals-stg • zeals-prd • zeals-cr (container registry)
Docker Imageを一元管理するProject 2. GCP Project Layout
CI Ops like GitOps !! 3. Workflow For more details
about GitOps, Kubernetes anti-patterns: Let's do GitOps, not CIOps!
どういうことだってばよ!?
GitOpsが提唱する以下の原則には従う ✘ ApplicationやMiddlewareの設定は、Gitレポジトリで管 理しているものが絶対的な正であり、差異が発生しない ようにする (HPAによるPod数の際などは除く) ✘ kubectl を直接使用してデプロイを行わない
その一方で 『アンチパターン』とされている CI Opsを部分的に採用
具体的には・・・ ✘ デプロイに必要なCredentialsをCIツールに渡すことを許容 する ✘ GCPであれば、CIツール用に作成したService Accountの JSONファイル ✘ これにはKubernetesマスターのAPIへ命令を送ることがで
きる、とても強力な権限が付与されている
要するに GitOpsの恩恵を受けつつ 使い慣れたCIツールを使うことで (あと、デプロイ用のちょっとした Shell Script) ラーニングコストも最小限に!! 以下はCircleCIを例としています
それではここで Zealsの実際のCI/CD Pipelineを紹介
None
None
Point 1 ✘ PushされたFeatureブランチ専用のNamespaceを 作成し、デプロイする ✘ ローカルからport-forwardし、動作検証を行う ◦ cert-managerでTLS証明書を自動作成し、 外部からのエンドポイントも自動で用意したい
✘ CircleCIでは『ブランチの削除』をHookできないため、 毎回のジョブ実行時に存在するブランチと k8sのNamespaceを照合し、無ければ削除している
None
Point 2 ✘ masterブランチへのMergeコミットIDをDocker Imageのタ グとしてPushする e.g. zeals/hoge:98sie82 ✘ このへんはSkaffoldがやってくれるので、雑に
skaffold run -p ${ENV} と実行するだけでOK
None
Point 3 ✘ StagingのジョブでPushしたDocker ImageをPull ✘ masterブランチへのGitタグ(v0.1.2)を Docker Imageのタグに付与してPushする ◦
docker tag zeals/hoge:98sie82 zeals/hoge:v0.1.2 ◦ docker push zeals/hoge:v0.1.2 ✘ ImageのビルドはSkipするために、Skaffoldは run ではなく、 deploy コマンドを使う ◦ skaffold deploy -p ${ENV} --images=zeals/hoge:v0.1.2
これらを実行するための CircleCIのコンフィグや Shell Scriptは・・・
Tech Blogで公開します!! (Comming Soon) https://tech.zeals.co.jp
Conclusion ✘ k8s導入の初期フェーズは使い慣れたCIツールでも、 わりといい感じのCI/CD Pipelineを作れる ✘ ただ、本格運用に必要な機能は不足 ◦ カナリアリリース ◦
障害時のロールバック ◦ Git上のk8s Manifestと実際の値の変更検知 ✘ ある程度、k8s運用に慣れたタイミングで より高機能なCD専用ツールを導入しよう
thanks! Any questions? You can find me at @panchan9