【问题标题】:kubernetes services stuck in not readykubernetes 服务卡在没有准备好
【发布时间】:2017-05-30 16:08:46
【问题描述】:

我有一个正在运行的容器,显示正在运行但尚未准备好,我终其一生都无法弄清楚出了什么问题。我在运行 kubectl server 1.64 和 kubectl client 1.62 的 google 容器引擎上

我的健康检查路由表明正在请求健康检查,尽管直接在 pod ip 而不是服务 ip 上。我这样说是因为当在不同的 pod 中时,我无法 curl 未准备好的服务。

当我查看下面包含的 yaml 文件时,似乎没有任何问题。我还包含了一些我运行过的命令及其输出。

在容器内,我可以确认秘密存在,因为我可以echo $MYSQL_USER 所以我知道它们正在被设置。

最后,我的 docker 文件非常简单,并且在端口 7000 上运行服务器,所以不确定是否可以。我究竟做错了什么?我该如何调试呢?

来自不同的 pod

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 虚拟机中

卷曲 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 获取 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>

服务和部署 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

码头文件

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

编辑

我还注意到,它仅在同时运行另一个服务时才显示未就绪。我看不出这两种服务之间有任何相似之处,所以我不确定两者的运行会如何冲突?两种服务都使用 configmap 并且有自己的秘密,但我不明白为什么会导致冲突。

【问题讨论】:

  • 你能发布 kubectl describe svc blahblah-service
  • @BaroudiSafwen 添加了
  • 你介意把kubectl get events也放上去吗?我还看到该服务被命名为blahblah-service,但在许多地方你只是将它称为blahblah?你检查过那个东西吗?
  • 你能显示另一个正在运行 yaml 文件的服务吗? kubectl get 事件也会有帮助,kubectl get 节点也会有帮助

标签: kubernetes google-kubernetes-engine kubectl


【解决方案1】:
  1. 您的服务名为 blahblah-service,但您尝试将其查询为 wget -qO- blahblah,这是 pod 的名称。不行,你应该叫它http://blahblah-service

  2. 你说:

    nslookup blahblah ...来自 GKE 虚拟机

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-01-20
    • 2021-02-23
    • 2018-05-05
    • 2020-11-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多