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
LINEヤフーにおける超大規模プラットフォーム実現への挑戦と学び / Challenges and Lessons in Building an Ultra-Large-Scale Platform at LY Corporation
hhiroshell
3
1.4k
Architecting Kubernetes-Based Internal Developer Platforms: Essential Patterns and Practices
hhiroshell
0
120
Discover Your Tailored Platform Strategy with Real-World Practice
hhiroshell
1
220
Kubernetesでアプリの安定稼働と高頻度のアップデートを両立するためのプラクティス / Best Practices for Applications on Kubernetesto Achieve Both Frequent Updates and Stability
hhiroshell
11
3.9k
Platform EngineeringにおけるKubernetesの活用法とLINEヤフーにおける事例のご紹介 / Platform Engineering and Kubernetes Findy Lunch LT Edition
hhiroshell
7
2k
大規模Webアプリケーションプラットフォームを開発して軌道に乗るまでにやったこと / How to Put Platforms on Track
hhiroshell
2
2.5k
Kubernetesとカスタムコントローラーを活用したプラットフォーム開発・運用の勘所 / Platform Engineering and Kubernetes
hhiroshell
1
1.3k
Best Practices for Applications on Kubernetesto Achieve Both Frequent Updates and Stability
hhiroshell
3
710
Cloud Native Developers JP (cndjp) のご紹介 / about cndjp
hhiroshell
0
230
Other Decks in Technology
See All in Technology
2/18 Making Security Scale: メルカリが考えるセキュリティ戦略 - Coincheck x LayerX x Mercari
jsonf
0
240
Ruby on Railsで持続可能な開発を行うために取り組んでいること
am1157154
3
160
LINE NEWSにおけるバックエンド開発
lycorptech_jp
PRO
0
330
Pwned Labsのすゝめ
ken5scal
2
530
エンジニアリング価値を黒字化する バリューベース戦略を用いた 技術戦略策定の道のり
kzkmaeda
7
3.2k
サバイバルモード下でのエンジニアリングマネジメント
konifar
13
3.5k
2025/3/1 公共交通オープンデータデイ2025
morohoshi
0
100
入門 PEAK Threat Hunting @SECCON
odorusatoshi
0
170
JAWS DAYS 2025 アーキテクチャ道場 事前説明会 / JAWS DAYS 2025 briefing document
naospon
0
2.7k
どちらかだけじゃもったいないかも? ECSとEKSを適材適所で併用するメリット、運用課題とそれらの対応について
tk3fftk
2
240
AI Agent時代なのでAWSのLLMs.txtが欲しい!
watany
3
350
"TEAM"を導入したら最高のエンジニア"Team"を実現できた / Deploying "TEAM" and Building the Best Engineering "Team"
yuj1osm
1
230
Featured
See All Featured
Making Projects Easy
brettharned
116
6k
How GitHub (no longer) Works
holman
314
140k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
GitHub's CSS Performance
jonrohan
1030
460k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Practical Orchestrator
shlominoach
186
10k
The Language of Interfaces
destraynor
156
24k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
A designer walks into a library…
pauljervisheath
205
24k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
How to Ace a Technical Interview
jacobian
276
23k
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