2017-10-06 19 views
1

동물원을 OpenShift/Kubernetes 환경에서 실행하고 있습니다. 구성 데이터를 안정적으로 유지하기 위해 zookeeper를 StatefulSet으로 설정했습니다.동물원 : 호스트 이름 확인에 실패했습니다.

zoo.cfg에 호스트 이름으로 세 개의 서버를 구성했지만 시작시 호스트 이름 확인에 실패했습니다. 클러스터 내에서 nslookup을 사용하여 호스트 이름을 실제로 확인할 수 있음을 확인했습니다.

zoo.cfg : 내 OpenShift의

clientPort=2181 
dataDir=/var/lib/zookeeper/data 
dataLogDir=/var/lib/zookeeper/log 
tickTime=2000 
initLimit=10 
syncLimit=2000 
maxClientCnxns=60 
minSessionTimeout= 4000 
maxSessionTimeout= 40000 
autopurge.snapRetainCount=3 
autopurge.purgeInteval=0 
server.1=zookeeper-0.zookeeper-headless:2888:3888 
server.2=zookeeper-1.zookeeper-headless:2888:3888 
server.3=zookeeper-2.zookeeper-headless:2888:3888 

관련 부품 /는 Kubernetes 구성 다음이 될 수 무엇

2017-10-06 10:59:18,289 [myid:] - WARN [main:[email protected]] - Failed to resolve address: zookeeper-2.zookeeper-headless 
java.net.UnknownHostException: zookeeper-2.zookeeper-headless: No address associated with hostname 
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) 
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) 
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) 
    at java.net.InetAddress.getAllByName0(InetAddress.java:1276) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1192) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1126) 
    at java.net.InetAddress.getByName(InetAddress.java:1076) 
    at org.apache.zookeeper.server.quorum.QuorumPeer$QuorumServer.recreateSocketAddresses(QuorumPeer.java:148) 
    at org.apache.zookeeper.server.quorum.QuorumPeer$QuorumServer.<init>(QuorumPeer.java:133) 
    at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:228) 
    at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:140) 
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:101) 
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78) 
... 

:

# StatefulSet 
    - apiVersion: apps/v1beta1 
    kind: StatefulSet 
    metadata: 
     labels: 
     app: zookeeper 
     name: zookeeper 
    spec: 
     serviceName: zookeeper-headless 
     replicas: 3 
     template: 
     metadata: 
      labels: 
      app: zookeeper 
     spec: 
      containers: 
      - image: 172.30.158.156:5000/os-cloud-platform/zookeeper:latest 
       name: zookeeper 
       ports: 
       - containerPort: 2181 
        protocol: TCP 
        name: client 
       - containerPort: 2888 
        protocol: TCP 
        name: server 
       - containerPort: 3888 
        protocol: TCP 
        name: leader-election 
      dnsPolicy: ClusterFirst 
      schedulerName: default-scheduler 

    # Service 
    - apiVersion: v1 
    kind: Service 
    metadata: 
     labels: 
     app: zookeeper 
     name: zookeeper 
    spec: 
     ports: 
     - name: client 
      port: 2181 
      protocol: TCP 
      targetPort: 2181 
     selector: 
     app: zookeeper 
     sessionAffinity: None 
     type: ClusterIP 

    - apiVersion: v1 
    kind: Service 
    metadata: 
     name: zookeeper-headless 
     labels: 
     app: zookeeper 
    spec: 
     ports: 
     - port: 2888 
      name: server 
     - port: 3888 
      name: leader-election 
     clusterIP: None 
     selector: 
     app: zookeeper 

OpenShift 로그 UnknownHostException 생각들, 보여 원인? 다른 호스트에서 nslookup을 통해 호스트 이름 (예 : zookeeper-2.zookeeper-headless)을 사용할 수 있는지 확인했습니다.

+0

당신은 공식 문서를보고 할 수 있습니다 kubernetes에서 사육사를 운영하는 방법 : https://kubernetes.io/docs/tutorials/stateful-application/zookeeper/ – vascop

+0

이 문서를 사용하여 내 사육사 앙상블을 설정했습니다. –

답변

1

이 문제의 해결책을 찾았습니다. ZooKeeper는 시작시 앙상블에있는 서버 목록을 읽고 "자체"항목을 찾습니다. 그런 다음이 항목을 사용하여 수신 대기 할 포트와 인터페이스를 결정합니다. 제공된 호스트 이름이이 컴퓨터에 127.0.0.1을 해결할 수 있기 때문에

server.1=zookeeper-0.zookeeper-headless:2888:3888 
server.2=zookeeper-1.zookeeper-headless:2888:3888 
server.3=zookeeper-2.zookeeper-headless:2888:3888 

는 사육사는 다른 사육사 서버의 연결을 허용하지 않습니다 때문에 로컬 루프백 인터페이스에 귀를 기울이고 있습니다.

server.1=0.0.0.0:2888:3888 
server.2=zookeeper-1.zookeeper-headless:2888:3888 
server.3=zookeeper-2.zookeeper-headless:2888:3888 

클러스터의 작업을 자동화하기 위해 컨테이너 시작시 하나의 "자체"항목을 대체 할 bash 스크립트를 작성했습니다.

편집 :는 코멘트에 요청 여기에 각 zoo.cfg에 해당하는 호스트 이름을 대한 myid 파일을 배치하고 설정을 담당 내 ENTRYPOINT 스크립트이므로 :

#!/bin/bash 
# This script extracts the number out of the pod's hostname and sets it as zookeepers id. 

# Exact paths may vary according to your setup 
MYID_FILE="/var/lib/zookeeper/data/myid" 
ZOOCFG_FILE="/conf/zoo.cfg" 

# Create myid-file 
# Extract only numbers from hostname 
id=$(hostname | tr -d -c 0-9) 
echo $id > "${MYID_FILE}" 

# change own hostname to 0.0.0.0 
# otherwise, the own hostname will resolve to 127.0.0.1 
# https://stackoverflow.com/a/40750900/5764665 
fullHostname="$(hostname).zookeeper-headless" 
sed -i -e "s/${fullHostname}/0.0.0.0/g" "${ZOOCFG_FILE}" 

echo "Executing [email protected]" 
exec "[email protected]" 
+1

안녕하세요, Franz. 나는 같은 문제를 겪고있다. 포드의 특정 서버를 로컬 호스트로 변환하기 위해 어떻게 변경합니까? 또한 bash 스크립트를 공유 할 수 있습니까? 정말 도움이 될 것입니다. 고마워 많이 – Sibtain

+1

내 대답은 내 해결책을 추가;) –

+1

대단히 스크립트를 가져 주셔서 감사합니다. 이 스크립트 (initContainer 또는 뭔가?)를 어디에서 실행할 지 알려주십시오. 죄송합니다. Kubernetes를 처음 접했습니다. – Sibtain