2017-05-02 85 views
1

我有一個在本地運行的minikube集羣(v0.17.1),有兩個部署:一個是Redis實例,另一個是試圖連接到Redis實例的自定義應用程序。我的配置或多或少從官方文檔和Kubernetes guestbook example複製/粘貼。Kubernetes不提供服務

服務定義和部署:

apiVersion: v1 
kind: Service 
metadata: 
    name: poller-redis 
    labels: 
    app: poller-redis 
    tier: backend 
    role: database 
    target: poller 
spec: 
    selector: 
    app: poller 
    tier: backend 
    role: service 
    ports: 
    - port: 6379 
    targetPort: 6379 

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: poller-redis 
spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: poller-redis 
     tier: backend 
     role: database 
     target: poller 
    spec: 
     containers: 
     - name: poller-redis 
     image: gcr.io/jmen-1266/jmen-redis:a67b5f4bfd8ea8441ed66a8fcb6596f276017a1c 
     ports: 
     - containerPort: 6379 
     env: 
     - name: GET_HOSTS_FROM 
      value: dns 
     imagePullSecrets: 
     - name: gcr-json-key 

應用程序部署:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: poller 
spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: poller 
     tier: backend 
     role: service 
    spec: 
     containers: 
     - name: poller 
     image: gcr.io/jmen-1266/poller:a96a452292e894e46339309cc024cac67647cc25 
     imagePullPolicy: Always 
     imagePullSecrets: 
     - name: gcr-json-key 

相關的(我希望)Kubernetes信息:

$ kubectl get services 
NAME   CLUSTER-IP EXTERNAL-IP PORT(S) AGE 
kubernetes  10.0.0.1  <none>  443/TCP 24d 
poller-redis 10.0.0.137 <none>  6379/TCP 20d 

$ kubectl get deployments 
NAME   DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 
poller   1   1   1   1   12d 
poller-redis 1   1   1   1   4d 

$ kubectl get endpoints 
NAME   ENDPOINTS   AGE 
kubernetes  10.0.2.15:8443  24d 
poller-redis 172.17.0.7:6379  20d 

裏面的poller吊艙(自定義應用程序),我爲Redis創建了環境變量:

# env | grep REDIS 
POLLER_REDIS_SERVICE_HOST=10.0.0.137 
POLLER_REDIS_SERVICE_PORT=6379 
POLLER_REDIS_PORT=tcp://10.0.0.137:6379 
POLLER_REDIS_PORT_6379_TCP_ADDR=10.0.0.137 
POLLER_REDIS_PORT_6379_TCP_PORT=6379 
POLLER_REDIS_PORT_6379_TCP_PROTO=tcp 
POLLER_REDIS_PORT_6379_TCP=tcp://10.0.0.137:6379 

但是,如果我嘗試連接到該端口,我不能。做類似:

nc -vz poller-redis 6379 

失敗。

我注意到,我無法通過它的ClusterIP訪問Redis服務,但我可以通過運行Redis的pod的IP。

有什麼想法嗎?

+0

如何設置你的redis?你是否正確設置了身份驗證?你有沒有嘗試使用Redis客戶端連接?在嘗試重現您的問題時,我發現'nc'不起作用,但redis客戶端可以正常工作,但返回'(錯誤)NOAUTH身份驗證要求。「 – Rod

+0

您是否已經部署了集羣網絡?像織網,法蘭絨或類似的東西?你可以包含輸出'kubectl get pod,svc,ep,deploy,rc --all-namespaces'嗎?如果可以從另一個容器連接'10.0.0.137:6379'(不使用名稱),你還可以測試嗎? –

回答

0

最終發現,看起來我誤解了服務選擇器在Kubernetes中的工作方式。

我已經發布,我的服務定義爲:

apiVersion: v1 
kind: Service 
metadata: 
    name: poller-redis 
    labels: 
    app: poller-redis 
    tier: backend 
    role: database 
    target: poller 
spec: 
    selector: 
    app: poller 
    tier: backend 
    role: service 
    ports: 
    - port: 6379 
    targetPort: 6379 

的問題是,metadata.labelsspec.selector是不同的,當他們實際上應該是相同的。我仍然不完全明白爲什麼這是由Kubernetes文檔判斷的情況,但是你有它。現在我的服務定義是這樣的:

apiVersion: v1 
kind: Service 
metadata: 
    name: poller-redis 
    labels: 
    app: poller-redis 
    tier: backend 
    role: database 
    target: poller 
spec: 
    selector: 
    app: poller-redis 
    tier: backend 
    role: database 
    target: poller 
    ports: 
    - port: 6379 
    targetPort: 6379 

我現在還用直線上升DNS查找(即ping poller-redis),而不是試圖從我的目標吊艙連接到localhost:6379

0

這可能與kube-dns可能不運行有關。

從poller pod中可以驗證poller-redis能夠解析嗎?

以下是否從容器內工作?在kube-system運行

nc -v 10.0.0.137
+0

kube-dns是否應該在每個命名空間運行?它運行在'kube-system'中,但不是'default'(這是我正在使用的那個)。 – cgf

+0

不可以。你只需要在kube-system命名空間中有kube-dns。這是一個集羣服務。不要再部署它。 –

0

一個KUBE-DNS服務是不夠的。您是否在與redis服務具有相同namespace的pod中運行nc -vz poller-redis 6379poller-redis簡化了dns同名域中resdis服務的名稱。它不會在不同的命名空間中工作。 由於kube-dns在節點上不可用。因此,如果您想在節點中運行ncredisclient,請使用redis服務的clusterIP替換DNS名稱。