• 카테고리

    질문 & 답변
  • 세부 분야

    데브옵스 · 인프라

  • 해결 여부

    미해결

동일 VPC내 Private Subnet의 DB 접속 관련 문의

22.11.29 09:58 작성 조회수 260

1

안녕하세요.

쿠버네티스로 오랫동안 힘들어하다가 강사님의 강의로 많이 배우고 서비스 런칭도 준비 중인 개발자입니다.

 

제가 네이버 클라우드 플랫폼을 통해 쿠버네티스 서비스를 배포하던 중 통신관련 어려움이 있어 문의를 드립니다.

 

VPC 구성

  • 192.168.0.0/16

Subnet 구성

  • 서브넷1: Private, 192.168.0.0/24 - Load Balancer 용

  • 서브넷2: Public, 192.168.1.0/24 - DevOps 용

  • 서브넷3: Private, 192.168.2.0/24 - k8s 노드용

  • 서브넷4: Private, 192.168.3.0/24 - MongoDB용(설치가 아닌 구매형)

NAT 설치

  • Private 서브넷의 인터넷 접속을 위해 라우팅 설정

 

서브넷3에 nodejs로 개발한 frontend와 backend를 각각의 deployment와 service로 배포하였고 정상 동작을 확인했습니다.

다음으로, 서비스 노출을 위해 alb.nginx.ingress 컨트롤러를 설치하고 ingress를 배포했습니다. ingress를 배포하면 서브넷1에 자동으로 alb가 생성되고 frontend와 backend가 타겟으로 자동 연동되어 정상적으로 트래픽이 주입되는 것도 확인했습니다.

우선, 쿠버네티스를 선택하면서 가장 힘들었던 부분이 서비스 노출이었습니다. 플랫폼 마다 alb와 ingress 설정 부분이 상이했고, 특히 제가 사용하는 nCloud 쪽은 관련 자료도 많지 않았었느데 강사님의 강의가 정말 많은 도움이 되었습니다. 감사합니다.

처음에는 Atlas의 mongoDB를 연동해서 테스트를 진행했는데 정상적으로 DB 접속도 되어서 문제가 없었습니다.

이제 mongoDB도 nCloud에서 서비스하는 상품으로 변경하기 위해 private 타입은 서브넷4를 선택했습니다. nCloud의 경우 구매형 mongoDB도 VPC내에 설치하는 방식입니다.

mongoDB의 접속은 nCloud 내에서만 접속 가능한 private endpoint를 이용했습니다.

그랬더니 DB접속이 불가능했습니다.

혹시 몰라서 public 타입의 서브넷2에 임의의 인스턴스를 생성해서 backend(pod가 아닌 실제 소스코드)를 설치해서 db접속을 시도하니 정상 접속이 가능했습니다. 동일 VPC내 public SN의 인스턴스가 다른 private SN의 DB로의 접속은 원활하다는 것은 확인했습니다.

아마도 pod가 private 서브넷에 있어서 mongoDB의 endpoint를 resolution하지 못하는 것 같습니다. pod에 직접 접속해서 endpoint에 ping을 넣으면 bad address 에러가 반환됩니다.

dev@dev:~/REAL_VIS$ k exec -it backend-deployment-65b69f6649-h554c /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ping e80k8.vpc.mg.naverncp.com
ping: bad address 'e80k8.vpc.mg.naverncp.com'
/ # 

 

public 서브넷의 인스턴스에서 ping을 넣으면 응답을 하진 않지만 주소(192.168.3.6)가 resolution 되는건 확인했습니다.

root@devops:~# ping e80k8.vpc.mg.naverncp.com
PING e80k8.vpc.mg.naverncp.com (192.168.3.6) 56(84) bytes of data.
^C
--- e80k8.vpc.mg.naverncp.com ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4098ms

 

이런 경우에는 어떻게 해결을 해야할지 조언 부탁드립니다.

감사합니다.

답변 1

답변을 작성해보세요.

0

안녕하세요.

내용을 길게 써주셨지만, 제목과 같이 문제는 Private VPC간에 통신이 안된다는 말씀이죠?

일반적으로 그럴때 VPC Peering을 합니다.

https://guide-gov.ncloud-docs.com/beta/docs/networking-vpc-vpcuserscenario4

 

답변 감사드립니다.

 

제가 문의 드린 내용은 VPC간 통신이 아니고 동일 VPC내 서브넷간 통신이 안된다는 것입니다.

현재까지 추가로 테스트한 상황을 말씀드리면..

 

제가 배포한 파드에서 동일 VPC내 다른 서브넷에 위치한 mongodb를 접속하고자 하는 상황에서

몽고DB의 IP주소로 ping을 넣으면 응답이 옵니다.

하지만 몽고DB의 호스트네임(8e80k8.vpc.mg.naverncp.com)으로 ping을 넣으면 bad address가 반환됩니다.

아마도 호스트네임에 대한 resolution이 되지 않는 문제 같습니다.

추가로 파드가 존재하는 서브넷에 몽고클라이언트 파드를 배포하고 파드로 접속해서 테스트하면 IP와 호스트네임 모두 정상 응답하고 접속도 되는 상황입니다.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: mongo-client
  name: mongo-client
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo-client
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: mongo-client
    spec:
      containers:
        - image: mongo
          name: mongo-client
          env:
            - name: mongo-client_INITDB_ROOT_USERNAME
              value: "MKCARGLEDB"
            - name: mongo-client_INITDB_ROOT_PASSWORD
              value: "DPAZPDLZKRMFELQL0!"
---

 

 

아 동일 VPC 간이었군요,

저도 네이버 내부적인 통신 문제는 정확히 모르긴 합니다.

좀 찾아봤는데 아래 블로그 내용이 도움이 될 수 있겠네요.

https://brunch.co.kr/@topasvga/1401

 

하루 종일 답변 주시느라 고생이 많으십니다.

 

일단 손쉬운 해결법은 찾았습니다.

증상에 대해서 하나 하나 추적을 해가보니 결론적으로 제 파드 이미지가 같은 VPC내의 호스트네임의 resolution을 하지 못하는 것이 문제였습니다.

 

구글링을 하다보니 제가 사용한 alpine 이미지가 문제였습니다. node:16.16.0-alpine 이미지를 사용했었는데 알파인 이미지의 k8s 클러스터내에서 dns 쿼리를 제대로 처리 못하는 문제가 있다고 합니다.

그래서 우선은 알파인이 아닌 일만 16.16.0 이미지로 다시 빌드해서 테스트를 해보니 문제가 해결되었습니다.

그런데 이미지 사이즈가 많이 커지네요. 이 부분은 좀 더 찾아보면서 해결해야되겠습니다.

이 바닥은 하면 할수록 더 어려워지는군요. ㅎㅎ

친절한 답변 감사드리며 좋은 하루 되시기 바랍니다.

고생하셨습니다.

기본적으로 잘 하시는 분이시군요!