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.5k
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.2k
Architecting Kubernetes-Based Internal Developer Platforms: Essential Patterns and Practices
hhiroshell
0
87
Discover Your Tailored Platform Strategy with Real-World Practice
hhiroshell
1
200
Kubernetesでアプリの安定稼働と高頻度のアップデートを両立するためのプラクティス / Best Practices for Applications on Kubernetesto Achieve Both Frequent Updates and Stability
hhiroshell
10
3.8k
Platform EngineeringにおけるKubernetesの活用法とLINEヤフーにおける事例のご紹介 / Platform Engineering and Kubernetes Findy Lunch LT Edition
hhiroshell
7
1.7k
大規模Webアプリケーションプラットフォームを開発して軌道に乗るまでにやったこと / How to Put Platforms on Track
hhiroshell
2
2.5k
Kubernetesとカスタムコントローラーを活用したプラットフォーム開発・運用の勘所 / Platform Engineering and Kubernetes
hhiroshell
1
1.2k
Best Practices for Applications on Kubernetesto Achieve Both Frequent Updates and Stability
hhiroshell
3
680
Cloud Native Developers JP (cndjp) のご紹介 / about cndjp
hhiroshell
0
200
Other Decks in Technology
See All in Technology
株式会社ログラス − エンジニア向け会社説明資料 / Loglass Comapany Deck for Engineer
loglass2019
3
32k
GitHub Copilot のテクニック集/GitHub Copilot Techniques
rayuron
37
14k
PHP ユーザのための OpenTelemetry 入門 / phpcon2024-opentelemetry
shin1x1
1
260
Amazon VPC Lattice 最新アップデート紹介 - PrivateLink も似たようなアップデートあったけど違いとは
bigmuramura
0
200
NW-JAWS #14 re:Invent 2024(予選落ち含)で 発表された推しアップデートについて
nagisa53
0
270
NilAway による静的解析で「10 億ドル」を節約する #kyotogo / Kyoto Go 56th
ytaka23
3
380
サーバレスアプリ開発者向けアップデートをキャッチアップしてきた #AWSreInvent #regrowth_fuk
drumnistnakano
0
200
レンジャーシステムズ | 会社紹介(採用ピッチ)
rssytems
0
150
C++26 エラー性動作
faithandbrave
2
760
事業貢献を考えるための技術改善の目標設計と改善実績 / Targeted design of technical improvements to consider business contribution and improvement performance
oomatomo
0
100
TSKaigi 2024 の登壇から広がったコミュニティ活動について
tsukuha
0
160
生成AIのガバナンスの全体像と現実解
fnifni
1
190
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
133
9k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
Done Done
chrislema
181
16k
Faster Mobile Websites
deanohume
305
30k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
48
2.2k
Rails Girls Zürich Keynote
gr2m
94
13k
A better future with KSS
kneath
238
17k
Side Projects
sachag
452
42k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
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