簡単なアプリを作って、Kubernetesで動かしてみる
簡単なREST API(言語はGo)を作って、ローカル環境で構築したKubernetesで実行までします。
KubernetesでHello worldしたい方や、アプリをカスタマイズしてKubernetesの検証をしたい人にとって、参考になれば幸いです。
ゴール
- 簡単なREST APIのアプリを作成します
- Dockerイメージを作成、実行します
- Kubernetesに作成したアプリをデプロイします
環境
- Golang v1.22.4
- Rancher Desktop Version: 1.14.1
- Kubernetes Kubernetes: 1.29.5
- kubectl: v1.30.1
セットアップ
開発はMac(macOS Sonoma 14.5)で行っています。
インストールについては公式サイトなどを見るなどして、ご自身の環境に合わせてセットアップしてください。
Golangのインストール
ターミナルを立ち上げて、下記のコマンドを実行します。
brew install go
Ranchar Desktopのインストール
Docker Desktopでも開発はできますが、ライセンスの制約[1]に引っかかる可能性があるため、OSSのRancher Desktopを使います。
https://rancherdesktop.io/ にアクセスします。
インストールする環境に合わせてOSを選択して、クリックします。
ダウンロードされたアプリを開いて、インストールをします。
kubectlのインストール
ターミナルを立ち上げて、下記のコマンドを実行します。
brew install kubectl
簡単なREST APIのアプリを作成する
Go言語だけでもREST APIを作ることはできますが、カスタマイズすることを想定して、今回はREST APIのフレームワークであるGin[2]を使います。
appディレクトリを作成して、移動します。
mkdir -p web-service-gin/app
cd web-service-gin/app
モジュールを初期化します。
go mod init web-service-gin/app
Ginをダウンロードして、インストールします。
go get -u github.com/gin-gonic/gin
example.go
を作成して、下記コードを書きます。
touch app.go
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // 0.0.0.0:8080 でサーバーを立てます。
}
作成したコードを実行します。
go run app.go
Command + T
で新しいターミナルを起動して、curlをリクエストします。
curl http://localhost:8080/ping
下記のレスポンスが表示されたら、成功です。
{"message":"pong"}
Dockerイメージを作成、実行する
カレントディレクトリを1つ上の階層に移動します。
cd ../
Dockerfile
を作成して、下記のコードを書きます。
touch Dockerfile
FROM golang:1.22.4-alpine
WORKDIR /app
COPY ./app /app
# web-service-jinをビルドする
RUN go mod download
RUN go build -o app app.go
# web-service-jinを実行する
CMD ["./app"]
Rancher Desktopを起動します。
Dockerイメージをビルドします。
docker build . -t web-service-gin
Dockerイメージが作成されたか、確認します。
docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
web-service-gin latest aae769c13e3b About a minute ago 875MB
Dockerイメージを実行します。
docker run -p 8080:8080 -it web-service-gin:latest
Command + T
で新しいターミナルを起動して、curlをリクエストします。
curl http://localhost:8080/ping
下記のレスポンスが表示されたら、成功です。
{"message":"pong"}
Kubernetesに作成したアプリをデプロイする
manifestディレクトリを作成して、移動します。
mkdir manifest
cd manifest
マニフェストを作成して、下記のコードを書きます。
touch namespace.yaml
touch service.yaml
touch deployment.yaml
apiVersion: v1
kind: Namespace
metadata:
name: web-service-gin
apiVersion: v1
kind: Service
metadata:
name: web-service-gin-service
namespace: web-service-gin
spec:
type: ClusterIP
selector:
app: web-service-gin
ports:
- port: 3000
targetPort: 8080
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-service-gin-deployment
namespace: web-service-gin
spec:
replicas: 3
selector:
matchLabels:
app: web-service-gin
template:
metadata:
labels:
app: web-service-gin
spec:
containers:
- name: web-service-gin
image: web-service-gin
imagePullPolicy: Never # ローカルにあるDockerイメージを読み込む
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 8080
kubecltのconfigを rancher-desktop
に切り替えます。
kubectl config use-context rancher-desktop
作成したマニフェストを、ローカルのKubernetes上にデプロイします。
kubectl apply -f .
正しくリソースが作成されたか確認します。
kubectl get ns
NAME STATUS AGE
kube-system Active 13d
kube-public Active 13d
kube-node-lease Active 13d
default Active 13d
cert-manager Active 13d
spin-operator Active 13d
web-service-gin Active 16s
kubectl get svc -n web-service-gin
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-service-gin-service ClusterIP 10.43.122.105 <none> 3000/TCP 49s
kubectl get deployment -n web-service-gin
NAME READY UP-TO-DATE AVAILABLE AGE
web-service-gin-deployment 3/3 3 3 15s
port-forwardingを使って、Kubernetes上のPodにリクエストをします。
kubectl port-forward svc/web-service-gin-service -n web-service-gin 3000:3000
Command + T
で新しいターミナルを起動して、curlをリクエストします。
curl http://localhost:3000/ping
下記のレスポンスが表示されたら、成功です。
{"message":"pong"}
Discussion