왜 내 쿠버네티스 서비스가 끝점을 찾지 못하지?
왜 내 쿠버네티스 서비스가 끝점을 찾지 못하지?
나는 코어에서 쿠버네티스 클러스터를 운영하고 있다.
나는 잘 작동하는 쿠버네티스 복제 컨트롤러를 가지고 있다. 다음과 같습니다.
id: "redis-controller"
kind: "ReplicationController"
apiVersion: "v1beta3"
metadata:
name: "rediscontroller"
lables:
name: "rediscontroller"
spec:
replicas: 1
selector:
name: "rediscontroller"
template:
metadata:
labels:
name: "rediscontroller"
spec:
containers:
- name: "rediscontroller"
image: "redis:3.0.2"
ports:
- name: "redisport"
hostPort: 6379
containerPort: 6379
protocol: "TCP"
그러나 다음과 같은 복제 컨트롤러의 포드에 대한 서비스가 있습니다.
id: "redis-service"
kind: "Service"
apiVersion: "v1beta3"
metadata:
name: "redisservice"
spec:
ports:
- protocol: "TCP"
port: 6379
targetPort: 6379
selector:
name: "redissrv"
createExternalLoadBalancer: true
sessionAffinity: "ClientIP"
쿠브-벤더 저널은 서비스에 대해 다음과 같이 말하고 있다.
Jul 06 21:18:31 core-01 kube-proxy[6896]: E0706 21:18:31.477535 6896 proxysocket.go:126] Failed to connect to balancer: failed to connect to an endpoint.
Jul 06 21:18:41 core-01 kube-proxy[6896]: E0706 21:18:41.353425 6896 proxysocket.go:81] Couldn't find an endpoint for default/redisservice:: missing service entry
제가 알기로는 올바른 포드와 올바른 포트를 가리키는 서비스가 있는데, 제가 잘못 알고 있는 건가요?
업데이트 1
저는 알렉스가 언급한 것들을 고친 후 다른 서비스에서도 웹 소켓을 사용하는 서비스에서 엔드포인트를 찾을 수 없다는 것을 알게 되었습니다. 이것은 서비스가 폴링할 http 엔드포인트가 필요하다는 것을 의미합니까?
처음 두 가지가 가장 중요한데, 몇 가지가 내게는 웃기게 보인다.
- 서비스가 존재하지 않는 것 같습니다. 올바르게 생성되었습니까? 뛰면 나오나요?
- 서비스 선택기가 제대로 표시되지 않습니다. 선택기는 복제 컨트롤러의 템플릿에 있는 것과 일치하는 키-값 레이블 쌍이어야 합니다. rc 템플릿의 레이블은 이므로 서비스 선택 도구로도 사용해야 합니다.
- 각 개체의 시작 부분에 있는 ID 필드는 무엇입니까? v1beta3에서 유효한 필드가 아닙니다.
특정 경우 포드 규격에 지정한 경우 서비스 규격에 가 있는지 확인합니다. 세부 정보 참조:
그렇지 않은 경우 공식 K8s 서비스 디버깅 가이드를 통해 설정하십시오.
http://kubernetes.io/docs/user-guide/debugging-services/
서비스, DNS, 네트워킹, 큐브 프록시 등에 대한 단계별 체크리스트가 있다.
추가로 확인해야 할 사항이 있습니다.
엔드포인트는 배포가 정상인 경우에만 생성됩니다. 을(를) 잘못 정의했거나 배포가 올바르게 응답하지 않으면 끝점이 생성되지 않습니다.
에서 엔드포인트를 검사해 볼 수 있습니다. 엔드포인트 설명에서 옆에 포드 IP가 표시되면 포드에 문제가 있어 준비가 되지 않았음을 나타냅니다. 이 경우 포드가 엔드포인트에 등록되지 않습니다.
포드가 준비되지 않은 경우 상태/생존 상태 탐침이 실패했기 때문일 수 있습니다.
서비스( )의 'contribute'는 포드( )의 레이블과 일치해야 합니다(예: 선택기 =, 포드 레이블 =). 이렇게 하면 서비스에서 연결을 시도해야 하는 엔드포인트를 결정합니다.