7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-04-29

概要

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

最近は業務でECSとかEKSとかまだまだ勉強することが多く、
個人開発にも取り入れようとこの記事を作成しました!

k8s編なので、ECSやEKSの記事もどこかで書くつもりです!

前提条件

  • Go 言語の開発環境が整っていること
  • Docker と Kubernetes(k8s)がインストールされていること
  • AWS ECR(Elastic Container Registry)へのアクセス権限があること

また今回はHelm Chartを使用して、k8sリソース作成を
簡略化します!

Helmについては以下記事で入門編として解説してます!

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

まずは、シンプルな API を作成します。
今回は Ginを使用し、いくつかのエンドポイントを提供する API を作成します。

main.go
package main

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

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

	// /test エンドポイント
	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!",
		})
	})

	// ポート8080で起動
	r.Run(":8080")
}

注意

今回はk8sにデプロイすることがメインなので、Goの解説はしないです!
(気になる方はChatGPTに聞いていただけたら!)

2. Dockerfile の作成

次に、アプリケーションを Docker コンテナにパッケージングするための Dockerfile を作成します。

# ビルド用のベースイメージ
FROM golang:1.24 as builder

WORKDIR /app
COPY . .

# Goアプリケーションをビルド
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app

# 最終的なイメージ
FROM alpine:latest
RUN apk --no-cache add ca-certificates

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

CMD ["./app"]

golangのバージョンは、2025年4月現在ですと1.23以上にしないと
動きませんのでご注意を

3. Docker イメージをビルド

次に、Docker イメージをビルドします。

$ docker build -t my-go-api .

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

AWS ECR を使用して、作成した Docker イメージをアップロードします。

ECR にリポジトリを作成

AWSマネジメントコンソールにログインし、ECRにリポジトリを作成しましょう。
名称は任意で大丈夫です!

スクリーンショット 2025-04-29 15.22.17.png

作成したら、画面右上に「プッシュコマンドを表示」ボタンがあります。
これを押下すると、何とECRにPushするところまで方法を案内してくれます!

スクリーンショット 2025-04-29 15.22.35.png

5. Kubernetes クラスタの準備

kubectl コマンドで Kubernetes クラスタに接続していることを確認します。
今回は、kind でクラスタを作成する方法を記載します。

$ kind create cluster

6. Helm を使ってデプロイ

helm を使って、Kubernetes 上に Go アプリケーションをデプロイします。
まずは、Helm チャートのテンプレートを作成し、values.yaml を編集します。

Helm Chartを作成する

$ helm create go-api

これで go-api/ ディレクトリができ、k8sリソースを作成するための
基本構成が入っています。

ディレクトリ構成例

go-api/
  Chart.yaml          # Chartの基本情報
  values.yaml         # デフォルトの変数
  templates/          # K8sマニフェスト(Helmテンプレート)
    deployment.yaml   # デプロイメント定義
    service.yaml      # サービス定義
    ...

values.yaml

values.yaml
replicaCount: 2

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

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

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-api
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: go-api
  template:
    metadata:
      labels:
        app: go-api
    spec:
      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. Kubernetes にデプロイ

次に、Helm を使って Kubernetes クラスタにデプロイします。

//「go-api」は任意で変えて大丈夫です
$ helm install go-api ./go-api

これで、Go アプリケーションが Kubernetes 上でデプロイされ、サービスが公開されます。

8. 動作確認

デプロイ後、以下のコマンドでリソースが正常にデプロイされているか確認します。
まずはPodが起動しているかをチェック。

pod起動確認

$ kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
go-api-cd454c75-jk6wv   1/1     Running   0          2s
go-api-cd454c75-vggtp   1/1     Running   0          2s

replicaCount

replicaCountで設定した値によって、作成されるPodの数が変わります!

アクセス確認

Service経由でアクセスできるか確認
(例:port-forward使ったり、Ingress設定等)

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

http://localhost:8080/test にアクセスしてみましょう!

スクリーンショット 2025-04-29 14.57.45.png

Goで実装したAPIで指定したメッセージが返却されていることを
確認できればOKです!

まとめ

今回は Goで実装したAPIを、Kubernetes にデプロイする方法を紹介しました。
これで、Go アプリケーションを簡単にスケーラブルな環境で運用できます!

k8sを個人開発で使用するための入門として、お役に立てれば幸いです!

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?