概要
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 を作成します。
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")
}
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にリポジトリを作成しましょう。
名称は任意で大丈夫です!
作成したら、画面右上に「プッシュコマンドを表示」ボタンがあります。
これを押下すると、何とECRにPushするところまで方法を案内してくれます!
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
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
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
アクセス確認
Service経由でアクセスできるか確認
(例:port-forward使ったり、Ingress設定等)
$ kubectl port-forward service/go-api 8080:80
→ http://localhost:8080/test にアクセスしてみましょう!
Goで実装したAPIで指定したメッセージが返却されていることを
確認できればOKです!
まとめ
今回は Goで実装したAPIを、Kubernetes にデプロイする方法を紹介しました。
これで、Go アプリケーションを簡単にスケーラブルな環境で運用できます!
k8sを個人開発で使用するための入門として、お役に立てれば幸いです!