GKE 에서 Google Cloud Loadbalancer 커스텀으로 사용하기

Harrison Jung
Dreamyoungs
Published in
7 min readJun 20, 2018

GKE에서 아니 정확히는 Kubernetes 에서 뭔가를 할때 가끔은 당연한 이야기지만 YAML 로 뭔가 하려면 가끔 메뉴얼에도 없는 내용을 다뤄야 하는 경우가 간혹 있다. 특히, 개별 클라우드 벤더에 맞춰져 있는 기능들은 Kube사이트는 물론이고 간혹 .. 벤더들이 설명을 업데이트 안해서 있는 기능도 못쓰는 경우가 간혹 있다. 그럴때는 YAML 없이, 혹은 기본 기능이 아니라 개별적으로 쓰고 싶은 경우가 있는데 어쨌던 그러한 이유로 시작한 내용.

GKE 에서 YAML을 이용해서 SSL인증서를 관리하려면 매우 힘들다. ( 명령어 매우 빡셈. ) 또한, GCLB에서 Cloud Storage 에 있는 Bucket을 Cloud CDN과 연결하려 했었는데.. 이게 자동으로 GKE가 롤백을 시켜서… 아무튼 이러한 이슈들이 간혹 있는데, 이럴때 어캐 해야 해서 조사를 시작했는데, 예전에 시도 했다가 다시 재도전해서 성공한 내용을 포스팅 한다.. ( 내가 해냈어.. )

먼저 Kubernetes를 준비한다. 시간이 조금 걸린다. 준비가 끝나면 [ 클러스터 만들기 ]를 선택하여 다음 화면으로 넘어간다.

먼저 이름을 입력하고, 우리는 테스트를 할거니까 제일 저렴한 “초소형 micro” 인스턴스를 선택한다. 스샷에서는 빠졌는데, 저렴한 “선점형 인스턴스"를 선택하는것도 하나의 좋은 방법이다. 단, 선점형의 경우 서버가 언제 갑자기 종료될지 모르므로 그 부분에 대한 대비책은 필요하다.

만들기를 누르면 꽤 오랜 시간이 걸려서 클러스터를 생성한다. 서버도 생성해야 하고, 클러스터 세팅도 해야 해서 그런지 시간이 매우 오래 걸린다.

임의의 NginX 작업부하( workload)를 하나 생성한다.

배포를 누르면 생성하는 화면으로 전환된다.

생성하고 난뒤 화면을 보면 기본적인 설정들이 보인다. 여기서 [ 노출 ] 을 눌러 새 서비스를 생성한다. 위의 작업을 눌러 선택해도 된다.

위와 같은 화면처럼 ‘노드 포트’를 선택한다. 해당 방식은 해당 서비스를 외부로 특정 포트를 통해 노출,연결 시킬 수 있게 해준다.

노출시키고 나면 위와 같은 결과를 볼 수 있다. 우리가 여기서 기억해야 할것은 노드 포트 32594 를 통해서 내부의 80 포트로 연결된다는 것이다. 이 부분에 대해서 조금 자세히 설명하면 docker는 기본적으로 내부 포트를 직접적으로 외부에서 연결이 불가능하다. 따라서 외부로 연결을 해야 사용이 가능한데, 그 작업의 결과물로 나온것이 32594 포트인것이다. 이 부분은 랜덤이므로 할때 마다 달라진다.

해당 작업까지 끝났으면 이제 Compute Engine 으로 가서 ‘인스턴스 그룹’을 본다. Kubernetes가 만든 인스턴스 그룹이 보인다.

해당 인스턴스 그룹으로 들어가면 위와 같은 형태의 화면을 볼 수 있는데, 당연하지만 Kubernetes가 대부분 알아서 관리한다. 우리는 여기서 ‘그룹 수정’을 통해서 해당 인스턴스 그룹의 포트 정보를 수정할것이다. 그룹 수정을 선택한다.

포트이름 매핑이 처음부터 있지는 않다. 더보기 형태로 있을껀데 눌러서 항목추가를 위와 같이 한다. 포트이름은 사실 아무래도 상관없다. 뒷부분에서 나올 이름과 맞추기만 하면 된다. 포트 번호는 앞에서 나왔던 포트 번호를 입력한다. 수정이 끝나면 저장을 한다.

다음으로 네트워크 서비스의 부하분산으로 간다. [ 부하 분산기 만들기 ] 를 선택한다.

HTTP(S)부하 분산을 선택하고 구성시작을 한다.

백엔드 구성에서 백엔드 서비스를 선택하고 새로운 백엔드 서비스 만들기를 선택한다.

적당한 이름을 입력한뒤, 아까 지정한 포트 이름을 입력한다. 새 백엔드에는 우리가 아까 설정한 인스턴스 그룹을 선택하고, 해당 포트번호는 물론 앞의 그 번호를 입력한다.

아래로 가면 고급 구성이 있다. 고급 구성을 선택하면 확장이 되는데 해당 부분에서 연결 드레이닝 제한 시간이 있는데 이 부분은 0 으로 한다. 이상하게 다른 숫자로 하면 에러가 나서…

그리고 상태확인 부분이 있는데 새로 만들어야 한다. 이름은 적당히 넣고, 프로토콜은 HTTP, 포트는 아까 그 포트 번호를 넣는다.

해당 부분까지 저장하고 나오면 이제 호스트및 경로 규칙이 있는데 이 부분은 그냥 한번씩 클릭만 해주면 만들기가 활성화 된다. 만들기를 누르자.

생성중…

아직 서버에 연결할 수 없다. 다만 여기서 우리는 IP:포트 가 35.241.23.89:80 라는것을 알 수 있다. 이 부분을 기억해 놓는다.

마지막으로 방화벽 규칙으로 간다. 현재 시스템이 동작하지 않는 이유는 방화벽때문인데, 해당 부분을 수정한다. 새로운 방화벽 규칙을 만든다. 우선순위는 제일 높게 하고, 적당한 이름을 넣는다.

대상은 네트워크의 모든 인스턴스로 한다. ( 사실 태그로 해서 모든 이 아니라 Kubernetes에 있는 인스턴스만도 가능하지만 우선은 적당히 넘어간다. 숙제로 남긴다. ) 소스필터는 IP로 하여 IP범위는 130.211.0.0/2235.191.0.0/16 로 한다. 해당 IP범위는 Google Cloud Loadbalancer의 IP범위이다. 다음 링크를 참고한다.

해당 부분까지 끝내고 저장을 하면, 잠시후에 아까 그 IP로 접속을 하면 다음 화면을 볼 수 있다.

이 화면 하나 보기가 이렇게 힘이 든다.

Update ( 2020–04–29 )
연결 드레이닝 시간은 최소 10초 정도로 하자. 연결이 마무리되고, 기존 서버를 정리하는데 필요한 최소 시간 정도로 이해하면 된다. 자세한건 링크

--

--