使用kubernetes部署zookeeper服务时出错

时间:2018-03-13 12:17:56

标签: dns kubernetes

我在使用kubernetes在裸机群集中部署zookeeper服务时遇到以下错误。 kube-dns服务也在运行,但仍然无法识别zookeeper-1服务。

2018-03-13 12:11:32,217 [myid:3] - WARN  [QuorumPeer[myid=3]/0:0:0:0:0:0:0:0:2181:QuorumPeer$QuorumServer@155] - Failed to resolve address: zookeeper-1
java.net.UnknownHostException: zookeeper-1: Name or service not known
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
        at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:922)
        at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1316)
        at java.net.InetAddress.getAllByName0(InetAddress.java:1269)
        at java.net.InetAddress.getAllByName(InetAddress.java:1185)
        at java.net.InetAddress.getAllByName(InetAddress.java:1119)
        at java.net.InetAddress.getByName(InetAddress.java:1069)
        at org.apache.zookeeper.server.quorum.QuorumPeer$QuorumServer.recreateSocketAddresses(QuorumPeer.java:148)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:407)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:426)
        at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:843)
        at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:822)

我们如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

在StatefulSet中,在创建相关Pod之前,主机域名不存在。在这种情况下,这可能意味着Pod zookeeper-1尚不存在。

默认情况下,状态集中的Pod仅在前一个启动并且ReadinessProbe成功时启动。这可能表示zookeeper-0尚未就绪,因为它无法与zookeeper-1联系。可以通过将Pod Management Policy设置为Parallel来更改启动行为。

在集群节点相互连接之前,可能需要保持Zookeeper集群未准备好(即不获取任何流量)。同时,可能需要所有节点在实际准备好之前可以相互访问。我们解决了这个问题,为zookeeper引入了第二项服务,我们称之为zookeeper-discovery。这个注释service.alpha.kubernetes.io/tolerate-unready-endpoints设置为true,这意味着它忽略了这种情况下的准备情况。所有相关服务仍使用默认服务zookeeper。在statefulset中使用zookeeper-discovery服务非常重要:

---
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
  name: zookeeper-discovery
  labels:
    app: zookeeper
spec:
  clusterIP: None
  selector:
    app: zookeeper
  ports:
  - port: 2181
    name: client
  - port: 2888
    name: peer
  - port: 3888
    name: leader-election
---
apiVersion: v1
kind: Service
metadata:
  name: zookeeper
  labels:
    app: zookeeper
spec:
  selector:
    app: zookeeper
  ports:
  - port: 2181
    name: client
---
apiVersion: apps/v1beta1
kind: StatefulSet

metadata:
  name: zookeeper
  labels:
    app: zookeeper

spec:
  serviceName: zookeeper-disovery
  replicas: 3

  template:
    metadata:
      name: zookeeper
      labels:
        app: zookeeper
    spec:
      containers:
<-- snip -->