我在 kubernetes 命名空间中有 Trino 舵图,带有标签
istio-injection=enabled
。 Trino 的集群经过配置,以便工作人员向协调员通报自己的情况。然后协调器安排集群中的所有节点接收所有其他节点的所有 pod ip。
Istio 是一个 Service Mesh,而不是 pod 网格,它的 proxy sidecar 不支持直接到 pod ip 的流量。
因此,Trino 协调器无法打开与工作人员的连接,工作人员只能通过其服务 fqdn 与协调员对话(在我的例子中为
trino.trino.svc.cluster.local
)。
有没有一种解决方案可以让协调器与工作人员对话并让该集群运行起来,而无需关闭所有安全性(即将其移出服务网格)?
根据我的经验,解决方案如下:
---
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
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
...
我希望这能帮助有人解决类似的问题。
这是一个兔子洞,但我发现了一种巧妙的方法,确实可以让节点找到彼此。
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。
但首先检查一下这个设置是否还不够
kubectl -n trino apply -f trino-headless.yaml