쿠버네티스를 실습하기 위해 Go를 활용해 컨테이너를 작성해 보겠다.
구글에서 개발한 프로그래밍 언어로 쿠버네티스와 함께 빠르게 성장하고 있는 프로그래밍 언어라고 한다.
Go의 사용법에 대해서 이번 글에서 자세하기 다루지 않고 추후에 go를 공부할 기회가 생기게 된다면 이에 대해서 조금 정리해볼 생각이다.
우분투 환경에선 다른 앱과 비슷하게 apt install 명령어를 통해 설치할 수 있다
sudo apt install golang
맥에서는 홈브루를 사용하면 마찬가지로 매우 쉽게 설치할 수 있다.
brew install golang
윈도우에서도 golang의 공식 홈페이지에서 다운로드 받을 수 있다고 한다.
간단하게 hostname을 출력해주는 어플리케이션을 아래와 같이 제작하였다.
package main
import (
"fmt"
"github.com/julienschmidt/httprouter"
"log"
"net/http"
"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))
}
이 어플리케이션을 실행하기 위해선 httprouter 패키지를 깃헙에서 다운 받아줘야 하는데 아래 명령어를 실행해서 받을 수 있다.
go get github.com/julienschmidt/httprouter
그리고 아래 명령어를 통해 어플리케이션을 빌드해준다.
go build main.go
해당 어플리케이션을 실행하면 정상적으로 8080 포트에 실행이 되는 것을 확인할 수 있다.
Docker을 활용해 이미지화 하려면 dockerfile을 생성하는 것이 필요하다.
작업을 하고 있는 디렉토리에 아래와 같은 dockerfile을 생성해준다.
FROM golang:1.11
WORKDIR /GolandProjects/awesomeProject
Copy main /GolandProjects/awesomeProject
CMD ["/GolandProjects/awesomeProject/main"]
그 후 docker build 명령어를 통해 이미지를 생성해준다.
sudo docker build -t http_go .
해당 이미지를 활용해 컨테이너를 실행해보겠다.
sudo docker run -d -p 8080:8080 --rm http_go
정상적으로 실행이 되는 것을 확인할 수 있다.
Dockerhub에 해당 이미지를 푸시해 보겠다
sudo docker login
sudo docker tag http_go therealslimadam/http_go
sudo docker push therealslimadam/http_go
전에 만들어 두었던 GCP의 쿠버네티스 클러스터에 접속하여 작성했던 main.go를 실행해 보겠다.
우선 클러스터에 go를 설치한다
sudo apt install golang
다음은 vim을 통해 작성해 두었던 main.go를 복사 붙여넣기 해준다.
vim main.go
GCP에도 역시 전처럼 깃헙에서 패키지를 받아준다.
go get github.com/julienschmidt/httprouter
로컬과 동일하게 main.go를 빌드해준다.
go build main.go
아래 커맨드로 빌드한 파일을 실행한다
./main
GCP 쉘에서 '웹 미리보기'라는 버튼이 존재하는데 이를 통해 8080 포트에서 실행되고 있는 프로그램을 열 수 있다.
http_go라는 디렉토리를 만들고 빌드 된 파일을 옮긴 뒤 dockerfile을 실행해 보겠다
mkdir http_go
mv main ./http_go/
cd http_go/
vim dockerfile
도커파일은 아래와 같다
FROM golang:1.11
WORKDIR /usr/src/app
COPY main /usr/src/app
CMD ["/usr/src/app/main"]
이미지를 빌드해 준다
docker build -t http-go .
컨테이너를 실행 시켜준다
docker run -d -p 8080:8080 --rm http-go
마찬가지로 웹 미리보기에서 해당 컨테이너가 정상적으로 실행 된 것을 확인할 수 있다.
도커허브에 푸시를 하도록 하겠다
먼저 도커허브에 로그인을 한 후 이미지의 tag를 변경해준다.
docker login
docker tag http-go therealslimadam/http-go
그 후 푸시 명령어로 푸시를 해준다.
docker push therealslimadam/http-go
정상적으로 도커허브에 푸시 된 것을 확인할 수 있다.
도커허브에 올려놓은 이미지를 활용해 GCP 클러스터에 pod을 생성해 보겠다.
kubectl create deploy http-go --image=therealslimadam/http-go
외부로 pod을 노출해 보겠다
kubectl expose deployment http-go --type=LoadBalancer --port=80 --target-port=8080
아래 명령어를 통해서 pod의 갯수를 조절하는 replicaset을 조정할 수 있다.
예시로 3개의 pod이 배포될 수 있게 3으로 설정하겠다
kubectl scale deployment http-go --replicas=3
정상적으로 반영이 된 것을 확인 할 수 있다.
서비스의 외부IP를 사용해 접속을 해보면 로드밸런싱이 정상적으로 되는 것 역시 확인 가능하다.