///
Search
🛫

04.쿠버네티스에서 Go lang 기반 앱 실행시키기

요약!

출처
소스코드
package main import ( "fmt" "github.com/julienschmidt/httprouter" "net/http" "log" "os" ) func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { hostname, err := os.Hostname() if err == nil { fmt.Fprint(w, "Welcome! " + hostname +"\n") } else { fmt.Fprint(w, "Welcome! ERROR\n") } } func main() { router := httprouter.New() router.GET("/", Index) log.Fatal(http.ListenAndServe(":8080", router)) }
Go
복사
빌드방법 요약
apt install golnag : 고 랭기지를 설치
go get : 외부 라이브러리 임포트
go build : main go 를 빌드하여 main 파일 생성
main : 명령 실행 후 정상 동작하는 지 테스트
dockerfile 패키징
FROM golang 1 11 버전의 컨테이너 이미지를 사용
로컬 디렉터리의 main 파일을 이미지의 usr src /app 디렉터리에 동일한 이름으로 추가
이미지를 실행할 때 usr src /app/main 실행
FROM golang:1.11 WORKDIR /usr/src/app COPY main /usr/src/app CMD ["/usr/src/app/main"]
Go
복사

시작!

아래의 명령어 검색
vim main.go
Go
복사
vim이 없을 경우 설치
apt install vim
Go
복사
그리고 아래의 소스코드를 복사하고 붙여넣기
package main import ( "fmt" "github.com/julienschmidt/httprouter" "net/http" "log" "os" ) func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { hostname, err := os.Hostname() if err == nil { fmt.Fprint(w, "Welcome! " + hostname +"\n") } else { fmt.Fprint(w, "Welcome! ERROR\n") } } func main() { router := httprouter.New() router.GET("/", Index) log.Fatal(http.ListenAndServe(":7080", router)) }
Go
복사
esc 키 눌러서 모드를 변경 후 그리고 shift 누르고 : 버튼 누른다음 wq 작성한다.
예시
그리고 ENTER 키 누르기
go를 실행시키기 위해서 go lang 설치 진행(오래 걸릴수 있음)
sudo apt-get install golang
Go
복사
github에서 레포지토리 다운을 받기위한 작업 수행
go get github.com/julienschmidt/httprouter
Go
복사
그다음에 빌드하기
go build main.go
Go
복사
main이라는 이름을 가진 go 파일을 실행시키기
./main
Go
복사
firefox 브라우저를 열어서 주소창에 아래처럼 검색
http://127.0.0.1:7080/
Go
복사
예시화면
아래서 부터는 도커를 빌드하기 위한 작업이다.
mkdir http_go mv main ./http_go/ cd http_go vim dockerfile
Go
복사
도커 파일 내용은 아래와 같다.
FROM golang:1.11 WORKDIR /usr/src/app COPY main /usr/src/app CMD ["/usr/src/app/main"]
Docker
복사
저장하고 나서 docker를 실행해준다.
docker build -t htttp-go .
Docker
복사
실행 콘솔화면
root@master:~/http_go# docker build -t htttp-go . Sending build context to Docker daemon 6.693MB Step 1/4 : FROM golang:1.11 1.11: Pulling from library/golang 4ae16bd47783: Pull complete bbab4ec87ac4: Pull complete 2ea1f7804402: Pull complete 96465440c208: Pull complete 16a3d8aca6cd: Pull complete 3a62db25bdbe: Pull complete 8c47c6b16c60: Pull complete Digest: sha256:e972c78795b22d5cfab02ac410aa2305fcc036319a7af51065d1af583cd3ec04 Status: Downloaded newer image for golang:1.11 ---> 43a154fee764 Step 2/4 : WORKDIR /usr/src/app ---> Running in 05b6278c0a8c Removing intermediate container 05b6278c0a8c ---> fc354985a27f Step 3/4 : COPY main /usr/src/app ---> 08d2c642fb61 Step 4/4 : CMD ["/usr/src/app/main"] ---> Running in 579117bcec05 Removing intermediate container 579117bcec05 ---> dd490d72f14f Successfully built dd490d72f14f Successfully tagged htttp-go:latest root@master:~/http_go#
Docker
복사
도커 실행
docker run -d -p 7080:7080 --rm htttp-go
Docker
복사
firefox 브라우저를 열어서 주소창에 아래처럼 검색
http://127.0.0.1:7080/
Go
복사
실행화면 (밑줄 부분은 도커 호스트 네임)
호스트 네임 보는법
root@master:~/http_go# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d23da2855b7d htttp-go "/usr/src/app/main" About a minute ago Up About a minute 0.0.0.0:7080->7080/tcp elated_wilson
Docker
복사

도커로 배포까지 하기(예시 도커아이디는 yklovejesus)

docker tag htttp-go yklovejesus/htttp-go docker login
Docker
복사
로그인까지 완료 했으면 push 작업 수행
docker push yklovejesus/htttp-go
Docker
복사

Go로 만든 컨테이너를 쿠버네티스에 올리기

실행터미널 환경 : master노드에서 일반 화면
명령어
kubectl create deployment htttp-go --image=yklovejesus/htttp-go
Docker
복사
정상적으로 실행 되었으면 아래의 명령어를 쳐서 하위의 pod을 확인한다.
kubectl get deploy kubectl get rs kubectl get pod
Go
복사
실행화면
server1@master:~$ kubectl create deployment htttp-go --image=yklovejesus/htttp-go deployment.apps/htttp-go created server1@master:~$ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE htttp-go 0/1 1 0 29s server1@master:~$ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE htttp-go 1/1 1 1 2m11s server1@master:~$ kubectl get rs NAME DESIRED CURRENT READY AGE htttp-go-797d679bb8 1 1 1 2m11s server1@master:~$ kubectl get pod NAME READY STATUS RESTARTS AGE htttp-go-797d679bb8-l7pzm 1/1 Running 0 2m19s nginx 1/1 Running 0 15h server1@master:~$
Go
복사
htttp-go를 노출시킬수 있도록 한다.
kubectl expose deployment htttp-go --port=7080 --target-port=7080 --type=LoadBalancer
Go
복사
kubectl get svc를 통해 확인해보자
server1@master:~$ kubectl expose deployment htttp-go --port=7080 --target-port=7080 --type=LoadBalancer service/htttp-go exposed server1@master:~$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE htttp-go LoadBalancer 10.100.116.253 <pending> 7080:31637/TCP 13s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h server1@master:~$
Go
복사
(작성하면 안됨) 혹시라도 잘못 만들었으면 아래의 명령어로 해결하자
kubectl delete deploy htttp-go
Go
복사
htttp-go가 pending이 되다가 external-ip를 뿌려줄텐데 실시간으로 확인하려면 아래의 명령어로 확인하자
server1@master:~$ kubectl get svc -w NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE htttp-go LoadBalancer 10.100.116.253 <pending> 7080:31637/TCP 13s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h
Go
복사
그러다가 EXTERNAL-IP 부분에 숫자가 나오면 그걸 복사해서 붙여넣고 :7080포트로 접속을 수행한다.
CLUSTER-IP에 적힌 주소로 접속해도 똑같이 go web을 사용할 수 있다.
URL 명
10.100.116.253:7080
Go
복사