2017-10-06 37 views
1

我在OpenShift/Kubernetes環境中運行Zookeeper。爲了可靠地保存配置數據,我將zookeeper設置爲StatefulSetZookeeper:主機名解析失敗

我通過主機名在我的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配置:

# 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 S,雖然:

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) 
... 

可能是什麼原因?我通過nslookup驗證了主機名(例如zookeeper-2.zookeeper-headless)可從其他吊艙獲得。

+0

你可能想看看官方的文檔關於如何在kubernetes中運行zookeeper:https://kubernetes.io/docs/tutorials/stateful-application/zookeeper/ – vascop

+0

我使用這個文檔來設置我的zookeeper合奏。 –

回答

1

我發現了針對此問題的工作解決方案。 ZooKeeper在啓動時讀取集合中的服務器列表並查找其「自己的」條目。然後它使用此條目來確定要偵聽的端口和接口。

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

因爲提供的主機名將解決爲127.0.0.1這臺機器上,ZooKeeper的將監聽本地迴環接口上,因此不接受其他的ZooKeeper服務器的連接。

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腳本,它將替換容器啓動時的一個「自己」條目。

編輯:作爲問的意見,這是我的ENTRYPOINT腳本,需要放置身份識別碼文件,並設置適當的主機名各zoo.cfg的護理:

#!/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

嗨弗蘭茲。我有同樣的問題。我想問你如何改變一個pod的特定服務器來解析它的本地主機。你也可以分享bash腳本嗎?這將非常有幫助。非常感謝 – Sibtain

+1

我將我的解決方案添加到了我的答案;) –

+1

非常感謝您的腳本。你能告訴我在哪裏運行這個腳本(initContainer或其他?)。對不起,我是Kubernetes的新手 – Sibtain