간단한 golang 어플을 도커 이미지를 사용해서 배포하려 한다.(배포는 kubernetes 를 사용한다)

docker hub 등 온라인 방식으로 해도 되지만, microk8s 의 registry 서비스를 이용한다.
방법은 그리 어렵지 않다.  https://microk8s.io/docs/registry-built-in 를 참조 한다.

일종의 registry 서비스를 로컬에 가동하여 도커 이미지를 등록 하는 것이다.

1. 이미지 빌드

$ sudo docker build . -t localhost:32000/prod-api:registry

Sending build context to Docker daemon  4.608kB
Step 1/6 : FROM golang:latest
latest: Pulling from library/golang
dc65f448a2e2: Pull complete 
346ffb2b67d7: Pull complete 
dea4ecac934f: Pull complete 
8ac92ddf84b3: Pull complete 
7ca605383307: Pull complete 
f47e6cebc512: Pull complete 
530350156010: Pull complete 
Digest: sha256:fe6b1742d48c4d6d360c6fac1e289e8529aaab924fa0e49a330868be50c0f2f4
Status: Downloaded newer image for golang:latest
 ---> 297e5bf50f50
Step 2/6 : RUN mkdir /app
 ---> Running in 2a6795d86353
Removing intermediate container 2a6795d86353
 ---> 541dbb10344e
Step 3/6 : ADD . /app/
 ---> c60e6e741cb4
Step 4/6 : WORKDIR /app
 ---> Running in 5de0b590c65d
Removing intermediate container 5de0b590c65d
 ---> 24c7788d1b8e
Step 5/6 : RUN go build -o main .
 ---> Running in 5e44a7f53909
Removing intermediate container 5e44a7f53909
 ---> 56462a496eac
Step 6/6 : CMD ["/app/main"]
 ---> Running in bdde4584ff89
Removing intermediate container bdde4584ff89
 ---> dbba71be4f83
Successfully built dbba71be4f83
Successfully tagged localhost:32000/prod-api:registry

등록체크 

$ sudo docker images

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
localhost:32000/prod-api   registry            dbba71be4f83        5 minutes ago       810MB

 

2. 이미지 registry 등록

$ sudo docker push localhost:32000/prod-api

The push refers to repository [localhost:32000/prod-api]
44006ff06569: Pushed 
203febf79d4f: Pushed 
2ec821486852: Pushed 
cae11887bc90: Pushed 
729c3ac48990: Pushed 
8378cd889737: Pushed 
5c813a85f7f0: Pushed 
bdca38f94ff0: Pushed 
faac394a1ad3: Pushed 
ce8168f12337: Pushed 
registry: digest: sha256:7c8fe99287f680f23e611c4113834c5c8343aa102a49a3584a65888205604609 size: 2420

 

3. kubernetes 로 배포

배포코드는 https://github.com/yusufkaratoprak/kubernetes-gosample 를 참조

$ vi config/deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prod-api-dep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prod-api
  template:
    metadata:
      name: prod-api
      labels:
        app: prod-api
    spec:
      containers:
      - name: prod-api-dep
        image: localhost:32000/prod-api:registry
        ports:
        - containerPort: 8090

$ vi config/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: prod-api-service
spec:
  selector:
    app: prod-api
  ports:
    - name: http
      protocol: TCP
      port: 8070
      targetPort: 8090
  externalIPs:
    - 192.168.0.111

배포/가동 : kubectl apply -f config/

$ curl 192.168.0.111:8070  으로 체크

추후 LoadBalance 로 설정 - golang 파드는  replicas 로 여러대로 동작

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

쿠버네티스를 세팅하면서 최종 하려는 목적은  mongodb + golang API 앱 이다.

몽고디비 replica set + golang 도 pod 를 5개 이상 띄워서 REST API 를 서비스하려는 것이다.

현재는 쿠버네티스 로컬에 microk8s 로 간단하게 세팅해서 구성중이다.
다른 언어로 해도 되는데, go 로 굳이 하려는 이유는 딱히 없지만, 이유를 찾아보자면
go 가 클라우드 친화적(?)이라고 느껴서 이다. (쿠버네티스 도 아마 go 로 많이 작성되어 있는 것으로 알고 있다)

작성하려는 것은 대단한 앱은 아니지만, 개발환경을 구성해야 한다. 간단히 정리해본다

1. golang 설치 - 우분투(kubernetes) / MacOS (개발환경)
https://golang.org/doc/install 를 참조하면 된다.
특이한점은 GOPATH 라는 특이한 규칙(?)이 있다.
gopath 를 설정하고 ( work / workspace 등 - 본인이 편한대로 ) , 소스 src , bin 등의 규칙이 있다.
개인 소스를 src/github.com/{깃헙아이디}/프로젝트명  형태로 작업한다.
src/github.com/1day1/hello 같은식

git run github.com/1day1/hello 

형태로 실행할 수 있다.

2. vscode 설치 - MacOS (생략)
https://code.visualstudio.com/download

3. vscode 에서 확장/플러그인 extension 설치 (go 로 검색)
https://code.visualstudio.com/docs/languages/go

4. 추후 vscode 에서 필요한 설정 ( 아마도 sftp 연결 / git 세팅 등이 될 듯 하다)

keyboard shortcut 설정

  • reveal in Side bar : cmd + shift + R 
  •  

go 확장 - gopath 설정 ( setting.json )

  • "go.gopath": "/Users/onedayone/go-apps"

 

[필요하면 계속 추가]

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,