• 카테고리

    질문 & 답변
  • 세부 분야

    데브옵스 · 인프라

  • 해결 여부

    미해결

질문입니다.

20.01.13 13:34 작성 조회수 191

1

안녕하세요 매번 좋은 강의 감사합니다. 

쿠버네티스를 활용하여 여러가지 공부를 하고있습니다.

이번에 문제는 파이썬 flask를 활용하여 웹서버를 구축하는 와중에 발생한 문제인데요

간단하게 두개의 파이썬 파일이 있고 한 개는 python flask 웹서버이고 다른 한 개는 이 웹서버로 post method를 보내는 파이썬 파일입니다.

로컬에서 실행했을 때 올바르게 실행되었습니다.

이제 이걸 docker hub에 이미지를 올려서 웹서버는 deployment로 post로 request요청을 보내는 코드는 job으로 실행을 했습니다.

컨테이너가 생성되었고 completed상태까지 되었지만 데이터가 post로 전달되지가 않습니다.

kubectl logs로 pod를 확인해본 결과 응답코드도 200으로 알맞는데 전달이 안됩니다.

기존에 바꾼코드라고는 post에서 요청할 때 url을 서비스명으로 바꾼거밖에 없는데 로컬에서는 되고 쿠버네티스 클러스터 상에서는 되지가 않으니 당황스럽습니다.

혹시 로컬에서는 되고 쿠버네티스에서 실행하면 안되는 경우가 있는지 여쭤보려고 질문드립니다.

읽어주셔서 감사합니다.

답변 9

·

답변을 작성해보세요.

1

감사합니다! 무슨원리인지는 모르겠지만 말씀하신대로 했더니 해결했습니다! 

print에 flush하나만 적용했을 뿐인데 참 신기하네요...

쿠버네티스에 대한 문제가 아니었네요... 

너무너무 감사합니다! 

1

저도 파이썬을 해보지 않아서 잘은 모르겠지만

지금 좀 찾아보니 출력을 찍을때 flush로 하라는 내용들이 있네요.

https://stackoverflow.com/questions/230751/how-to-flush-output-of-print-function

https://blog.naver.com/bluedrugs/221564177283

보시고 한번 적용해보시겠어요?

1

네 맞습니다!  ㅠㅠ

문제는 로컬에서 했을 때는 잘 되는데 쿠버네티스상에 올리니까 안되는게 문제입니다 ㅠㅠ

1

다시 어떤점이 문제 인지 정리 해볼께요.

Job(pod) -> Deployment(pod) 로 Reqeust를 보내는데 현재 통신은 문제가 없고,

실행측[Job(pod)]에서도 아래와 같은 메세지를 찍으면서 잘 Request가 됐다고 Log가 나오고요.

받는측[Deployment(pod)]에서도 아래 메세지를 찍으면서 정상적으로 응답을 받은것 같은데

받는측[Deployment(pod)]에 소스코드에 print 로 코딩해놓은 부분이 표시가 안되서 먼가 문제가 있는것 같다는 질문이신건가요? 

1

우선 코드에서 extraction1 으로 request를 보내셨는데 1과 2 는 예전에 실험한 get method할 때 쓰던 url입니다.

extraction3가 post url입니다.

리퀘스트 데이터는 다소 복잡합니다. 

총 세 개의 데이터를 보내는데

    carlist = json.dumps(carList, cls=NumpyEncoder)

    cardataframe = df_service.to_json()

    cardict = json.dumps(col_dict)

    data = {'carlist':carlist, 'cardataframe':cardataframe, 'cardict':cardict}

    res = requests.post('http://extraction-svc:3000/extraction3', data=data)

    #res = requests.post('http://127.0.0.1:3000/extraction3', data=data)

이런식으로 보냅니다. carllist는 list형식이구요 cardataframe은 dataframe형식 cardict은 딕셔너리 형식입니다.

외부의 DB에서 쿼리해 온 데이터를 전송하고 있습니다.

이런식으로 파일을 실행하면 올바르게 실행이 되었다면 웹서버 쪽에서는 제가 전송된 데이터를 확인할 수 있는 print문을 넣어놨기 때문에

<__main__.Influx_Request3 object at 0x7fa13893fb70>

["01225797283", "01225797281", "01225797051", "01225797289", "01225797226", "01225797182", "01225797272", "01225797057", "01225797282", "01225797121", "01225797185", "01225797047", "01225797285", "01225797009", "01225797044", "01225797038", "01225797032", "01225797251", "01225797239"]

args

=========== 1 / 19 calc_01225797283 ===========

=========== 2 / 19 calc_01225797281 ===========

=========== 3 / 19 calc_01225797051 ===========

=========== 4 / 19 calc_01225797289 ===========

