💡
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については以下の記事で入門向けに解説しているので、参考にしてください!
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 /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にデプロイしました。
- Goアプリの作成
- Dockerイメージのビルド&ECRプッシュ
- Helm Chartでk8sリソースを生成
- kindクラスタにデプロイして動作確認
個人開発でk8sに触れてみたい方の参考になれば嬉しいです!
次回はEKS版も執筆予定ですのでお楽しみに!
Discussion