我正在尝试连接到Kubernetes Cluster上部署的Apache Ignite(2.8.0)。群集本身看起来很好,因为我能够执行到Pod中并通过sqlline工具进行访问,如下所示
root@ip-172-17-28-68:/opt/apache-ignite-2.8.0-bin# kubectl exec -it ignite-cluster-6d69696b67-8vvmm /bin/bash
bash-4.4# apache-ignite/bin/sqlline.sh --verbose=true -u jdbc:ignite:thin://127.0.0.1:10800/
issuing: !connect jdbc:ignite:thin://127.0.0.1:10800/ '' '' org.apache.ignite.IgniteJdbcThinDriver
Connecting to jdbc:ignite:thin://127.0.0.1:10800/
Connected to: Apache Ignite (version 2.8.0#20200226-sha1:341b01df)
Driver: Apache Ignite Thin JDBC Driver (version 2.8.0#20200226-sha1:341b01df)
Autocommit status: true
Transaction isolation: TRANSACTION_REPEATABLE_READ
sqlline version 1.3.0
0: jdbc:ignite:thin://127.0.0.1:10800/>
但是,如果我尝试从外部LB连接,则会出现以下错误。
root@ip-172-17-28-68:/opt/apache-ignite-2.8.0-bin/bin# ./sqlline.sh --verbose=true -u jdbc:ignite:thin://aadfc9f1ba3c911eabe000a9a1a1e115-227722391.us-east-1.elb.amazonaws.com:10800
issuing: !connect jdbc:ignite:thin://aadfc9f1ba3c911eabe000a9a1a1e115-227722391.us-east-1.elb.amazonaws.com:10800 '' '' org.apache.ignite.IgniteJdbcThinDriver
Connecting to jdbc:ignite:thin://aadfc9f1ba3c911eabe000a9a1a1e115-227722391.us-east-1.elb.amazonaws.com:10800
Error: Failed to connect to server [url=jdbc:ignite:thin://aadfc9f1ba3c911eabe000a9a1a1e115-227722391.us-east-1.elb.amazonaws.com:10800/PUBLIC] (state=08001,code=0)
java.sql.SQLException: Failed to connect to server [url=jdbc:ignite:thin://aadfc9f1ba3c911eabe000a9a1a1e115-227722391.us-east-1.elb.amazonaws.com:10800/PUBLIC]
at org.apache.ignite.internal.jdbc.thin.JdbcThinConnection.handleConnectExceptions(JdbcThinConnection.java:1529)
at org.apache.ignite.internal.jdbc.thin.JdbcThinConnection.connectInCommonMode(JdbcThinConnection.java:1506)
at org.apache.ignite.internal.jdbc.thin.JdbcThinConnection.ensureConnected(JdbcThinConnection.java:231)
at org.apache.ignite.internal.jdbc.thin.JdbcThinConnection.<init>(JdbcThinConnection.java:210)
at org.apache.ignite.IgniteJdbcThinDriver.connect(IgniteJdbcThinDriver.java:154)
at sqlline.DatabaseConnection.connect(DatabaseConnection.java:156)
at sqlline.DatabaseConnection.getConnection(DatabaseConnection.java:204)
at sqlline.Commands.connect(Commands.java:1095)
at sqlline.Commands.connect(Commands.java:1001)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sqlline.ReflectiveCommandHandler.execute(ReflectiveCommandHandler.java:38)
at sqlline.SqlLine.dispatch(SqlLine.java:791)
at sqlline.SqlLine.initArgs(SqlLine.java:566)
at sqlline.SqlLine.begin(SqlLine.java:643)
at sqlline.SqlLine.start(SqlLine.java:373)
at sqlline.SqlLine.main(SqlLine.java:265)
Suppressed: java.io.IOException: Failed to read incoming message (not enough data).
at org.apache.ignite.internal.jdbc.thin.JdbcThinTcpIo.read(JdbcThinTcpIo.java:546)
at org.apache.ignite.internal.jdbc.thin.JdbcThinTcpIo.read(JdbcThinTcpIo.java:524)
at org.apache.ignite.internal.jdbc.thin.JdbcThinTcpIo.handshake(JdbcThinTcpIo.java:266)
at org.apache.ignite.internal.jdbc.thin.JdbcThinTcpIo.<init>(JdbcThinTcpIo.java:212)
at org.apache.ignite.internal.jdbc.thin.JdbcThinConnection.connectInCommonMode(JdbcThinConnection.java:1477)
... 17 more
Suppressed: java.io.IOException: Failed to read incoming message (not enough data).
at org.apache.ignite.internal.jdbc.thin.JdbcThinTcpIo.read(JdbcThinTcpIo.java:546)
at org.apache.ignite.internal.jdbc.thin.JdbcThinTcpIo.read(JdbcThinTcpIo.java:524)
at org.apache.ignite.internal.jdbc.thin.JdbcThinTcpIo.handshake(JdbcThinTcpIo.java:266)
at org.apache.ignite.internal.jdbc.thin.JdbcThinTcpIo.<init>(JdbcThinTcpIo.java:212)
at org.apache.ignite.internal.jdbc.thin.JdbcThinConnection.connectInCommonMode(JdbcThinConnection.java:1477)
... 17 more
sqlline version 1.3.0
有趣的是,通过telnet通过LB连接到端口表示如下所示。
root@ip-172-17-28-68:/opt/apache-ignite-2.8.0-bin/bin# telnet aadfc9f1ba3c911eabe000a9a1a1e115-227722391.us-east-1.elb.amazonaws.com 10800
Trying 3.209.73.243...
Connected to aadfc9f1ba3c911eabe000a9a1a1e115-227722391.us-east-1.elb.amazonaws.com.
Escape character is '^]'.
Connection closed by foreign host.
为什么即使telnet在端口10800上也无法通过jdbc客户端连接?我也尝试通过DBeaver连接,但错误是相同的。
这里是Kubernetes EKS部署中使用的服务和部署Yaml。
Ignite-service.yaml
apiVersion: v1
kind: Service
metadata:
name: ignite
namespace: default
labels:
app: ignite
spec:
type: LoadBalancer
ports:
- name: rest
port: 8080
protocol: TCP
targetPort: 8080
- name: sql
port: 10800
protocol: TCP
targetPort: 10800
- name: thinclients
port: 10900
protocol: TCP
targetPort: 10900
selector:
app: ignite
Ignite-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ignite-cluster
namespace: default
spec:
selector:
matchLabels:
app: ignite
replicas: 2
template:
metadata:
labels:
app: ignite
spec:
serviceAccount: ignite
containers:
- name: ignite-node
image: apacheignite/ignite:2.8.0
env:
- name: OPTION_LIBS
value: ignite-kubernetes
- name: CONFIG_URI
value: https://raw.githubusercontent.com/apache/ignite/master/modules/kubernetes/config/example-kube.xml
ports:
- containerPort: 11211 # REST port number.
- containerPort: 47100 # communication SPI port number.
- containerPort: 47500 # discovery SPI port number.
- containerPort: 49112 # JMX port number.
- containerPort: 10800 # SQL port number.
确保提供了外部IP并可以使用。
将K8限制为一个Pod,然后重试。
设置externalTrafficPolicy和pod选择器
externalTrafficPolicy: Local
selector:
statefulset.kubernetes.io/pod-name: pod-name
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-name-label瘦客户端需要与特定的pod /服务器通信
检查服务器日志以确保数据正在流动。