首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Mac上连接到Cassandra时出现K8s问题(通过Node.js)

在Mac上连接到Cassandra时出现K8s问题(通过Node.js)
EN

Stack Overflow用户
提问于 2019-03-15 18:09:06
回答 1查看 344关注 0票数 2

当尝试在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地址)时,它确实起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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' });
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55180149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档