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
SkaffoldでKubernetesネイティブな開発環境を作ってみた
Search
hhiroshell
June 01, 2018
Technology
8
2.6k
SkaffoldでKubernetesネイティブな開発環境を作ってみた
2018/06/01 Cloud Native MeetUp Tokyo #2での発表資料です。
hhiroshell
June 01, 2018
Tweet
Share
More Decks by hhiroshell
See All by hhiroshell
Cloud Native Scalability for Internal Developer Platforms
hhiroshell
4
590
LINEヤフーにおける超大規模プラットフォーム実現への挑戦と学び / Challenges and Lessons in Building an Ultra-Large-Scale Platform at LY Corporation
hhiroshell
3
1.6k
Architecting Kubernetes-Based Internal Developer Platforms: Essential Patterns and Practices
hhiroshell
0
220
Discover Your Tailored Platform Strategy with Real-World Practice
hhiroshell
1
260
Kubernetesでアプリの安定稼働と高頻度のアップデートを両立するためのプラクティス / Best Practices for Applications on Kubernetesto Achieve Both Frequent Updates and Stability
hhiroshell
11
4.1k
Platform EngineeringにおけるKubernetesの活用法とLINEヤフーにおける事例のご紹介 / Platform Engineering and Kubernetes Findy Lunch LT Edition
hhiroshell
7
2.3k
大規模Webアプリケーションプラットフォームを開発して軌道に乗るまでにやったこと / How to Put Platforms on Track
hhiroshell
2
2.6k
Kubernetesとカスタムコントローラーを活用したプラットフォーム開発・運用の勘所 / Platform Engineering and Kubernetes
hhiroshell
1
1.5k
Best Practices for Applications on Kubernetesto Achieve Both Frequent Updates and Stability
hhiroshell
3
750
Other Decks in Technology
See All in Technology
整頓のジレンマとの戦い〜Tidy First?で振り返る事業とキャリアの歩み〜/Fighting the tidiness dilemma〜Business and Career Milestones Reflected on in Tidy First?〜
bitkey
3
17k
United™️ Airlines®️ Customer®️ USA Contact Numbers: Complete 2025 Support Guide
flyunitedguide
0
330
赤煉瓦倉庫勉強会「Databricksを選んだ理由と、絶賛真っ只中のデータ基盤移行体験記」
ivry_presentationmaterials
2
380
Glacierだからってコストあきらめてない? / JAWS Meet Glacier Cost
taishin
1
170
Sansanのデータプロダクトマネジメントのアプローチ
sansantech
PRO
0
190
IPA&AWSダブル全冠が明かす、人生を変えた勉強法のすべて
iwamot
PRO
2
190
Delegating the chores of authenticating users to Keycloak
ahus1
0
160
Enhancing SaaS Product Reliability and Release Velocity through Optimized Testing Approach
ropqa
1
240
開発生産性を組織全体の「生産性」へ! 部門間連携の壁を越える実践的ステップ
sudo5in5k
3
7.4k
60以上のプロダクトを持つ組織における開発者体験向上への取り組み - チームAPIとBackstageで構築する組織の可視化基盤 - / sre next 2025 Efforts to Improve Developer Experience in an Organization with Over 60 Products
vtryo
2
450
サイバーエージェントグループのSRE10年の歩みとAI時代の生存戦略
shotatsuge
3
340
united airlines ™®️ USA Contact Numbers: Complete 2025 Support Guide
flyunitedhelp
1
430
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
31
8.7k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
740
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Gamification - CAS2011
davidbonilla
81
5.4k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
690
The World Runs on Bad Software
bkeepers
PRO
69
11k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Docker and Python
trallard
44
3.5k
Transcript
Cloud Native Developers JP SkaffoldでKubernetesネイティブな 開発環境を作ってみた @hhiroshell 1
Cloud Native Developers JP • 早川 博(はやかわ ひろし) • 日本オラクル所属
– ソリューション・アーキテクト的な人 – Containers, Microservices, DevOps • Ergodoxユーザー 2 自己紹介 @hhiroshell
Cloud Native Developers JP Skaffoldの概要 3
Cloud Native Developers JP Skaffoldとは • Kubernetesに乗せるアプリケーションの開発作業を省力化してくれ るコマンドラインツール – https://github.com/GoogleContainerTools/skaffold
• Googleのエンジニアを中心に開発されているOSS (GoogleContainerTools配下のプロジェクト) – Apache License 2.0 • 2018年3月発表。最新バージョンはv0.6.1(2018/06/01現在) • 類似のツールに、Draft、keelというものがあるらしい 4
Cloud Native Developers JP 5 ★ 3,797(最多)
Cloud Native Developers JP 6 動作確認するだけでも結構手間がかかる…。 Kubernetesにのせるアプリを開発するときの作業 1 アプリの コードを編集
2 コンテナ イメージの Build 3 コンテナ レジストリへ Push 4 Kubernetesへ Deploy くりかえし
Cloud Native Developers JP 7 動作確認するだけでも結構手間がかかる…。 Kubernetesにのせるアプリを開発するときの作業 1 アプリの コードを編集
2 コンテナ イメージの Build 3 コンテナ レジストリへ Push 4 Kubernetesへ Deploy くりかえし K8sであるが故に必要な作業(面倒くさい)
Cloud Native Developers JP 2 Build 3 Push 4 Deploy
Skaffold Pipeline • Build, Push, Deployの各フェーズで、必要なコマンドを順次自動実 行してくれるイメージ • らくちん! 8 面倒なBuild, Push, DeployをSkaffoldで自動化 > docker build > docker push > kubectl apply
Cloud Native Developers JP 2 Build 3 Push 4 Deploy
Skaffoldのプラグインアーキテクチャ • dockerコマンドとkubectlを自動化する使い方 9 各フェーズの実態をプラグイン的に変更できる > docker build > docker push > kubectl apply Google Container Builder Google Container Registry > helm install
Cloud Native Developers JP > docker build > docker push
> kubectl apply Google Container Builder Google Container Registry > helm install Skaffoldのプラグインアーキテクチャ • GKEとhelmの場合 10 各フェーズの実態をプラグイン的に変更できる 2 Build 3 Push 4 Deploy
Cloud Native Developers JP 2 Build 3 Push 4 Deploy
Skaffoldのプラグインアーキテクチャ • PushなしでKubernetesにデプロイ。ローカル開発で便利 11 各フェーズの実態をプラグイン的に変更できる > docker build > docker push > kubectl apply Google Container Builder Google Container Registry > helm install
Cloud Native Developers JP skaffold dev と skaffold run •
> skaffold dev – コンソールのフォアグラウンドに常駐 – コンテナイメージの依存ファイルに対する変更を検知して、Skaffold Pipeline を自動で実行してくれる – 開発中のコンテナの標準出力を自動でtailする • > skaffold run – – Skaffold Pipelineを一度だけ実行して終わる – CI/CDの中で使うときや、アプリ開発が一段落した後のサニティチェックと して 12 ローカル開発ではdevの方を積極的に活用しよう
Cloud Native Developers JP skaffold.yaml ① imageNameでイメージ名を指 定(タグは自動で付与) ② デフォルトではworkspace直下
のDockerfileをビルド ③ skipPosh: trueによりコンテナ レジストリへのプッシュ不要で 直接k8sにデプロイ ④ デプロイ時は、manifestsに指 定したファイルを kubectl apply してくれる 13 Pipelineの定義ファイル 1 apiVersion: skaffold/v1alpha2 2 kind: Config 3 build: 4 artifacts: 5 - imageName: gcr.io/k8s-skaffold/skaffold-example 6 workspace: . 7 local: 8 skipPush: true 9 deploy: 10 kubectl: 11 manifests: 12 - k8s-* 13 profiles: 14 - name: gcb 15 build: 16 googleCloudBuild: 17 projectId: k8s-skaffold … ① … ② … ③ … ④
Cloud Native Developers JP skaffold.yaml ⑤ profileによって複数の Pipelineを切替えられる – この例ではGoogle
Container Builderでk8s-skaffoldプロジェ クトをビルド – > scaffold run -p gcb 14 Pipelineの定義ファイル 1 apiVersion: skaffold/v1alpha2 2 kind: Config 3 build: 4 artifacts: 5 - imageName: gcr.io/k8s-skaffold/skaffold-example 6 workspace: . 7 local: 8 skipPush: true 9 deploy: 10 kubectl: 11 manifests: 12 - k8s-* 13 profiles: 14 - name: gcb 15 build: 16 googleCloudBuild: 17 projectId: k8s-skaffold … ⑤
Cloud Native Developers JP Demo(基本編) ローカル開発で使う 15
Cloud Native Developers JP 2 Build 3 Push 4 Deploy
16 Helmと組み合わせると強力 Demoで紹介するSkaffold Pipeline > docker build > docker push > kubectl apply Google Container Builder Google Container Registry > helm install
Cloud Native Developers JP SkaffoldとHelmの組み合わせでできること • ProfileでHelmのパラメータのセットを切り替えてデプロイする 17 複数の構成パターンを切り替えつつmanifestを共通化 4
Deploy chart profile:dev chart profile:it AP svc:NodePort namespace: dev namespace: it AP AP redis redis Ingress
Cloud Native Developers JP 最近追加された機能 • bazel対応 – skaffoldのビルドフェーズでbazelが呼べる •
kaniko対応 – kaniko: Kubernetesクラスター内のPodでコンテナのビルドを行うツール • 特別な権限をつけなくてもビルドが実行できる • gVisor上でビルドすることでさらに安全にすることも可 • skaffoldのBuildフェーズで利用する 18 bazel / kaniko対応
Cloud Native Developers JP Qiitaに書きました(https://qiita.com/hhiroshell/items/4e3183d3890629f13dec) Demo(やってみた編) Jnekinsと組合せて使う 19
Cloud Native Developers JP CI/CDツールと組み合わせてみる • KubernetesでJenkinsが可動している状態 20 Jenkins on
Kubernetesの場合の動作イメージ Jenkins
Cloud Native Developers JP CI/CDツールと組み合わせてみる • SlaveがPodととして立ち上がり、そこでパイプラインが実行される 21 Jenkins on
Kubernetesの場合の動作イメージ Jenkins Jenkins Slave Build Push Deploy
Cloud Native Developers JP CI/CDツールと組み合わせてみる • パイプラインでSkaffoldが実行されアプリがデプロイされる 22 Jenkins on
Kubernetesの場合の動作イメージ Jenkins Jenkins Slave AP AP redis Ingress namespace: it
Cloud Native Developers JP CI/CDツールと組み合わせてみる • パイプラインが終了したらSlaveが消える 23 Jenkins on
Kubernetesの場合の動作イメージ Jenkins AP AP redis Ingress namespace: it
Cloud Native Developers JP 24 Jenkinsfile で定義
Cloud Native Developers JP 25 1 podTemplate( 2 label: 'skaffold',
3 containers: [containerTemplate( image: 'hhayakaw/skaffold-insider:v1.0.0', ttyEnabled: true, command: 'cat')], 4 volumes: [hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock')] 5 ) { 6 node('skaffold') { 7 … 8 stage('Info') {…} 9 stage('Test skaffold') { 10 git 'https://github.com/hhiroshell/cowweb.git' 11 container('skaffold-insider') { 12 sh """ 13 docker login --username=$DOCKER_ID_USR --password=$DOCKER_ID_PSW 14 skaffold run -p release 15 """ 16 } 17 … docker, kubectl, skaffoldをインストールしたコンテナ を作っておき、パイプラインで利用 Docker in Docker… (ビルド環境がコンテナ化されているため)
Cloud Native Developers JP 26 1 podTemplate( 2 label: 'skaffold',
3 containers: [containerTemplate( image: 'hhayakaw/skaffold-insider:v1.0.0', ttyEnabled: true, command: 'cat')], 4 volumes: [hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock')] 5 ) { 6 node('skaffold') { 7 … 8 stage('Info') {…} 9 stage('Test skaffold') { 10 git 'https://github.com/hhiroshell/cowweb.git' 11 container('skaffold-insider') { 12 sh """ 13 docker login --username=$DOCKER_ID_USR --password=$DOCKER_ID_PSW 14 skaffold run -p release 15 """ 16 } 17 … profileを指定してskaffoldを使う
Cloud Native Developers JP まとめ 27
Cloud Native Developers JP 使ってみた感想 - いいところ • 安定しているとは言えない –
かなり頻繁にアップデートされている(発表から3ヶ月で v0.1.0 → v0.6.1) – 約1週間使い込んだところ、バグと思しき挙動に2つ遭遇 – v0.xだからか、マイナーバージョンアップでも仕様が変わることがある • とはいえ一度動かしきればメリットは大きい – チーム開発に影響しない範囲で、個人として導入するには賛成 – コーディングが実に捗る • Helmとの相性が良い – 複数のパラメータのセットを切り替えてデプロイする時に便利 – skaffold devなら自動でchartのアンインストールまでしてくれる 28 ローカル開発で積極的に使っていきたい
Cloud Native Developers JP 使ってみた感想 – いまいちなところ • ひとつのコマンドでいろいろやってくれるのが逆に不便? –
Build/Push/Deployがひとつのコマンドに集約されており、別々に実行する手段がな さそう – パイプラインが失敗したときに、どこで問題が起きているのかが見通しが悪い • 怪しげなテクニックに依存しがち(Jenkins on k8sの場合) – Docker in Docker →kanikoが解決策になるか? – クラスター内のPodからkubectlやhelmを使うときの権限周り • manifestやHelm chartにこれば凝るほどDevとOpsの境が曖昧に… – 「DockerファイルまでがDevです」のような運用を超えてくる 29 CI/CDツールと組み合わせるのはまだ難あり
Cloud Native Developers JP 使ってみた感想 - おまけ • Draft、keel •
参考: 「SkaffoldとDraftを比べてみた」 https://qiita.com/watawuwu/items/7f5e287c91e5eab30419 30 他のツールもチェックしてみるとよいかも
Cloud Native Developers JP Fin. 31