kubernetes 种子提供者无法查找主机 cassandra-0.cassandra.default.svc.cluster.local

kubernetes Seed provider couldn't lookup host cassandra-0.cassandra.default.svc.cluster.local

aws 上的 Cassandra 集群无法启动。 报错如下

INFO [main] 2018-10-11 08:11:42,794 DatabaseDescriptor.java:729 - Back-pressure is disabled with strategy org.apache.cassandra.net.RateBasedBackPressure{high_ratio=0.9, factor=5, flow=FAST}.

WARN [main] 2018-10-11 08:11:42,848 SimpleSeedProvider.java:60 - Seed provider couldn't lookup host cassandra-0.cassandra.default.svc.cluster.local Exception (org.apache.cassandra.exceptions.ConfigurationException) encountered during startup: The seed provider lists no seeds. The seed provider lists no seeds. ERROR [main] 2018-10-11 08:11:42,851 CassandraDaemon.java:708 - Exception encountered during startup: The seed provider lists no seeds.

这是我的详细信息。

$kubectl get pods                                                                                                                                                                                   [13:48]
NAME          READY     STATUS             RESTARTS   AGE
cassandra-0   1/1       Running            0          19h
cassandra-1   0/1       CrashLoopBackOff   231        19h

$kubectl get services                                                                                                                                                                               [13:49]
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
cassandra    NodePort    100.69.201.208   <none>        9042:30000/TCP   1d
kubernetes   ClusterIP   100.64.0.1       <none>        443/TCP          15d

$kubectl get pvc                                                                                                                                                                                    [13:50]
NAME                            STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
cassandra-data-cassandra-0      Pending                                                                        fast           15d
cassandra-storage-cassandra-0   Bound     pvc-f3ff4203-c0a4-11e8-84a8-02c7556b5a4a   320Gi      RWO            gp2            15d
cassandra-storage-cassandra-1   Bound     pvc-1bc3f896-c0a5-11e8-84a8-02c7556b5a4a   320Gi      RWO            gp2            15d

$kubectl get namespaces                                                                                                                                                                             [13:53]
NAME          STATUS    AGE
default       Active    15d
kube-public   Active    15d
kube-system   Active    15d

甚至工作 pod 也没有加载存储。

它工作正常,直到我尝试将 MAX_HEAP_SIZE 从 1024M 更改为 2048M。

在那之后,即使我删除了所有旧的 pods 服务并重新创建,仍然无法正常工作。

您正在使用 NodePort 类型。这不会使该服务成为无头服务,这就是无法解析 pod 的 IP 地址的原因。

您需要做的是创建一个单独的无头服务。您还需要在入口点创建自己的 Docker 图像和 运行 脚本,该脚本将获取服务域名的所有 ips。

您可以看下面的项目为例:https://github.com/vyshane/cassandra-kubernetes/

我确实尝试过 Simon 的代码解决方案。但他给了我一个提示,它必须是一个无头的服务。但是在我的例子中,我通过添加 "clusterIP: None" 创建无头服务。它给出 "Seed provider couldn't lookup host" 没有这一行。 我找不到 pod(elassandra-0.elassandra.chargington.svc.cluster.local) 的 DNS,但我可以找到服务的 DNS(elassandra.chargington.svc.cluster.local).

Sometimes you don’t need or want load-balancing and a single service IP. In this case, you can create “headless” services by specifying "None" for the cluster IP (.spec.clusterIP).

https://kubernetes.io/docs/concepts/services-networking/service/

这是我的代码

apiVersion: v1 kind: Service metadata: labels: app: elassandra name: elassandra namespace: chargington spec: clusterIP: None ports: - name: cassandra port: 9042 - name: http port: 9200 - name: transport protocol: TCP port: 9300 selector: app: elassandra

在我的状态集中我需要设置 serviceName: elassandra。这是将 StatefulSet 指向将管理 pod 的 DNS 名称的域的服务所必需的。

--- api版本:"apps/v1beta1" 种类:StatefulSet 元数据: 姓名:埃拉桑德拉 命名空间:chargington 规格: 服务名称:elassandra 复制品:1 模板: 元数据: 标签: 应用程序:elassandra 规格: 容器: - 名称:艾拉桑德拉 图片:strapdata/elassandra:6.2.3.3 imagePullPolicy:如果不存在 端口: - 容器端口:7000 名称:节点内 - 容器端口:7001 名称:tls-节点内 - 容器端口:7199 姓名:jmx - 容器端口:9042 姓名:cql - 容器端口:9200 名称:http 协议:TCP - 容器端口:9300 名称:运输 协议:TCP 环境: - 姓名:CASSANDRA_SEEDS 值:elassandra-0.elassandra.chargington.svc.cluster.local - 姓名:MAX_HEAP_SIZE 价值:256M - 姓名:HEAP_NEWSIZE 价值:100M - 姓名:CASSANDRA_CLUSTER_NAME 值:"Cassandra" - 姓名:CASSANDRA_DC 值:"DC1" - 姓名:CASSANDRA_RACK 值:"Rack1" - 姓名:CASSANDRA_ENDPOINT_SNITCH 值:GossipingPropertyFileSnitch 卷挂载: - 名称:elassandra-data 挂载路径:/opt/elassandra-5.5.0.8/data volumeClaimTemplates: - 元数据: 名称:elassandra-data 注释: volume.beta.kubernetes.io/storage-class: ""<br> 规格: 访问模式:["ReadWriteOnce"] 资源: 要求: 存储:1Gi

如果还有其他人仍然面临种子提供程序无法查找主机 cassandra 的问题-0.cassandra.default.svc.cluster.local 异常

对我来说问题是域。我已将种子配置为:

cassandra-0.cassandra.<my-kube-namespace>.svc.<kube-domain>

在我们公司,k8s 集群部署有一个集群域——而不是默认设置,所以我不得不使用那个域,它开始为我工作。

要了解域,您可能需要联系您当地的 kube 管理员。