当前位置: 首页 > 知识库问答 >
问题:

Connect拒绝使用Spring Boot发现Kubernetes服务

漆雕嘉平
2023-03-14

我试图使用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();
    }

每次我尝试调用下面的endpoint时,日志和用户界面都会出现错误。

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样本Rest

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>

共有1个答案

班宏毅
2023-03-14

这里的问题是服务<code>sample rest</code>的endpoint为空。您应该检查您的服务的<code>spec.selector</code〕字段是否实际选择了Pods上的<code>元数据标签</code>值。有app:sample-rest作为spec.selector,但pod标签app.kubernetes.io/name:sample-rest不匹配。

https://kubernetes . io/docs/tasks/debug-application-cluster/debug-service/# do-the-service-have-any-endpoints

您也可以尝试绕过服务直接连接到POD IP,以确定这是否是服务的问题。

 类似资料:
  • 我正在使用典型的Spring云堆栈对简单的微服务架构进行POC,但不是Eureka服务器,而是使用不工作的Spring云Kubernetes进行服务发现。 整个POC都在这里-https://github.com/dhananjay12/spring-microservices-using-spring-kubernetes 网关作为边缘服务器和2个下游服务-用户服务和联系我们服务。 k8设置在k

  • 我正在使用NAT开发一个微服务web应用程序(React和Node)并在GCP Kubernetes集群上运行它。 我无法连接到NAT流服务器POD。端口4222和8222是打开的。我收到连接拒绝错误。 $kubectl描述服务NAT-Srv

  • 我尝试按照本教程来使用nginx入口控制器。在我尝试让它工作的过程中,一些细节发生了变化——只有一个后端服务而不是两个,一些端口号和所有内容都在默认名称空间中运行。我在CentOS Linux 7.4.1708版虚拟机上有一个kubernetes主机和三个仆从。 后端和默认后端都可以通过各自的服务endpoint在集群内访问。nginx状态页面在外部可用(MasterHostIP:32000/ng

  • 我有一个正在运行的GCP Kubernetes集群。我设法部署了一些服务,并使用kubectl expose成功地公开了它们。。。type=“负载平衡器”。。。然而,一项特殊的新服务不起作用。我知道可能有一千个原因需要检查,但我构建的Docker图像非常紧凑,因此我无法找到有用的工具通过kubectl exec在pod或容器中运行。 问题:仅使用任何可能的群集工具,我的诊断选项可能是什么?我可以检

  • 我安装了kubeadm来部署多节点kubernetes集群。添加了两个节点。那些都准备好了。我能够运行我的应用程序使用节点端口服务。当我尝试你访问仪表板面临一个问题。我正在按照此链接中安装仪表板的步骤操作 它运行良好,并将输出保存在中 当我尝试使用URL访问站点时,它显示的是。我观察了中的输出,它显示了以下错误: I1203 12:28:05.880828 15591 log.go:172]HTT

  • 我在Spring Boot应用程序上遇到了Kubernetes服务发现的问题。 无论spring boot应用程序是在Kubernetes集群内运行还是在Kubernetes集群外运行,我都应该能够发现这些服务。我们的本地发展不会在k8s集群上。 我正在通过DNS使用服务发现。我尝试使用spring-cloud-starter-kubernetes

  • kubectl对kafka的描述也显示了暴露的节点 我有一个出版商二进制文件,将一些信息发送到Kafka。由于我有一个3节点集群部署,我使用我的主节点IP和Kafka节点端口(30092)与Kafka连接。 但是我的二进制文件正在获得错误。我无法理解为什么即使在nodePort到targetPort转换成功后,它还是被拒绝。随着进一步的调试,我在kafka日志中看到了以下调试日志:

  • 拒绝服务(DoS)攻击是黑客企图使网络资源不可用的一种攻击。它通常会临时或无限地中断主机,让正常使用的用户无法访问目标服务。这些攻击通常针对托管在关键任务Web服务器(如银行,信用卡支付网关)上的服务。 DoS的症状 网络性能异常缓慢。 特定网站不可用。 无法访问任何网站。 收到的垃圾邮件数量大幅增加。 长期拒绝访问网络或任何互联网服务。 特定网站不可用。 动手实践 第1步 - 启动WebGoat