🌅

簡単なアプリを作って、Kubernetesで動かしてみる

2024/06/25に公開

簡単なREST API(言語はGo)を作って、ローカル環境で構築したKubernetesで実行までします。
KubernetesでHello worldしたい方や、アプリをカスタマイズしてKubernetesの検証をしたい人にとって、参考になれば幸いです。

ゴール

  • 簡単なREST APIのアプリを作成します
  • Dockerイメージを作成、実行します
  • Kubernetesに作成したアプリをデプロイします

https://github.com/d-zenju/web-service-gin

環境

  • 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を選択して、クリックします。
ダウンロードされたアプリを開いて、インストールをします。

Rancher Desktop HP

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
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
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を起動します。

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
namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: web-service-gin
service.yaml
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
deployment.yaml
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
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
kubectl get svc
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
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"}
脚注
  1. https://www.docker.com/ja-jp/pricing/ ↩︎

  2. https://github.com/gin-gonic/gin ↩︎

Discussion