Golang 앱을 Kubernetes에 Deploy하고 Ingress에서 공개까지 해 본다 [minikube&docker hub를 이용]

이전에, Docker로 Sakut과 Golang의 환경을 만들어 보았습니다. 라고 하는 기사를 쓴 Go의 앱을 kubernetes로 움직여, 웹 브라우저로 확인하는 곳까지 해 본다.

필요한 것



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을 빌드하여 이미지를 만듭니다.
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이 되어 있는 것을 확인한다.


Kubernetes로 앱 이동



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에서 움직일 수는 있었지만 역시 웹 브라우저에서 go가 움직이고 있는지 확인하고 싶습니다. 클러스터 외부에서 클러스터 내의 앱에 액세스하는 방법으로는 다음 3가지가 있다.
  • 노드 포트 사용
  • 외부 로드 밸런서 사용
  • Ingress 사용

  • Ingress가 자주 사용되고 있는 &yaml로 관리할 수 있으므로, 이번은 Ingress를 사용한다.
    ingress로 서비스를 공개할 때에는 서비스도 필요하다. 아래 참고 기사.
    htps : // 이 m / 에 s 훗 암 / ms / f7d13d7 80848 9b6963

    그래서 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에 배포 및 외부 게시까지 완료되었습니다.

    좋은 웹페이지 즐겨찾기