EC2 인스턴스에서 한 쌍의 kubernetes 작업자를 실행하려고 하는데 서비스가 볼 수 있어야 하는 모든 포드를 "볼" 수 없는 것처럼 보이는 문제가 발생합니다.
내 정확한 환경은 AWS Snowball, Red 및 Blue 쌍이고 내 클러스터는 control
, worker-red
및 worker-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
여기서 무엇이 잘못되었는지 간단히 말하기는 어렵지만 문제를 해결하기 위해 취할 수 있는 몇 가지 단계가 있습니다.
- 디버그 포드, 특히 로그에 의심스러운 내용이 있는지 확인하세요.
kubectl logs ${POD_NAME} ${CONTAINER_NAME}
kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}
- 디버그 서비스, 예를 들어 다음을 확인하여:
서비스가 존재합니까?
서비스가 DNS 이름으로 작동합니까?
서비스는 IP로 작동합니까?
서비스가 올바르게 정의되어 있습니까?
서비스에 엔드포인트가 있나요?
kube-proxy가 작동하나요?
이러한 단계를 수행하면 문제의 원인을 찾고 서비스 이면의 메커니즘을 더 잘 이해하는 데 도움이 됩니다.
답변2
당신은 NodePort
유형 서비스를 사용하고 있는데, 이 경우 당신이 관찰하고 있는 것이 매우 기대됩니다.
귀하의 서비스는 두 개의 서로 다른 노드에서 실행되는 2개의 Pod와 일치합니다. 서비스 유형이 이므로 NodePort
서비스 포드와 서비스가 실행 중인 노드가 본질적으로 연관되어 있습니다. worker-red
끝점을 말리면오직포드 에서 응답을 가져옵니다 worker-red
. 이는 다른 포드가 다른 엔드포인트에 연결되어 있고 엔드포인트 worker-blue:<node-port>
에서 연결할 수 없기 때문입니다 worker-red
. 예, 동일한 서비스이지만 각각 다른 호스트 이름을 갖는 2개의 엔드포인트로 지원됩니다.
이것이 기본적으로 NodePort
서비스가 작동하는 방식입니다.
두 포드를 동일한 노드에 번들로 묶으면 두 포드 모두 동일한 노드 호스트 이름에서 액세스할 수 있으므로 둘 다 컬링하면 작동합니다. 이제부터 두 엔드포인트는 서로 다른 포트에 매핑되지만동일한 호스트 이름.
이에 대한 이해를 높이는 방법입니다. 서비스 유형을 으로 변경해 보세요 LoadBalancer
. 그리고 예약된 위치에 관계없이 동일한 호스트 이름을 사용하여 두 포드에 모두 연결할 수 있다는 것을 알 수 있습니다. 그리고 이 호스트 이름/IP 주소는 LoadBalancer
서비스의 모든 포드가 공통적으로 갖게 될 주소가 됩니다 .
이것이 귀하의 혼란을 명확하게 해주기를 바랍니다!