[英]Connect Refused Kubernetes Service Discovery Using Spring Boot
我正在尝试使用 spring-boot-kubernetes 设置一个简单的发现,但是每次尝试通过服务名称超出服务时都会拒绝连接。
我已经包括:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes</artifactId>
</dependency>
并添加了@EnableDiscoveryClient 注解。
下面是我试图通过名称从其他服务调用的服务的 deployment.yml。
kind: Service
apiVersion: v1
metadata:
name: sample-rest
spec:
selector:
app: sample-rest
ports:
- protocol: TCP
port: 8771
targetPort: 8771
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: sample-rest
name: sample-rest
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: sample-rest
template:
metadata:
labels:
app.kubernetes.io/name: sample-rest
spec:
containers:
- name: sample-rest
image: kryptonian/sample-rest:1.0
ports:
- containerPort: 8771
下面是我试图通过名称调用上述服务的发现服务的 deployment.yml。
kind: Service
apiVersion: v1
metadata:
name: sample-discovery
spec:
selector:
app: sample-discovery
ports:
- protocol: TCP
port: 8772
targetPort: 8772
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: sample-discovery
name: sample-discovery
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: sample-discovery
template:
metadata:
labels:
app.kubernetes.io/name: sample-discovery
spec:
containers:
- name: sample-discovery
image: kryptonian/discovery-sample:1.0
ports:
- containerPort: 8772
调用服务的代码:
@GetMapping("/test")
public String getHelloMessage() {
RestTemplate restTemplate = new RestTemplate();
String url = "http://sample-rest:8771/sample";
ResponseEntity<String> result = restTemplate.getForEntity(url, String.class);
return result.getBody();
}
每次我尝试调用以下端点时,日志和 ui 上都会出现错误。
2020-04-13 16:08:04.187 ERROR 1 --- [nio-8772-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://sample-rest:8771/sample": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)] with root cause
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_212]
kubectl 描述 svc sample-rest 的 Output
Name: sample-rest
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"sample-rest","namespace":"default"},"spec":{"ports":[{"port":8771...
Selector: app=sample-rest
Type: NodePort
IP: 10.35.250.117
Port: <unset> 8771/TCP
TargetPort: 8771/TCP
NodePort: <unset> 31406/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
这里的问题是 service sample-rest
的 endpoints 是空的。您应该检查您的 Service 的spec.selector
字段是否实际选择了您 Pod 上的metadata.labels
值。 有app: sample-rest
as spec.selector
但 pod label 有app.kubernetes.io/name: sample-rest
不匹配。
如果这是服务问题,您也可以尝试直接绕过服务连接到 POD IP 以隔离。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.