当尝试在Mac OS上的本地Kubernetes集群中设置Cassandra数据库时(通过Minikube),我遇到了连接问题。看起来Node.js无法正确解析DNS设置,但通过命令行解析确实有效。
设置如下(简化):Cassandra Service
apiVersion: v1
kind: Service
metadata:
labels:
app: cassandra
name: cassandra
spec:
type: NodePort
ports:
- port: 9042
targetPort: 9042
protocol: TCP
name: http
selector:
app: cassandra
此外,还有一个PersistentVolume和一个StatefulSet。
应用程序本身是非常基础的
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: app1
labels:
app: app1
spec:
replicas: 1
selector:
matchLabels:
app: app1
template:
metadata:
labels:
app: app1
spec:
containers:
- name: app1
image: xxxx.dkr.ecr.us-west-2.amazonaws.com/acme/app1
imagePullPolicy: "Always"
ports:
- containerPort: 3003
和一项服务
apiVersion: v1
kind: Service
metadata:
name: app1
namespace: default
spec:
selector:
app: app1
type: NodePort
ports:
- port: 3003
targetPort: 3003
protocol: TCP
name: http
还有一个简单的入口设置
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: dev.acme.com
http:
paths:
- path: /app1
backend:
serviceName: app1
servicePort: 3003
并将minikube ip地址添加到/etc/hosts
192.xxx.xx.xxx dev.acme.com
到目前一切尚好。
当尝试通过邮递员调用dev.acme.com/app1
时,node.js应用程序本身被正确调用(可以在日志中看到),但是,该应用程序无法连接到卡桑德拉并超时,并显示以下错误:
“尝试查询的所有主机都失败。第一次尝试的主机,92.242.140.2:9042: DriverError:连接超时。请参阅innerErrors。”
IP 92.242.140.2
似乎只是一个与我的运营商相关的公网IP,我相信是因为应用程序无法解析服务名称。
我创建了一个简单的node.js脚本来测试dns:
var dns = require('dns') dns.resolve6('cassandra', (err, res) => console.log('ERR:', err, 'RES:', res))
回应是
然而,这就是它令人困惑的地方-当我ssh进入pod (app1)时,我能够使用以下命令连接到cassandra服务:
cqlsh cassandra 9042 --cqlversion=3.4.4
因此,看起来pod“知道”服务名称,但node.js运行时却不知道。
您知道是什么原因导致node.js无法解析服务名称/dns设置吗?
更新
在重新安装整个集群之后,包括重新安装docker、kubectl和minikube,我也遇到了同样的问题。
在通过ssh从app1容器运行ping cassandra
时,我得到了以下信息
PING cassandra.default.svc.cluster.local (10.96.239.137) 56(84)字节数据。来自cassandra.default.svc.cluster.local的64字节(10.96.239.137):icmp_seq=1 ttl=61 time=27.0 ms
发送2个数据包,接收2个数据包,丢包率为0%,时间为1001ms
这看起来很好。然而,当从Node.js运行时运行时,我仍然收到相同的错误-
“尝试查询的所有主机都失败。第一次尝试的主机,92.242.140.2:9042: DriverError:连接超时。请参阅innerErrors。”
这些是服务
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
app1 ClusterIP None <none> 3003/TCP 11m
cassandra NodePort 10.96.239.137 <none> 9042:32564/TCP 38h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 38h
这些是pod(所有名称空间)
NAMESPACE NAME READY STATUS RESTARTS AGE
default app1-85d889db5-m977z 1/1 Running 0 2m1s
default cassandra-0 1/1 Running 0 38h
kube-system calico-etcd-ccvs8 1/1 Running 0 38h
kube-system calico-node-thzwx 2/2 Running 0 38h
kube-system calico-policy-controller-5bb4fc6cdc-cnhrt 1/1 Running 0 38h
kube-system coredns-86c58d9df4-z8pr4 1/1 Running 0 38h
kube-system coredns-86c58d9df4-zcn6p 1/1 Running 0 38h
kube-system default-http-backend-5ff9d456ff-84zb5 1/1 Running 0 38h
kube-system etcd-minikube 1/1 Running 0 38h
kube-system kube-addon-manager-minikube 1/1 Running 0 38h
kube-system kube-apiserver-minikube 1/1 Running 0 38h
kube-system kube-controller-manager-minikube 1/1 Running 0 38h
kube-system kube-proxy-jj7c4 1/1 Running 0 38h
kube-system kube-scheduler-minikube 1/1 Running 0 38h
kube-system kubernetes-dashboard-ccc79bfc9-6jtgq 1/1 Running 4 38h
kube-system nginx-ingress-controller-7c66d668b-rvxpc 1/1 Running 0 38h
kube-system registry-creds-x5bhl 1/1 Running 0 38h
kube-system storage-provisioner 1/1 Running 0 38h
更新2
从Node.js连接到Cassandra的代码:
const cassandra = require('cassandra-driver');
const client = new cassandra.Client({ contactPoints: ['cassandra:9042'], localDataCenter: 'datacenter1', keyspace: 'auth_server' });
const query = 'SELECT * FROM user';
client.execute(query, [])
.then(result => console.log('User with email %s', result.rows[0].email));
当用10.96.239.137:9042
替换cassandra:9042
(10.69.239.137是通过cli从with cassandra收到的ip地址)时,它确实起作用。
发布于 2019-03-18 06:44:42
用于Node.js的Cassandra驱动程序使用resolve4
/resolve6
来执行其dns查找,从而绕过您的resolv.conf
文件。有关node.js中名称解析的更详细说明,请参阅here。
修复很简单,只需将完整的服务名称传递给您的客户端:
const client = new cassandra.Client({ contactPoints: ['cassandra.default.svc.cluster.local:9042'], localDataCenter: 'datacenter1', keyspace: 'auth_server' });
https://stackoverflow.com/questions/55180149
复制相似问题