=========== 5 / 19 calc_01225797226 ===========

=========== 6 / 19 calc_01225797182 ===========

=========== 7 / 19 calc_01225797272 ===========

=========== 8 / 19 calc_01225797057 ===========

=========== 9 / 19 calc_01225797282 ===========

=========== 10 / 19 calc_01225797121 ===========

=========== 11 / 19 calc_01225797185 ===========

=========== 12 / 19 calc_01225797047 ===========

=========== 13 / 19 calc_01225797285 ===========

=========== 14 / 19 calc_01225797009 ===========

=========== 15 / 19 calc_01225797044 ===========

=========== 16 / 19 calc_01225797038 ===========

=========== 17 / 19 calc_01225797032 ===========

=========== 18 / 19 calc_01225797251 ===========

=========== 19 / 19 calc_01225797239 ===========

이런 식으로 메시지가 출력되어야합니다.

실행시키는 쪽에서는 

query time:  132.73867535591125 sec

request success

이런식으로 메시지가 출력이 됩니다.

친절한 답변 너무 감사합니다. 막막하던 와중에 큰 도움이 되주셔서 감사합니다. 

1

Pod IP나 Servicer의 IP로 아래와 같이 응답이 오는걸 보면 Deployment로 만들어진 Pod와 통신상에 문제는 없어 보이는데 정확한 Post URL이나 Request 데이터가 어떻게 되나요?

그냥 ip:3000 만 post로 던지면 데이터가 와야하나요?

1

친절한 답변감사합니다. 송구스럽습니다만 yaml 파일을 한 번 첨부해봅니다.

이건 data를 전송하는 python파일을 실행시키는 pod를 실행시키는 job에 관한 yaml파일입니다.

```

apiVersion: batch/v1

kind: Job

metadata:

  name: analysis-mongo

spec:

  template:

    metadata:

      labels:

        app: analysis-mongo

    spec:

      containers:

      - name: analysis

        image: (이미지는 개인적인 이유로 삭제하겠습니다.)

        ports:

        - containerPort: 80

      restartPolicy: Never

```

밑에 해당 yaml파일은 flask웹서버를 실행시키는 Deployment에 관한 yaml파일입니다.

서비스에 관한 것도 같이 적혀있구요 서비스에대한 port를 3000으로 열었고 타겟 port도 pod의 port번호인 3000으로 연결해주었습니다.

```

apiVersion: apps/v1

kind: Deployment

metadata:

  name: analysis-extraction

spec:

  selector:

    matchLabels:

      app: analysis-extraction

  replicas: 1 

  template:

    metadata:

      labels:

        app: analysis-extraction

    spec:

      containers:

      - name: analysis

        image: (이미지는 개인적인 이유로 삭제하겠습니다.)

        ports:

        - containerPort: 3000

---

apiVersion: v1

kind: Service

metadata:

  name: extraction-svc

spec:

  type: ClusterIP

  selector:

    app: analysis-extraction

  ports:

  - port: 3000

    targetPort: 3000

```

dockerfile에 port expose한 부분에 문제가 있을까 싶어 확인해봤지만 알맞게 expose 3000으로 되어있었습니다.

로컬에서 127.0.0.1:3000으로 요청을 보내면 post메소드를 처리하는 과정이 올바르게 수행되는데

쿠버네티스 상에서 서비스 명으로 요청을 보내면 post메소드를 받는다는 응답코드 200은 return이 되지만 안에 내용이 실행되지가 않습니다. 

긴 글 읽어주셔서 감사합니다.

0

네 수고하셨습니다^^

0

안녕하세요!

로컬에서는 되고 쿠버네티스에서는 안될 일반적인 경우는 딱히 없습니다^^

지금 상황에서는 어느 부분에서 안되는건지 단계별로 체크를 해볼 필요가 있겠네요.

보통 실제 App에서 설정된 Pod와 Pod 설정시 Port, Service 설정시 TargetPort등이 잘못 매핑되서 연결이 안되는 경우가 많습니다. 

만약 Job(Pod)에서가 아닌 직접 Deployment(Pod)에 API를 날렸을때는 해당 서비스에 응답이 오나요?

안온다면 Port매핑부분을 다시 확인해보면 좋을듯 싶고요.

직접  Deployment(Pod)에 API날렸을때 잘 된다면, 이번엔 Job(Pod)쪽을 의심해봐야 할꺼고요.

이렇듯 쿠버네티스라고 해서 크게 안될만한 이유는 없고 저라도 기본적인 부분들을 다시 체크해볼것 같아요.

정 안되면 해당 yaml파일들을 보내주시면 저도 시간될때 보고 같이 검토해볼께요.

감사합니다~!