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
GitOpsで実現するPull Request毎のプレビュー環境/Preview enviro...
Search
Takuma Kume
September 28, 2021
Technology
2.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GitOpsで実現するPull Request毎のプレビュー環境/Preview environment for each Pull Request by GitOps
Takuma Kume
September 28, 2021
More Decks by Takuma Kume
See All by Takuma Kume
SRE/インフラエンジニアの市場価値とキャリアパス/Market value and career path for SRE-infrastructure engineers
takumakume
2
1.6k
【新卒研修】共通言語としてのSRE/SRE as a common language
takumakume
0
300
DDoSとの終わりなき戦い2025/endless_battle_with_ddos_attack_2025
takumakume
3
190
事業部CTOの現在地(パネルディスカッション)/Current-location-of-Division-CTO
takumakume
0
230
ロリポップ! for Gamersを支えるインフラ/lolipop for gamers infrastructure
takumakume
0
1.8k
ロリポップ! for Gamersの立ち上げ/lolipop for gamers launch
takumakume
0
3k
ホモグラフドメインを検出してみた/detect homograph domain
takumakume
0
810
ソフトウェアの継続的アップデートをコンテナ化によって加速させる/Accelerate continuous software updates with containerization
takumakume
0
5.7k
KubernetesにおけるSBOMを利用した脆弱性管理/Vulnerability_Management_with_SBOM_in_Kubernetes
takumakume
2
3.2k
Other Decks in Technology
See All in Technology
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
16
5.9k
Data Hubグループ 紹介資料
sansan33
PRO
0
3.1k
Webアクセシビリティ入門 2026
recruitengineers
PRO
1
300
モダンフロントエンド 開発研修
recruitengineers
PRO
1
360
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
4
180
AIがAPIを書く時代に、私たちは何を設計すべきか
nagix
0
210
【CEDEC2026】コードレビュー支援ツール開発から学ぶ:LLMを用いた業務システムの実践的な運用設計と誤出力対策
cygames
PRO
0
560
サイバー捜査員研修(前半)
nomizone
1
1.7k
トヨタ⽣産⽅式(TPS)⼊⾨
recruitengineers
PRO
1
460
変化の早いClaude Codeを 書籍に落とし込む
oikon48
6
1.3k
Software Supply Chain Attackからクラウド環境を守るためにできること
lhazy
2
130
Redmine 7.0 新機能・機能強化解説(OSC2026京都ダイジェスト版)
vividtone
1
190
Featured
See All Featured
Chasing Engaging Ingredients in Design
codingconduct
0
260
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
210
Balancing Empowerment & Direction
lara
6
1.2k
The Spectacular Lies of Maps
axbom
PRO
1
890
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
760
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
430
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
440
Site-Speed That Sticks
csswizardry
13
1.4k
Exploring anti-patterns in Rails
aemeredith
3
450
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Transcript
1FQBCP5FDI$POGFSFODF (JU0QTͰ࣮ݱ͢Δ1VMM3FRVFTUຖͷ ϓϨϏϡʔڥ
(.0ϖύϘגࣜձࣾ ϗεςΟϯάࣄۀ෦ 43&νʔϜ ࠷͍ۙͬͯΔ͜ͱ ΞϓϦͷίϯςφԽLTͷಋೖ $%։ൃମݧͷ্ ٱถഅ!UBLVNBLVNF
ࠓճհ͢Δͷ ΞϓϦέʔγϣϯ ϦϙδτϦ LVCFSOFUFT Ϋϥελ Branch-A Branch-B Branch-A Branch-B 13࡞
13࡞ branch-a.example.com branch-b.example.com (JU0QTͰ࣮ݱ͢Δ1VMM3FRVFTUຖͷϓϨϏϡʔڥ
࣍ w։ൃܦҢ wϓϨϏϡʔڥͷղઆ wࠓޙͷ՝ w·ͱΊ
։ൃܦҢ
։ൃܦҢ wϦϦʔεલʹڞ༻ͷTUBHJOHڥʹΞϓϦέʔγϣϯΛσϓϩΠ ͯ͠ಈ࡞֬ೝΛߦ͏։ൃϑϩʔʹ͓͚Δ՝ wσϓϩΠߦҝ͕ඞཁͰखؒͰ͋Δ wڥʹݶΓ͕͋Γɺར༻͕ͪൃੜ͢Δ͜ͱ͕͋Δ wڞ༻Ώ͑ʹɺڥΛҰ࣌తʹઐ༗͢Δ͜ͱʹਫ਼ਆతϋʔυϧ͕ ͋Δ
1VMM3FRVFTUຖʹڥΛ ੜ͢Δ͜ͱͰ՝ղܾΛ͢Δ
ΞϓϦέʔγϣϯ ϦϙδτϦ LVCFSOFUFT Ϋϥελ Branch-A Branch-B Branch-A Branch-B 13࡞ 13࡞
branch-a.example.com branch-b.example.com ϓϨϏϡʔڥͷղઆ
ϓϨϏϡʔڥͷղઆɿલఏ "QQ3FQP 4ZTUFN.BOJGFTUT3FQP $POUBJOFS3FHJTUSZ ,VCFSOFUFT$MVTUFS ιʔείʔυ LVCFSOFUFTNBOJGFTUT LVCFSOFUFTNBOJGFTUT "SHP$% ֤"QQ3FQPͷ"SHP$%$POpH
*OHSFTT$POUSPMMFSʜ ArgoCD ΞϓϦͷίϯςφΠϝʔδ ArgoCD Image Updater "SHP$%ͰNBOJGFTUTͷ$%Λ͍ͯ͠Δ "SHP$%*NBHF6QEBUFSͰΠϝʔδͷ $%Λ͍ͯ͠Δ ϓϨϏϡʔڥͷղઆͷલʹɺϦϙδτϦͷߏͱ$%ʹ͍ͭͯ
ϓϨϏϡʔڥͷղઆɿશମ૾ "QQ3FQP 4ZTUFN.BOJGFTUT3FQP $POUBJOFS3FHJTUSZ ,VCFSOFUFT$MVTUFS Github Actions branch-a Github Actions
13࡞ App Image ίϯςφΠϝʔδͷ#VJME1VTI SFQPTJUPSZ@EJTQBUDI 13τϦΨʔͰΠϝʔδͷϏϧυͱ"SHP$%ͷઃఆΛੜ͢Δ CSBODIB༻ͷ"SHP$%ͷઃఆΛੜ HJUDPNNJUQVTI
ϓϨϏϡʔڥͷղઆɿશମ૾ "QQ3FQP 4ZTUFN.BOJGFTUT3FQP $POUBJOFS3FHJTUSZ ,VCFSOFUFT$MVTUFS Github Actions branch-a Github Actions
13࡞ App Image ίϯςφΠϝʔδͷ#VJME1VTI SFQPTJUPSZ@EJTQBUDI CSBODIB༻ͷ"SHP$%ͷઃఆΛੜ "SHP$%͕ݕ͠ϒϥϯνͷڥΛσϓϩΠ͢Δ ArgoCD CSBODIBͷڥΛੜ BQQCSBODIB CSBODIB༻ͷ"SHP$%ͷઃఆΛ"QQMZ CSBODIBͷNBOJGFTUTͷಉظΛ։࢝ %FQMPZNFOU 4FSWJDFʜ มߋΛݕ HJUDPNNJUQVTI
ϓϨϏϡʔڥͷղઆɿશମ૾ "QQ3FQP 4ZTUFN.BOJGFTUT3FQP $POUBJOFS3FHJTUSZ ,VCFSOFUFT$MVTUFS Github Actions branch-a Github Actions
13࡞ App Image ίϯςφΠϝʔδͷ#VJME1VTI SFQPTJUPSZ@EJTQBUDI CSBODIB༻ͷ"SHP$%ͷઃఆΛੜ "SHP$%*NBHF6QEBUFSͰ࠷৽ͷΠϝʔδΛద༻͢Δ ArgoCD มߋΛݕ CSBODIBͷڥΛੜ BQQCSBODIB CSBODIB༻ͷ"SHP$%ͷઃఆΛ"QQMZ CSBODIBͷNBOJGFTUTͷಉظΛ։࢝ %FQMPZNFOU 4FSWJDFʜ ArgoCD Image Updater ࠷৽ͷΠϝʔδΛద༻͢Δ มߋΛݕ ίϯςφΠϝʔδͷ#VJME1VTI ϒϥϯν1VTI͢Δʹ࣮ߦ HJUDPNNJUQVTI
ϓϨϏϡʔڥͷղઆɿશମ૾ "QQ3FQP 4ZTUFN.BOJGFTUT3FQP $POUBJOFS3FHJTUSZ ,VCFSOFUFT$MVTUFS Github Actions branch-a Github Actions
13࡞ App Image ίϯςφΠϝʔδͷ#VJME1VTI SFQPTJUPSZ@EJTQBUDI CSBODIB༻ͷ"SHP$%ͷઃఆΛੜ ArgoCD มߋΛݕ CSBODIBͷڥΛੜ BQQCSBODIB CSBODIB༻ͷ"SHP$%ͷઃఆΛ"QQMZ CSBODIBͷNBOJGFTUTͷಉظΛ։࢝ %FQMPZNFOU 4FSWJDFʜ ArgoCD Image Updater ࠷৽ͷΠϝʔδΛద༻͢Δ มߋΛݕ ίϯςφΠϝʔδͷ#VJME1VTI HJUDPNNJUQVTI
ϓϨϏϡʔڥͷղઆɿશମ૾ wҰݟෳࡶʹݟ͑Δ͕ʜ w13τϦΨʔͰ(JUIVC"DUJPOTΛͬͯɺ"SHP$%ͷઃఆΛࣗಈ ੜͯ͠ϦϙδτϦʹ1VTI͍ͯ͠Δ wͦΕҎ֎ɺ"SHP$%*NBHF6QEBUFS͕ͬͯ͘ΕΔ
"SHP$%ͷઃఆͷੜ "QQ3FQP 4ZTUFN.BOJGFTUT3FQP $POUBJOFS3FHJTUSZ ,VCFSOFUFT$MVTUFS Github Actions branch-a Github Actions
13࡞ App Image ίϯςφΠϝʔδͷ#VJME1VTI SFQPTJUPSZ@EJTQBUDI CSBODIB༻ͷ"SHP$%ͷઃఆΛੜ ArgoCD มߋΛݕ CSBODIBͷڥΛੜ BQQCSBODIB CSBODIB༻ͷ"SHP$%ͷઃఆΛ"QQMZ CSBODIBͷNBOJGFTUTͷಉظΛ։࢝ %FQMPZNFOU 4FSWJDFʜ ArgoCD Image Updater ࠷৽ͷΠϝʔδΛద༻͢Δ มߋΛݕ ίϯςφΠϝʔδͷ#VJME1VTI HJUDPNNJUQVTI
"SHP$%ͷઃఆͷੜ wBSHPDEBENJOBQQHFOFSBUFTQFDίϚϯυͰઃఆΛੜͯ͠Ϧ ϙδτϦʹ1VTI͍ͯ͠Δ $ argocd admin app generate-spec sample-app-pr-1 \
--dest-server https://kubernetes.default.svc \ --dest-namespace sample-app-pr-1 \ --path manifests/preview \ --repo https://github.com/takumakume/sample-app \ --revision branch-1 \ --sync-policy auto \ --sync-option Prune=true \ --sync-option CreateNamespace=true apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: sample-app-pr-1 spec: destination: namespace: sample-app-pr-1 server: https://kubernetes.default.svc source: path: manifests/preview repoURL: https://github.com/takumakume/sample-app targetRevision: branch-1 syncPolicy: … wੜʹඞཁͳύϥϝʔλΛ(JUIVC"DUJPOͰ͍ͯ͠Δ sample-app-pr-1.yaml
"SHP$%ͷઃఆͷੜ apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: sample-app-pr-1 spec: source:
path: manifests/preview repoURL: https://github.com/takumakume/sample-app targetRevision: branch-1 destination: namespace: sample-app-pr-1 server: https://kubernetes.default.svc syncPolicy: - CreateNamespace=true … ϓϨϏϡʔڥͷNBOJGFTUTͷσ ΟϨΫτϦΛ 13ຖͷ/BNFTQBDFʹల։ /BNFTQBDFࣗಈੜ w୯ҰͷNBOJGFTUTΛ֤ͬͯ13ͷڥΛએݴతʹੜͰ͖Δ sample-app-pr-1.yaml
"QQ*NBHFͷߋ৽ "QQ3FQP 4ZTUFN.BOJGFTUT3FQP $POUBJOFS3FHJTUSZ ,VCFSOFUFT$MVTUFS Github Actions branch-a Github Actions
13࡞ App Image ίϯςφΠϝʔδͷ#VJME1VTI SFQPTJUPSZ@EJTQBUDI CSBODIB༻ͷ"SHP$%ͷઃఆΛੜ ArgoCD มߋΛݕ CSBODIBͷڥΛੜ BQQCSBODIB CSBODIB༻ͷ"SHP$%ͷઃఆΛ"QQMZ CSBODIBͷNBOJGFTUTͷಉظΛ։࢝ %FQMPZNFOU 4FSWJDFʜ ArgoCD Image Updater ࠷৽ͷΠϝʔδΛద༻͢Δ มߋΛݕ ίϯςφΠϝʔδͷ#VJME1VTI HJUDPNNJUQVTI
"QQ*NBHFͷߋ৽ wϒϥϯνʹHJUQVTI͢Δʹɺ13൪߸ͱίϛοτϋογϡͰߏ ͞ΕΔλάΛ༩ͯ͠ΠϝʔδΛQVTI͍ͯ͠Δ wTBNQMFBQQQSFDFE w"SHP$%ͷઃఆΛੜ͢Δஈ֊Ͱ*NBHF6QEBUFSͷઃఆΛ༩ apiVersion: argoproj.io/v1alpha1 kind: Application metadata:
name: sample-app-pr-1 annotations: argocd-image-updater.argoproj.io/image-list: sample-app=takumakume/sample-app:^pr-1 argocd-image-updater.argoproj.io/sample-app.update-strategy: latest argocd-image-updater.argoproj.io/sample-app.ignore-tags: latest argocd-image-updater.argoproj.io/sample-app.allow-tags: regexp:^pr-1-[0-9a-f]{5,40}$ ... ࠷৽ͷlQSίϛοτϋογϡzͳΠϝʔδΛద༻͢Δ
ϓϨϏϡʔڥͷղઆɿڥͷআ "QQ3FQP 4ZTUFN.BOJGFTUT3FQP ,VCFSOFUFT$MVTUFS Github Actions Pull Request Github Actions
$MPTFPS.FSHF SFQPTJUPSZ@EJTQBUDI CSBODIB༻ͷ"SHP$%ͷઃఆΛআ ArgoCD আΛݕ CSBODIBͷڥΛআ BQQCSBODIB CSBODIB༻ͷ"SHP$%ͷઃఆΛআ %FQMPZNFOU 4FSWJDFʜ HJUDPNNJUQVTI apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: sample-app-pr-1 finalizers: - resources-finalizer.argocd.argoproj.io … "QQMJDBUJPOϦιʔεআ࣌ʹͦͷڥΛআ͢Δ
ϓϨϏϡʔڥͷղઆɿڥͷΞΫηε ΞϓϦέʔγϣϯ ϦϙδτϦ LVCFSOFUFT Ϋϥελ Branch-A Branch-B Branch-A Branch-B 13࡞
13࡞ branch-a.example.com branch-b.example.com *OHSFTTΛͬͯެ։͍ͯ͠Δ
ϓϨϏϡʔڥͷղઆɿڥͷΞΫηε apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress namespace: app
spec: rules: - host: staging-app.example.com http: paths: - backend: service: name: app-svc port: number: 8080 path: / pathType: Prefix tls: - hosts: - staging-app.example.com secretName: app-tls staging-app.example.com staging-app.example.com ίί ίί w*OHSFTTΛ͏߹ͷ՝ w୯ҰͷNBOJGFTUTΛෳͷϓϨϏϡʔ ڥʹར༻͢ΔͨΊɺ*OHSFTTIPTUͷ ॻ͖͕͑ඞཁ wNBOJGFTUTੜ࣌ʹεΫϦϓτͰॻ ͖͑ΔࣄͰ͖Δ͕ɺཧ͕ࡶͱ ͳΔ
ϓϨϏϡʔڥͷղઆɿڥͷΞΫηε wUBLVNBLVNFTFSWJDFFYQPTFPQFSBUPS wࢦఆͨ͠4FSWJDFΛެ։͢Δ*OHSFTTΛࣗಈੜ͢Δ0QFSBUPS w4&37*$&@/".&/".&41"$&FYBNQMFDPN wࣗಈͰ*OHSFTTIPTUΛׂΓͯΔ͜ͱ͕Ͱ͖Δ wLVCFSOFUFT4FSWJDF%JTDPWFSZͷ*OHSFTT൛ͷΑ͏ͳػೳ wએݴతʹಈతͳϗετ໊Ͱ*OHSFTTΛੜͰ͖Δ
apiVersion: service-expose.../v1alpha1 kind: ServiceExpose metadata: name: example namespace: ns1 spec:
backend: service: name: example-svc port: number: 8080 domain: example.com path: / pathType: Prefix tlsEnable: true tlsSecretName: example-tls annotations: cert-manager.io/cluster-issuer: letsencrypt apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example namespace: ns1 annotations: cert-manager.io/cluster-issuer: letsencrypt spec: rules: - host: example-svc.ns1.example.com http: paths: - backend: service: name: example-svc port: number: 8080 path: / pathType: Prefix tls: - hosts: - example-svc.ns1.example.com secretName: example-tls backend: service: name: example-svc port: number: 8080 example-svc ns1 example.com example-svc ns1 example.com example-svc ns1 example.com ެ։͢Δ4FSWJDF αʔϏεσΟεΧόϦతͳ ϗετ໊ΛࣗಈͰ༩ αʔϏε໊ namespace υϝΠϯ UBLVNBLVNFTFSWJDFFYQPTFPQFSBUPS
IUUQTTQFBLFSEFDLDPNUBLVNBLVNFHPLVCFSOFUFTPQFSBUPS LVCFSOFUFTPQFSBUPSͷৄ͍࣮͠༰ʹ͍ͭͯҎԼ
ϓϨϏϡʔڥͷղઆɿڥͷΞΫηε w4FSWJDF&YQPTFʹΑͬͯੜ͞Εͨ*OHSFTTͷϗετ໊ʹରͯ͠ wFYUFSOBMEOT"Ϩίʔυͷࣗಈઃఆ wDFSUNBOBHFS5-4ূ໌ॻͷࣗಈઃఆ
ࠓޙͷ՝
ࠓޙͷ՝ wίʔυ1VTI͔Βڥͷөྃͷ௨͕͔Γʹ͍͘ w"SHP$%/PUJpDBUJPOTͰεςʔλεΛ4MBDL௨͍ͯ͠Δ
ࠓޙͷ՝ wίʔυ1VTI͔Βڥͷөྃͷ௨͕͔Γʹ͍͘ ɹʢଓ͖ʣ wͲͷίϛοτ·ͰϓϨϏϡʔڥͷίϯςφʹө͍ͯ͠Δ͔ ͕͔Γʹ͍͘ wݫີʹ࣮ߦதͷίϯςφͷΠϝʔδλάΛݟΔ͔͠ͳ͍ wར༻ऀॻ͍ͨίʔυ͕ѱ͍ͷ͔ɺڥʹөͯ͠ͳ͍ͷ͔ அʹ໎͏Մೳੑ͕͋Δ
ࠓޙͷ՝ wίʔυ1VTI͔Βڥͷө·ͰͷλΠϜϥά͕ͦͦ͋͜͜Δ wΞϓϦͷ$*Λ1BTT wίϯςφΠϝʔδͷ#VJMEˍ1VTI w"SHP$%*NBHF6QEBUFS͕ݕ࣮͠ߦதͷίϯςφͷΠϝʔδ Λߋ৽ wίϯςφΠϝʔδͷ1VMM wίϯςφͷϩʔϧΞτ
·ͱΊ w13ͷ࡞ΛτϦΨʔʹಈ࡞֬ೝ༻ͷϓϨϏϡʔڥΛ LVCFSOFUFT্ʹࣗಈੜ͍ͯ͠Δ w"SHP$%ͷઃఆϑΝΠϧΛੜˍϦϙδτϦʹ1VTI͢Δ͚ͩͰ ͍݁ͯ͠Δ wϒϥϯνʹΞϓϦͷίʔυΛ1VTI͢ΔʹΠϝʔδΛ #VJME1VTIͯ͠"SHP$%*NBHF6QEBUFSͰڥΛߋ৽͍ͯ͠Δ wϗετ໊Λ4FSWJDF%JTDPWFSZతʹੜ͠ɺ*OHSFTTͰެ։͢Δ 0QFSBUPSΛ։ൃ͍ͯͬͯ͠Δ
ΫϥυωΠςΟϒͳٕज़ʹڵຯ͕ ͋ΔํੋඇҰॹʹಇ͖·͠ΐ͏ʂ