Kubernetes 为守护程序集创建服务

Kubernetes 为守护程序集创建服务,kubernetes,Kubernetes,我正在尝试通过服务访问端口18081上侦听的守护程序,但迄今为止未成功 由守护程序启动的pod工作正常。我可以将端口转发到pod和端口18081,并在端口上与暴露的API通信 守护程序集的服务配置如下: kind: Service apiVersion: v1 metadata: name: monerod-service spec: selector: name: monerod ports: - protocol: TCP port: 18081 在Kube

我正在尝试通过服务访问端口18081上侦听的守护程序,但迄今为止未成功

由守护程序启动的pod工作正常。我可以将端口转发到pod和端口18081,并在端口上与暴露的API通信

守护程序集的服务配置如下:

kind: Service
apiVersion: v1
metadata:
  name: monerod-service
spec:
  selector:
    name: monerod
  ports:
  - protocol: TCP
    port: 18081
在Kubernetes UI(kubectl代理)中,服务中选择了正确的Pod,因此Pod选择器似乎很好

我可以在需要连接monerod服务的pod上执行ping,并显示正确的IP。但是通过curl连接到端口失败(相同的curl在端口转发测试中工作)

我在配置中缺少了什么。守护程序集/部署服务创建之间是否存在差异


更多地和库伯内特斯玩

我玩了服务和守护程序。我将守护程序转换为“正常” 部署,但显示了相同的行为。因此,该行为与守护程序无关。我不了解服务/播客的其他内容

我现在使用以下工具创建了该服务:

kubectl expose deployment monerod-deployment --type=ClusterIP
这将导致以下服务:

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "monerod-deployment",
    "namespace": "default",
    "labels": {
      "app": "monerod"
    }
  },
  "spec": {
    "ports": [
      {
        "protocol": "TCP",
        "port": 18081,
        "targetPort": 18081
      }
    ],
    "selector": {
      "app": "monerod"
    },
    "clusterIP": "<some-ip>",
    "type": "ClusterIP",
    "sessionAffinity": "None"
  },
  "status": {
    "loadBalancer": {}
  }
}
在应该与monerod服务对话的pod中,这会导致

port 18081: Connection refused
在monerod deployment docker容器中,容器是暴露的(使用EXPOSE 18081) 部署具有以下端口定义:

"ports": [
  {
    "containerPort": 18081,
    "protocol": "TCP"
  }
],
使用kubectl进行端口转发到部署,并在本地执行curl,效果非常好。
我不明白为什么无法建立从pod到monerod部署的连接。

您需要在服务定义中指定targetPort。targetPort是pod暴露的端口。您可以在服务中定义不同的端口

像这样:

kind: Service
apiVersion: v1
metadata:
  name: monerod-service
spec:
  selector:
    name: monerod
  ports:
  - protocol: TCP
    port: 9091
    targetPort: 18081

从集群外部看不到该端口,您可以使用节点端口类型或入口。

可能与Azure上Kubernetes 1.8上的kube proxy中的此错误有关:

我们发现这是错误的,在库伯内特斯什么都不是

出于安全原因,monerod守护程序默认情况下只允许从localhost进行连接。启用外部连接“--confirm external bind”使其正常工作


从巴尔塔扎尔到的链接非常有帮助,它发现了库伯内特斯正在发生的事情,并一个接一个地消除了所有的原因

服务定义现在看起来像您的建议(这次我使用kubeclt expose再次创建了服务,请参见原始问题中的编辑)。这将公开服务。希望该服务仅在群集中可用。仍然存在的主要问题是:为什么我不能向公开的服务请求一个curl呢?我将做一个粗略的猜测,我也在学习kubernetes。是否执行curl的pod位于不同的名称空间中?顺便说一句,您可能需要检查kubernetes关于调试服务的文档。
kind: Service
apiVersion: v1
metadata:
  name: monerod-service
spec:
  selector:
    name: monerod
  ports:
  - protocol: TCP
    port: 9091
    targetPort: 18081