HelmとSkaffoldを使ってAPIとWebの開発環境を構築したので、メモしておきます。
目次
Helmとは
HelmとはKubernetesクラスタのためのパッケージマネージャーです。
1つのアプリケーションとしての動作を行うために必要なKubernetesの様々な種類のリソースをひとまとめにして管理する仕組みと、そのためのツールセットを提供するものです。
Helm の基本的な概念として以下があります。
- Chart:アプリケーションのインスタンスを作成するために必要な設定ファイル群
- Config:Chartインストール時にアプリケーションのための各種パラメータを設定することができる
- Release:Chartがインストールされ、アプリケーションが実行可能な状態
HelmではChartという設定ファイル群でKubernetesの全てのマニフェストを管理します。
一般に公開されているChartを利用する際は、公開されているHelmリポジトリからChartを取得して、変数化されているパラメーターのみを書き換え、自身のKubernetesクラスタにデプロイします。
Skaffoldとは
SkaffoldはKubernetesへの継続的な開発を容易にするコマンドラインツールです。
開発環境では、アプリケーションのソースコードの変更を検知してDockerコンテナをBuildし、コンテナレジストリへのPushした後、KubernetesクラスタにDeployまでを自動で行ってくれます。
また、開発環境におけるログやポートフォワードの機能もあります。他にも 本番やステージング環境におけるパイプライン内でCI/CDの役割を担ってくれます。
HelmとSkaffoldで開発環境を構築する
HelmとSkaffoldで開発環境を構築するにあたり、API・DB・WebそれぞれをSkaffold化しています。今回例としてOKRに関するAPIとWebを開発しています。
ディレクトリ構成
ディレクトリ構成は以下のようになっています。
APIをSkaffold化する
今回の例であるokr-apiをSkaffold化します。
まずはHelmのChartをSkaffoldに対応させるため、Chart.ymlとvalues.ymlを作成します。
Chart.yaml
Chart.yamlではChartの名前や説明などの情報をYAML形式で記述します。
・Chart.yaml
1 2 | name: okr-api version: 1.0.0 |
values.yaml
values.yamlでは、パラメータおよびそのデフォルト値の組み合わせを記述します。
ここで指定されたパラメータをtemplatesディレクトリ内に格納されているテンプレートに与えてKubernetesのマニフェストファイルを作成します。
・values.yml
1 2 3 | revision: latest replicas: 1 imagePullPolicy: IfNotPresent |
templates
templatesはマニフェストファイルのTemplateが格納されているディレクトリです。
Chartを構成するKubernetesマニフェストはTemplateと呼ばれるファイルによって生成されます。
Templateはマニフェストファイルのテンプレートに変数を埋め込んだり、環境に応じて変更される部分を抽象化することができます。
今回は、DeploymentとServiceをこのtemplates配下において抽象化しています。
・templates/deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | apiVersion: apps/v1 kind: Deployment metadata: name: okr-api spec: selector: matchLabels: app: okr-api replicas: {{ .Values.replicas }} template: metadata: labels: app: okr-api spec: containers: - name: okr-api image: {{ .Values.image }} imagePullPolicy: {{ .Values.imagePullPolicy }} resources: env: - name: SPRING_DATASOURCE_URL value: jdbc:mysql://okr-db-service:3306/okr?autoReconnect=true&useSSL=false ports: - containerPort: 8080 |
・templates/service.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 | apiVersion: v1 kind: Service metadata: name: okr-api-service spec: type: NodePort ports: - name: okr-api-service port: 8080 targetPort: 8080 protocol: TCP selector: app: okr-api |
skaffold.yaml
skaffold.yamlを作成して記述していきます。
・skaffold.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | apiVersion: skaffold/v2beta17 kind: Config metadata: name: okr-api build: artifacts: - image: okr-api context: ../../../okr-api docker: dockerfile: ../environments/okr-api/api/docker/Dockerfile local: push: false useBuildkit: true deploy: helm: releases: - name: okr-api chartPath: ./helm/deployment artifactOverrides: image: okr-api |
中身の詳細は以下の通りです。
apiVersion
使用するskaffoldのバージョンを指定
kind
Configを指定
metadata
Configに関する追加情報。プロジェクトの識別子
build
ビルドしたいDocker Imageを指定
pushはビルドを行い、Docker Hubのリポジトリにプッシュするかを指定します。
useBuildKitはBuildKitを使用してDockerイメージをビルドするかどうか(無指定の場合はDockerのデフォルトを使用)
BuildKitは高速でのビルドが可能になるdockerのイメージビルダーです。ビルド短縮のためにもtrueにします。
deploy
デプロイしたい yaml が保存されている場所を指定
ローカルでAPI開発する時
APIを開発する際はDBのみKubernetes上で起動し、APIはローカルのサーバで起動しています。
以下のYAMLファイルを作成しskaffold devすることで、DBの起動とローカルへのポートフォワーディングをしています。
・environments/okr-api/deps.yaml
1 2 3 4 5 | apiVersion: skaffold/v2beta24 kind: Config requires: - path: ./db/skaffold.yaml |
ローカルでWeb開発するとき
Webを開発する際は、APIとDBをKubernetes上で起動し、Webをローカルで起動しています。
以下のYAMLファイルを作成し、APIとDBのskaffold.yamlを起動しています。
・environments/okr-web/deps.yaml
1 2 3 4 5 | apiVersion: skaffold/v2beta24 kind: Config requires: - path: ../okr-api/db/skaffold.yaml - path: ../okr-api/api/skaffold.yaml |
全体E2Eを流すとき
全体E2Eを流す用にAPI・DB・WEBをローカルで起動するようなYAMLファイルを作成しています。
・environments/okr-web/all.yaml
1 2 3 4 5 | apiVersion: skaffold/v2beta24 kind: Config requires: - path: ./deps.yaml - path: ./app/skaffold.yaml |
参考情報
事実上の標準ツールとなっているKubernetes向けデプロイツール「Helm」入門 | さくらのナレッジ