Kubernetes 서비스가 다른 작업자의 Pod에 액세스할 때 시간 초과됨

Kubernetes 서비스가 다른 작업자의 Pod에 액세스할 때 시간 초과됨

EC2 인스턴스에서 한 쌍의 kubernetes 작업자를 실행하려고 하는데 서비스가 볼 수 있어야 하는 모든 포드를 "볼" 수 없는 것처럼 보이는 문제가 발생합니다.

내 정확한 환경은 AWS Snowball, Red 및 Blue 쌍이고 내 클러스터는 control, worker-redworker-blue[1]과 같습니다. 포트 8080에서 GET을 기다리고 로컬 호스트 이름으로 응답하는 더미 Python 서버를 배포 중입니다. 나는 worker-red둘 다 worker-blue적어도 하나의 포드가 있는 충분한 복제본으로 설정했습니다 . 마지막으로 서비스를 만들었습니다. 사양은 다음과 같습니다.

spec:
    type: NodePort
    selector:
        app: hello-server
    ports:
        - port: 8080
          targetPort: 8080
          nodePort: 30080

이제 포드가 작동 중인지 확인할 수 있습니다.

kubectl get pods -o wide
NAME                                      READY   STATUS    RESTARTS   AGE   IP              NODE          NOMINATED NODE   READINESS GATES
hello-world-deployment-587468bdb7-hf4dq   1/1     Running   0          27m   192.168.1.116   worker.red    <none>           <none>
hello-world-deployment-587468bdb7-mclhm   1/1     Running   0          27m   192.168.1.126   worker.blue   <none>           <none>

이제 컬링을 해볼 수 있어요

curl worker-red:30080
greetings from hello-world-deployment-587468bdb7-hf4dq
curl worker-blue:30080
greetings from hello-world-deployment-587468bdb7-mclhm

절반 정도는 그런 일이 일어납니다. 나머지 절반은 시간 초과 오류로 인해 컬이 실패합니다. 특히 컬링 작업자-레드는 hf4dq에서만 응답을 생성하고 컬링 작업자-블루는 mclhm에서만 응답을 생성합니다. 두 포드가 모두 워커-레드에서 실행되도록 작업자-블루를 차단하고 배수하면 시간 초과가 발생하지 않으며 두 포드 모두 응답합니다.

NodePort 서비스가 내가 컬링 중인 호스트에 없는 포드에 도달하지 않는 것 같습니다. 내가 이해하는 바에 따르면 이것은 서비스가 작동하는 방식이 아닙니다. 내가 무엇을 놓치고 있나요?

[1] Red에 두 명의 작업자가 있도록 설정하면 설명하는 것과 동일한 문제가 발생하지만 이것이 주요 사용 사례이므로 집중적으로 다루겠습니다.

답변1

여기서 무엇이 잘못되었는지 간단히 말하기는 어렵지만 문제를 해결하기 위해 취할 수 있는 몇 가지 단계가 있습니다.

  1. 디버그 포드, 특히 로그에 의심스러운 내용이 있는지 확인하세요.
  • kubectl logs ${POD_NAME} ${CONTAINER_NAME}

  • kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}

  1. 디버그 서비스, 예를 들어 다음을 확인하여:
  • 서비스가 존재합니까?

  • 서비스가 DNS 이름으로 작동합니까?

  • 서비스는 IP로 작동합니까?

  • 서비스가 올바르게 정의되어 있습니까?

  • 서비스에 엔드포인트가 있나요?

  • kube-proxy가 작동하나요?

이러한 단계를 수행하면 문제의 원인을 찾고 서비스 이면의 메커니즘을 더 잘 이해하는 데 도움이 됩니다.

답변2

당신은 NodePort유형 서비스를 사용하고 있는데, 이 경우 당신이 관찰하고 있는 것이 매우 기대됩니다.

귀하의 서비스는 두 개의 서로 다른 노드에서 실행되는 2개의 Pod와 일치합니다. 서비스 유형이 이므로 NodePort서비스 포드와 서비스가 실행 중인 노드가 본질적으로 연관되어 있습니다. worker-red끝점을 말리면오직포드 에서 응답을 가져옵니다 worker-red. 이는 다른 포드가 다른 엔드포인트에 연결되어 있고 엔드포인트 worker-blue:<node-port>에서 연결할 수 없기 때문입니다 worker-red. 예, 동일한 서비스이지만 각각 다른 호스트 이름을 갖는 2개의 엔드포인트로 지원됩니다.

이것이 기본적으로 NodePort서비스가 작동하는 방식입니다.

두 포드를 동일한 노드에 번들로 묶으면 두 포드 모두 동일한 노드 호스트 이름에서 액세스할 수 있으므로 둘 다 컬링하면 작동합니다. 이제부터 두 엔드포인트는 서로 다른 포트에 매핑되지만동일한 호스트 이름.

이에 대한 이해를 높이는 방법입니다. 서비스 유형을 으로 변경해 보세요 LoadBalancer. 그리고 예약된 위치에 관계없이 동일한 호스트 이름을 사용하여 두 포드에 모두 연결할 수 있다는 것을 알 수 있습니다. 그리고 이 호스트 이름/IP 주소는 LoadBalancer서비스의 모든 포드가 공통적으로 갖게 될 주소가 됩니다 .

이것이 귀하의 혼란을 명확하게 해주기를 바랍니다!

관련 정보