2017-05-30 102 views
0

我有一個正在運行的容器顯示正在運行,但還沒有準備好,我不能爲我的數字生活出了什麼問題。我在谷歌容器引擎上運行kubectl服務器1.64和kubectl客戶端1.62kubernetes服務卡在未準備好

我的健康檢查路由表明正在請求健康檢查,雖然直接在pod ip上而不是服務ip。我這樣說是因爲當在不同的吊艙內時,我無法對沒有準備好的服務進行curl

當我看到我下面包含的yaml文件時,沒有什麼似乎是錯誤的。我還包括了一些我已經運行的命令和它們的輸出。

在容器內,我可以確認存在的祕密,因爲我可以echo $MYSQL_USER,所以我知道他們正在設置。

最後,我的docker文件非常簡單,並在端口7000上運行服務器,因此不能確定這可能。我究竟做錯了什麼?我怎麼去調試呢?

從不同的莢

的wget -qO- blahblah

wget: can't connect to remote host (10.55.252.109): Operation timed out 

NSLOOKUP blahblah

nslookup: can't resolve '(null)': Name does not resolve 

Name:  blahblah-service 
Address 1: 10.55.252.109 blahblah-service.staging.svc.cluster.local 

從GKE VM內

捲曲10.55.252.109

Failed to connect to 10.55.252.109 port 80: Connection refused 

從我的終端:

kubectl得到SVC blahblah

NAME      CLUSTER-IP  EXTERNAL-IP PORT(S)  AGE 
blahblah-service 10.55.252.109 <nodes>  80:31003/TCP 41m 

kubectl獲得端點blahblah服務

NAME      ENDPOINTS AGE 
blahblah-service    29m 

kubectl得到莢-l名= blahblah

NAME           READY  STATUS RESTARTS AGE 
blahblah-3521139244-6tkj5 0/1  Running 0   29m 

kubectl描述SVC blahblah服務

Name:   blahblah-service 
Namespace:   staging 
Labels:   <none> 
Annotations:  <none> 
Selector:   name=blahblah 
Type:   NodePort 
IP:    10.55.252.109 
Port:   http 80/TCP 
NodePort:   http 31003/TCP 
Endpoints: 
Session Affinity:  None 
Events:   <none> 

服務&部署yamls

kind: Service 
apiVersion: v1 
metadata: 
    name: blahblah-service 
spec: 
    selector: 
    name: blahblah 
    type: NodePort 
    ports: 
    - port: 80 
     targetPort: "http" 
     name: http 

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: blahblah-deployment 
spec: 
    replicas: 1 
    minReadySeconds: 30 
    template: 
    metadata: 
     labels: 
     name: blahblah 
    spec: 
     containers: 
     - name: blahblah 
     image: eu.gcr.io/company_name/blahblah-service 
     ports: 
      - containerPort: 7000 
      name: http 
     readinessProbe: 
      httpGet: 
      path: /_internal_/ok 
      port: http 
     env: 
      - name: NODE_ENV 
      valueFrom: 
       configMapKeyRef: 
       name: env-variables 
       key: ENV_NAME 
      - name: MYSQL_USER 
      valueFrom: 
       secretKeyRef: 
       name: blahblah-mysql-secrets 
       key: MYSQL_USER 
      - name: MYSQL_PASS 
      valueFrom: 
       secretKeyRef: 
       name: blahblah-mysql-secrets 
       key: MYSQL_PASS 

dockerfile

FROM node:7.5.0-alpine 

RUN apk update && apk upgrade \ 
    && apk add --no-cache --update-cache git ca-certificates openssl\ 
    && update-ca-certificates 

RUN cd /tmp && wget https://yarnpkg.com/latest.tar.gz && tar zxf latest.tar.gz 

COPY package.json /workspace/package.json 
WORKDIR /workspace 
COPY yarn.lock /workspace/yarn.lock 
RUN /tmp/dist/bin/yarn 

COPY . /workspace 

ARG NODE_ENV=production 
ENV NODE_ENV ${NODE_ENV} 

ENV PORT 7000 

EXPOSE $PORT 

ENTRYPOINT exec node_modules/pm2/bin/pm2-docker start pm2.json --only blahblah-service-$NODE_ENV 

編輯

我還注意到,當其他服務在同一時間運行,這隻能說明沒有準備好。我沒有看到兩個服務之間有任何相似之處,所以我不確定兩者的運行方式會有什麼衝突?這兩個服務使用一個配置映射,並有他們自己的祕密,但我不明白爲什麼會導致衝突。

+0

您可以發佈kubectl描述SVC blahblah服務 –

+0

@BaroudiSafwen添加 –

+0

你介意把'kubectl得到events'呢?我也看到這個服務被命名爲'blahblah-service',但是在許多地方,你只是將它稱爲'blahblah'?你檢查過那個東西嗎? – surajd

回答

0
  1. 你的服務被稱爲blahblah-service,但你想查詢它作爲wget -qO- blahblah,這是窗格的名稱。它不會工作,你應該把它叫做http://blahblah-service

  2. 你說:

    NSLOOKUP blahblah ......從withing的GKE VM

    這不是預期的工作,因爲GKE VM的/etc/resolv.conf中沒有被配置爲使用向羣集提供DNS的kube-dns。這隻適用於Pod。

  3. 嘗試在集羣中運行的另一盒,安裝挖/ NSLOOKUP並運行:

    dig A blahblah-service.staging.svc.cluster.local 
    

    你應該得到的服務的IP地址。