服务在 Kubernetes 中不可用
Service not available in Kubernetes
我在本地有一个 minikube 集群 运行 (v0.17.1),有两个部署:一个是 Redis 实例,一个是尝试连接到 Redis 实例的自定义应用程序。我的配置或多或少来自官方文档和 Kubernetes guestbook example copy/pasted。
服务定义和部署:
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
pod(自定义应用程序)内,我获取了为 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 服务,但我可以通过 pod 运行 Redis 的 IP 访问。
有什么想法吗?
可能与 kube-dns 有关,可能与 运行 无关。
您可以从 poller pod 内部验证 poller-redis 是否解析了吗?
以下是否在容器内部工作?
nc -v 10.0.0.137
在 kube-system
中 运行 一个 kube-dns 服务就足够了。 运行 nc -vz poller-redis 6379
in pods 有没有和redis服务一样的namespace
?
poller-redis
是同一命名空间中 resdis 服务的简化 dns 名称。它不会在不同的命名空间中工作。
由于 kube-dns 在节点上不可用。所以如果你想运行nc
或者redisclient
在节点中,请使用redis服务的clusterIP
替换dns名称。
最后弄明白了,看来我误解了服务选择器在 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.labels
和 spec.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
),而不是尝试从我的目标 pods.
连接到 localhost:6379
我在本地有一个 minikube 集群 运行 (v0.17.1),有两个部署:一个是 Redis 实例,一个是尝试连接到 Redis 实例的自定义应用程序。我的配置或多或少来自官方文档和 Kubernetes guestbook example copy/pasted。
服务定义和部署:
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
pod(自定义应用程序)内,我获取了为 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 服务,但我可以通过 pod 运行 Redis 的 IP 访问。
有什么想法吗?
可能与 kube-dns 有关,可能与 运行 无关。
您可以从 poller pod 内部验证 poller-redis 是否解析了吗?
以下是否在容器内部工作?
nc -v 10.0.0.137
在 kube-system
中 运行 一个 kube-dns 服务就足够了。 运行 nc -vz poller-redis 6379
in pods 有没有和redis服务一样的namespace
?
poller-redis
是同一命名空间中 resdis 服务的简化 dns 名称。它不会在不同的命名空间中工作。
由于 kube-dns 在节点上不可用。所以如果你想运行nc
或者redisclient
在节点中,请使用redis服务的clusterIP
替换dns名称。
最后弄明白了,看来我误解了服务选择器在 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.labels
和 spec.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
),而不是尝试从我的目标 pods.
localhost:6379