kubernetes服务陷入困境

时间:2017-05-30 16:08:47

标签: kubernetes google-kubernetes-engine kubectl

我有一个正在运行的容器,显示正在运行但尚未准备就绪,我不知道我的生活中有什么错误。我在谷歌容器引擎上运行kubectl服务器1.64和kubectl客户端1.62

我的健康检查路线表明正在请求健康检查,虽然直接在pod ip而不是服务ip上。我这样说是因为在不同的pod中,我无法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 get svc blahblah

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

kubectl获取端点blahblah-service

NAME                       ENDPOINTS   AGE
blahblah-service               29m

kubectl get pods -l name = blahblah

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

kubectl描述了svc blahblah-service

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>

服务&amp;部署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

修改

我还注意到,只有当另一个服务同时运行时才会显示未准备好。我没有看到两种服务之间有任何相似之处,所以我不确定两种服务的运行方式是否会发生冲突?这两种服务都使用配置图并有自己的秘密,但我不明白为什么会导致冲突。

1 个答案:

答案 0 :(得分:0)

  1. 您的服务名为blahblah-service,但您尝试将其查询为wget -qO- blahblah,这是该广告连播的名称。它不起作用,您应将其称为http://blahblah-service

  2. 你说:

      

    nslookup blahblah ...来自GKE VM

    预计这不会起作用,因为GKE VM的/etc/resolv.conf未配置为使用向群集提供DNS的kube-dns。这只适用于Pod。

  3. 尝试在群集中运行另一个pod,安装dig / nslookup并运行:

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

    您应该获取服务的IP地址。