2018/06/01 Cloud Native MeetUp Tokyo #2での発表資料です。
Cloud Native Developers JPSkaffoldでKubernetesネイティブな開発環境を作ってみた@hhiroshell1
View Slide
Cloud Native Developers JP• 早川 博(はやかわ ひろし)• 日本オラクル所属– ソリューション・アーキテクト的な人– Containers, Microservices, DevOps• Ergodoxユーザー2自己紹介@hhiroshell
Cloud Native Developers JPSkaffoldの概要3
Cloud Native Developers JPSkaffoldとは• 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コンテナイメージのBuild3コンテナレジストリへPush4KubernetesへDeployくりかえし
Cloud Native Developers JP 7動作確認するだけでも結構手間がかかる…。Kubernetesにのせるアプリを開発するときの作業1アプリのコードを編集2コンテナイメージのBuild3コンテナレジストリへPush4KubernetesへDeployくりかえしK8sであるが故に必要な作業(面倒くさい)
Cloud Native Developers JP2Build3Push4DeploySkaffold Pipeline• Build, Push, Deployの各フェーズで、必要なコマンドを順次自動実行してくれるイメージ• らくちん!8面倒なBuild, Push, DeployをSkaffoldで自動化> docker build > docker push > kubectl apply
Cloud Native Developers JP2Build3Push4DeploySkaffoldのプラグインアーキテクチャ• dockerコマンドとkubectlを自動化する使い方9各フェーズの実態をプラグイン的に変更できる> docker build > docker push > kubectl applyGoogle ContainerBuilderGoogle ContainerRegistry> helm install
Cloud Native Developers JP> docker build > docker push > kubectl applyGoogle ContainerBuilderGoogle ContainerRegistry> helm installSkaffoldのプラグインアーキテクチャ• GKEとhelmの場合10各フェーズの実態をプラグイン的に変更できる2Build3Push4Deploy
Cloud Native Developers JP2Build3Push4DeploySkaffoldのプラグインアーキテクチャ• PushなしでKubernetesにデプロイ。ローカル開発で便利11各フェーズの実態をプラグイン的に変更できる> docker build > docker push > kubectl applyGoogle ContainerBuilderGoogle ContainerRegistry> helm install
Cloud Native Developers JPskaffold dev と skaffold run• > skaffold dev– コンソールのフォアグラウンドに常駐– コンテナイメージの依存ファイルに対する変更を検知して、Skaffold Pipelineを自動で実行してくれる– 開発中のコンテナの標準出力を自動でtailする• > skaffold run–– Skaffold Pipelineを一度だけ実行して終わる– CI/CDの中で使うときや、アプリ開発が一段落した後のサニティチェックとして12ローカル開発ではdevの方を積極的に活用しよう
Cloud Native Developers JPskaffold.yaml① imageNameでイメージ名を指定(タグは自動で付与)② デフォルトではworkspace直下のDockerfileをビルド③ skipPosh: trueによりコンテナレジストリへのプッシュ不要で直接k8sにデプロイ④ デプロイ時は、manifestsに指定したファイルを kubectlapply してくれる13Pipelineの定義ファイル1 apiVersion: skaffold/v1alpha22 kind: Config3 build:4 artifacts:5 - imageName: gcr.io/k8s-skaffold/skaffold-example6 workspace: .7 local:8 skipPush: true9 deploy:10 kubectl:11 manifests:12 - k8s-*13 profiles:14 - name: gcb15 build:16 googleCloudBuild:17 projectId: k8s-skaffold… ①… ②… ③… ④
Cloud Native Developers JPskaffold.yaml⑤ profileによって複数のPipelineを切替えられる– この例ではGoogle ContainerBuilderでk8s-skaffoldプロジェクトをビルド– > scaffold run -p gcb14Pipelineの定義ファイル1 apiVersion: skaffold/v1alpha22 kind: Config3 build:4 artifacts:5 - imageName: gcr.io/k8s-skaffold/skaffold-example6 workspace: .7 local:8 skipPush: true9 deploy:10 kubectl:11 manifests:12 - k8s-*13 profiles:14 - name: gcb15 build:16 googleCloudBuild:17 projectId: k8s-skaffold… ⑤
Cloud Native Developers JPDemo(基本編)ローカル開発で使う15
Cloud Native Developers JP2Build3Push4Deploy16Helmと組み合わせると強力Demoで紹介するSkaffold Pipeline> docker build > docker push > kubectl applyGoogle ContainerBuilderGoogle ContainerRegistry> helm install
Cloud Native Developers JPSkaffoldとHelmの組み合わせでできること• ProfileでHelmのパラメータのセットを切り替えてデプロイする17複数の構成パターンを切り替えつつmanifestを共通化4Deploychart profile:devchart profile:itAPsvc:NodePortnamespace: devnamespace: itAPAPredisredisIngress
Cloud Native Developers JP最近追加された機能• bazel対応– skaffoldのビルドフェーズでbazelが呼べる• kaniko対応– kaniko: Kubernetesクラスター内のPodでコンテナのビルドを行うツール• 特別な権限をつけなくてもビルドが実行できる• gVisor上でビルドすることでさらに安全にすることも可• skaffoldのBuildフェーズで利用する18bazel / kaniko対応
Cloud Native Developers JPQiitaに書きました(https://qiita.com/hhiroshell/items/4e3183d3890629f13dec)Demo(やってみた編)Jnekinsと組合せて使う19
Cloud Native Developers JPCI/CDツールと組み合わせてみる• KubernetesでJenkinsが可動している状態20Jenkins on Kubernetesの場合の動作イメージJenkins
Cloud Native Developers JPCI/CDツールと組み合わせてみる• SlaveがPodととして立ち上がり、そこでパイプラインが実行される21Jenkins on Kubernetesの場合の動作イメージJenkinsJenkinsSlaveBuild Push Deploy
Cloud Native Developers JPCI/CDツールと組み合わせてみる• パイプラインでSkaffoldが実行されアプリがデプロイされる22Jenkins on Kubernetesの場合の動作イメージJenkinsJenkinsSlaveAPAPredisIngressnamespace: it
Cloud Native Developers JPCI/CDツールと組み合わせてみる• パイプラインが終了したらSlaveが消える23Jenkins on Kubernetesの場合の動作イメージJenkins APAPredisIngressnamespace: it
Cloud Native Developers JP 24Jenkinsfile で定義
Cloud Native Developers JP 251 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_PSW14 skaffold run -p release15 """16 }17 …docker, kubectl, skaffoldをインストールしたコンテナを作っておき、パイプラインで利用Docker in Docker…(ビルド環境がコンテナ化されているため)
Cloud Native Developers JP 261 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_PSW14 skaffold run -p release15 """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です」のような運用を超えてくる29CI/CDツールと組み合わせるのはまだ難あり
Cloud Native Developers JP使ってみた感想 - おまけ• Draft、keel• 参考: 「SkaffoldとDraftを比べてみた」https://qiita.com/watawuwu/items/7f5e287c91e5eab3041930他のツールもチェックしてみるとよいかも
Cloud Native Developers JPFin.31