GolangアプリをKubernetesにDeployしてIngressで公開までしてみる【minikube&docker hubを利用】


以前に、DockerでサクッとGolangの環境作ってみたという記事を書いたGoのアプリをkubernetesで動かして、webブラウザで確認するところまでやってみる。

必要なもの

minikube v1.9.0
docker 19.03.8
dockerhubのアカウント

成果物

Docker Hubにリポジトリを作成する

docker hubのアカウントを作成し、リポジトリを作成する。
今回は以下のものがリポジトリの情報です。(publicなので、誰でも利用可です)
・アカウント名:takuya911
・リポジトリ名:go-kubernetes-sample

Dockerfileをビルドし、ImageをDocker Hubに登録する

前回の記事と同じ内容だが、念のためmain,goとDockerfileを載せておく

/Dockerfile
FROM golang:alpine
# フォルダ作成
RUN mkdir /app/
# 作成したフォルダ内にmain.goを配置
COPY . /app/
# 作業場所を/appに設定(main.goがある場所)
WORKDIR /app/
# main.goをbuild
RUN go build -o main . 
CMD ["/app/main"]
/main.go
package main

import (
    "fmt"
    "net/http"
)

func index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "golang api access")
}

func main() {
    http.HandleFunc("/", index)
    http.ListenAndServe(":80", nil)
}

Dockerfileをビルドして、imageを作成する。
docker hubのリポジトリ名と同じ名前のimage名になるようにする。

zsh
$docker build -t takuya911/go-kubernetes-sample:1 .
....
Successfully built 74ed57aa2c28
Successfully tagged takuya911/go-kubernetes-sample:1

ビルドに成功したら、次はImageをDocker Hubにpushする。
Docker HubはDocker Imageを管理するためのモノ。

zsh
$docker push takuya911/go-kubernetes-sample:1
....
1: digest: sha256:76487a1e6dc32faf94cb845ee9894c024340885e22432090304c870ce29b1d79 size: 1992

今回はbuild時にtagとして1を設定しているので、Docker Hubのtagが1になっていることを確認する。

Kunernetesでアプリを動かす

Docker Hubに登録したImageを取得し、Kubernetesにdeployする。
まずはminikubeを起動する。

zsh
$minikube start
....
Done! kubectl is now configured to use "minikube"

インフラをコードで管理するのが今時(カッコいい)ので、deployしたい内容が記載されたyamlファイルを生成する。

zsh
$cd manifest
$kubectl create deploy go-sample --image takuya911/go-kubernetes-sample:1 -o yaml --dry-run=client > deployment.yaml

すると、deployment.yamlが生成されている。

/manifest/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: go-sample
  name: go-sample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-sample
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: go-sample
    spec:
      containers:
      - image: takuya911/go-kubernetes-sample:1
        name: go-kubernetes-sample
        resources: {}
status: {}

yamlファイルをapplyする

zsh
$kubectl apply -f deployment.yaml
deployment.apps/go-sample created

ちゃんと動いていることを確認する。

zsh
$kubectl get deploy,rs,po
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/go-sample   1/1     1            1           25s

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/go-sample-66b5fb64f6   1         1         1       25s

NAME                             READY   STATUS    RESTARTS   AGE
pod/go-sample-66b5fb64f6-p6sn8   1/1     Running   0          25s

Ingressを使って、Goアプリを公開する

Kubernetes上で動かすことはできたけれど、やっぱりwebブラウザからgoが動いていることを確認したい。クラスタ外からクラスタ内のアプリにアクセスするための方法としては、以下の3つがある。

  • Node Portを使う
  • 外部ロードバランサーを使う
  • Ingressを使う

Ingressがよく使われている&yamlで管理できるので、今回はIngressを使う。
ingressでサービスを公開する際にはserviceも必要になる。以下参考記事。
https://qiita.com/Esfahan/items/f7d13d7e80848e9b6963

なのでserviceとingressを作成していく。

まず、minikubeのIngressのaddonを有効にする。

zsh
$minikube addons enable ingress
🌟  The 'ingress' addon is enabled

次にserviceを作成していく。

/manifest/service.yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: go-sample
  name: go-sample
spec:
  type: NodePort
  ports:
  - protocol: TCP
    port: 7000
    targetPort: 80
  selector:
    app: go-sample
status:
  loadBalancer: {}
/manifest/ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: go-sample
spec:
  rules:
  - host: 
    http:
      paths:
      - path: 
        backend:
          serviceName: go-sample
          servicePort: 7000

service.yamlとingress.yamlをdeployする。

zsh
$kubectl apply -f .                                                                           
deployment.apps/go-sample configured
ingress.extensions/go-sample created
service/go-sample created

しばらく待ってからingressの情報を表示するコマンドを実行すると、ipが振られているのでそのipを確認する。

zsh
$kubectl get ing   
NAME        CLASS    HOSTS   ADDRESS        PORTS   AGE
go-sample   <none>   *       192.168.64.3   80      4m39s

実際にingressで割り振られたipアドレスにアクセスすると、main.goのindexメソッドの実行結果が帰ってくる

ここまでで、GolangのアプリのImageをDocker Hubに登録し、そのImageを使ってアプリをkubernetesにデプロイ&外部公開までが完了です。