在 Istio 服务网格中使用 Trino,节点无法通过 pod ip 相互访问

问题描述 投票:0回答:3

我在 kubernetes 命名空间中有 Trino 舵图,带有标签

istio-injection=enabled
。 Trino 的集群经过配置,以便工作人员向协调员通报自己的情况。然后协调器安排集群中的所有节点接收所有其他节点的所有 pod ip。

Istio 是一个 Service Mesh,而不是 pod 网格,它的 proxy sidecar 不支持直接到 pod ip 的流量。

因此,Trino 协调器无法打开与工作人员的连接,工作人员只能通过其服务 fqdn 与协调员对话(在我的例子中为

trino.trino.svc.cluster.local
)。

有没有一种解决方案可以让协调器与工作人员对话并让该集群运行起来,而无需关闭所有安全性(即将其移出服务网格)?

kubernetes istio trino
3个回答
2
投票

根据我的经验,解决方案如下:

  1. 创建无头服务
---
apiVersion: v1
kind: Service
metadata:
  name: trino-headless-coordinator
  namespace: trino
spec:
  clusterIP: None
  ports:
    - name: tcp-trino
      port: 8080
      protocol: TCP
  selector:
    app: trino
    component: coordinator
  type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
  name: trino-headless-worker
  namespace: trino
spec:
  clusterIP: None
  ports:
    - name: tcp-trino
      port: 8080
      protocol: TCP
  selector:
    app: trino
    component: worker
  type: ClusterIP
  1. 重新启动 Pod
kubectl rollout restart -n trino deployment trino-coordinator
kubectl rollout restart -n trino deployment trino-worker

我不知道为什么需要重新启动 Pod,但这停止了以下 502 错误

[2023-10-04T00:56:27.076Z] "GET /v1/info/state HTTP/1.1" 502 - direct_response - "-" 0 0 0 - "-" "-" "2567ad09-dff9-484c-907d-d6b4076c341f" "[2406:da14:dc0:6300:9ea4::b]:8080" "-" - - [2406:da14:dc0:6300:9ea4::b]:8080 [2406:da14:dc0:6301:e0a4::8]:45174 - block_all
...

我希望这能帮助有人解决类似的问题。


0
投票

这是一个兔子洞,但我发现了一种巧妙的方法,确实可以让节点找到彼此。

Trino 借用了 Airlift 的代码,特别是这部分。它具有配置参数

node.internal-address-source
,它是一个具有可能值的枚举:

public enum AddressSource
    {
        HOSTNAME,
        FQDN,
        IP,
        IP_ENCODED_AS_HOSTNAME
    }

因此,在安装 Helm Chart 的 value.yaml 中,添加以下行:

additionalConfigProperties:
  - node.internal-address-source=IP_ENCODED_AS_HOSTNAME

现在,这还不够,但你可能会看到这会发生什么。工作人员的日志现在显示如下行:

2023-03-16T14:40:01.342Z        WARN    http-client-node-manager-32     io.trino.metadata.RemoteNodeState        Error fetching node state from http://10-42-1-186.ip:8080/v1/info/state returned status 503

我没有找到在该地址中配置不同主机名的方法。所以,如果山不来……,我没有将 ip 重命名为我想要的,而是将我必须的重命名为 ip。将以下无头服务添加到您的 Trino 安装中。

ip

将该文件命名为 
apiVersion: v1 kind: Service metadata: labels: app: trino name: ip namespace: trino spec: clusterIP: None # this makes it headless. ports: - name: http port: 8080 protocol: TCP targetPort: http selector: app: trino type: ClusterIP

并使用

trino-headless.yaml
应用它。
那个。现在,您的工作人员和协调员都可以在 A-B-C-D.ip 下访问,其中 A-B-C-D 由 IP_ENCODED_AS_HOSTNAME 设置。

我认为这可以让你完全在服务网格内使用 Trino。


0
投票

但首先检查一下这个设置是否还不够

kubectl -n trino apply -f trino-headless.yaml

	
© www.soinside.com 2019 - 2024. All rights reserved.