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

## 概要
Goで実装したAPIを Kubernetes（k8s）上にデプロイする方法を紹介します！

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

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

## 前提条件
- Go 言語の開発環境が整っていること
- Docker と Kubernetes（k8s）がインストールされていること
- AWS ECR（Elastic Container Registry）へのアクセス権限があること

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

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

https://qiita.com/railgun-0402/items/b129ea98f9bb3ae80565

## 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")
}
```

:::note warn
### 注意
今回はk8sにデプロイすることがメインなので、Goの解説はしないです！
（気になる方はChatGPTに聞いていただけたら！）
:::

## 2. Dockerfile の作成

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

```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"]
```

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


## 3. Docker イメージをビルド

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

```bash
$ docker build -t my-go-api .
```

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

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

### ECR にリポジトリを作成

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

![スクリーンショット 2025-04-29 15.22.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/e23b8a53-6ee0-4bab-b597-277c5e1c5052.png)


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

![スクリーンショット 2025-04-29 15.22.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/d62754b4-87b6-421f-8940-0ebd968f0f6b.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
```

:::note info
### 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/637e0224-427b-421f-b1b4-67266fcfe976.png)


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

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

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