2

我有一个在本地运行的 minikube 集群(v0.17.1),有两个部署:一个是 Redis 实例,一个是尝试连接到 Redis 实例的自定义应用程序。我的配置或多或少是从官方文档和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

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

pollerpod(自定义应用程序)内部,我获得了为 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 服务,但我可以通过运行 Redis 的 pod 的 IP。

请问有什么想法吗?

4

3 回答 3

1

最后想通了这一点,看来我误解了服务选择器在 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.labelsspec.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),而不是尝试localhost:6379从我的目标 pod 连接。

于 2017-05-27T17:56:01.383 回答
0

它可能与 kube-dns 可能未运行有关。

您可以从 poller pod 内部验证 poller-redis 是否已解析?

以下是否从容器内部工作?

数控-v 10.0.0.137
于 2017-05-03T03:46:43.287 回答
0

运行一个 kube-dns 服务kube-system就足够了。您是否在与redis 服务 nc -vz poller-redis 6379相同的 pod 中运行?是同一命名空间中 resdis 服务的简化 dns 名称。它不会在不同的命名空间中工作。由于 kube-dns 在节点上不可用。所以如果你想在节点上运行,请使用redis服务替换dns名称。namespacepoller-redisncredisclientclusterIP

于 2017-05-11T06:56:03.313 回答