【发布时间】: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