💡

Goで実装したAPIをデプロイしよう!(k8s編)

に公開

📝 概要

Goで実装したAPIをKubernetes(k8s)にデプロイする方法を紹介します!

最近業務でECSやEKSに触れることが増えてきたので、個人開発にもk8sを取り入れてみようと思い、本記事を書きました。
ECSやEKSの記事も、いずれZennで書こうと思っているのでお楽しみに!

✅ 前提条件

以下の環境が整っていることを前提としています。

  • Go言語の開発環境
  • Docker & Kubernetes(今回は kind を使用)
  • AWS ECR(Elastic Container Registry)へのアクセス権限

今回は Helm Chart を使って Kubernetes リソースを簡単に構築します。
Helmについては以下の記事で入門向けに解説しているので、参考にしてください!

👉 Helmの基本をざっくり理解したい人向けの記事


1. Goアプリケーションの作成

まずは簡単なAPIをGinで作成します。

main.go
package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	r.GET("/test", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "test is passed!"})
	})

	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "/ is alive!"})
	})

	r.Run(":8080")
}

今回は Kubernetes へのデプロイが主題なので、Goの詳細な解説は省略しています!

2. Dockerfile を作成

Goアプリをコンテナ化するためのDockerfileを用意します。

# Build stage
FROM golang:1.24 as builder

WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app

# Runtime stage
FROM alpine:latest
RUN apk --no-cache add ca-certificates

WORKDIR /root/
COPY --from=builder /app/app .

CMD ["./app"]

3. Docker イメージをビルド

以下のコマンドでDockerイメージをビルドします。

$ docker build -t my-go-api .

4. AWS ECR にDockerイメージをプッシュ

AWSマネジメントコンソールからECRリポジトリを作成し、
表示される「プッシュコマンド」に従ってイメージをアップロードします。

リポジトリ名は任意でOKです。

5. Kubernetesクラスタを作成(kind使用)

ローカルで検証する場合は kind を使ってクラスタを構築します。

$ kind create cluster

クラスタ作成後、kubectl get nodes で接続確認をしておきましょう。

6. Helm Chart の作成と編集

Helm Chart を使ってデプロイを簡略化します。

Chartの作成

$ helm create go-api

ディレクトリ構成

go-api/
  Chart.yaml
  values.yaml
  templates/
    deployment.yaml
    service.yaml
    ...

values.yaml(編集例)

replicaCount: 2

image:
  repository: {作成したECRのURI}
  tag: {タグ名}

service:
  name: go-api
  type: ClusterIP
  port: 8080

livenessProbe:
  httpGet:
    path: /
    port: http
  initialDelaySeconds: 3
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /test
    port: http
  initialDelaySeconds: 3
  periodSeconds: 10

deployment.yaml(編集ポイントのみ)

containers:
  - name: go-api
    image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
    ports:
      - containerPort: 8080
    livenessProbe:
      httpGet:
        path: {{ .Values.livenessProbe.httpGet.path }}
        port: {{ .Values.livenessProbe.httpGet.port }}
    readinessProbe:
      httpGet:
        path: {{ .Values.readinessProbe.httpGet.path }}
        port: {{ .Values.readinessProbe.httpGet.port }}

7. Helm でKubernetesにデプロイ

以下のコマンドでアプリをデプロイします。

$ helm install go-api ./go-api

リリース名「go-api」は任意で変更OKです。

8. 動作確認

Podの状態確認

$ kubectl get pods

STATUS が Running になっていればOKです。

ポートフォワードでアクセス確認

$ kubectl port-forward service/go-api 8080:80

その後、ブラウザで以下にアクセス!

📌 まとめ

今回は以下の流れで、Go製APIをKubernetesにデプロイしました。

  1. Goアプリの作成
  2. Dockerイメージのビルド&ECRプッシュ
  3. Helm Chartでk8sリソースを生成
  4. kindクラスタにデプロイして動作確認

個人開発でk8sに触れてみたい方の参考になれば嬉しいです!
次回はEKS版も執筆予定ですのでお楽しみに!

Discussion