在kubernetes中按服务名访问redis

zlhcx6iw  于 2021-06-08  发布在  Redis
关注(0)|答案(2)|浏览(418)

我在kubernetes中创建了一个redis部署和服务,我可以通过服务ip从另一个pod访问redis,但是不能通过服务名称访问它
redis yaml酒店

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  namespace: myapp-ns
spec:
  replicas: 1
  selector:
    matchLabels:
      component: redis
  template:
    metadata:
      labels:
        component: redis
    spec:
      containers:
        - name: redis
          image: redis
          ports:
            - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: myapp-ns
spec:
  type: ClusterIP
  selector:
    component: redis
  ports:
    - port: 6379
      targetPort: 6379
5vf7fwbs

5vf7fwbs1#

我应用了您的文件,并且我能够从同一个名称空间和不同的名称空间对服务执行ping和telnet操作。为了测试这一点,我在相同的命名空间和不同的命名空间中创建了pod,并安装了telnet和ping。然后我执行了以下测试:
相同的命名空间

kubectl exec -it <same-namespace-pod> /bin/bash

# ping redis

PING redis.<redis-namespace>.svc.cluster.local (172.20.211.84) 56(84) bytes of data.

# telnet redis 6379

Trying 172.20.211.84...
Connected to redis.<redis-namespace>.svc.cluster.local.
Escape character is '^]'.

不同的命名空间

kubectl exec -it <different-namespace-pod> /bin/bash

# ping redis.<redis-namespace>.svc.cluster.local

PING redis.test.svc.cluster.local (172.20.211.84) 56(84) bytes of data.

# telnet redis.<redis-namespace>.svc.cluster.local 6379

Trying 172.20.211.84...
Connected to redis.<redis-namespace>.svc.cluster.local.
Escape character is '^]'.

如果你不能做到这一点,由于dns解析问题,你可以看看你的 /etc/resolv.conf 确保它有搜索前缀 svc.cluster.local 以及 cluster.local

fcg9iug3

fcg9iug32#

我在kubernetes中创建了一个redis部署和服务,我可以通过服务ip从另一个pod访问redis,但是不能通过服务名称访问它
请记住,您可以使用 Service 访问后端的名称 Pods 它只在同一命名空间中公开。看着你的 Deployment 以及 Service yaml清单,我们可以看到它们被部署在 myapp-ns 命名空间。这意味着只有从 Pod 部署在此命名空间中,您可以访问 Service 用它的名字。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  namespace: myapp-ns ### ?
spec:
  replicas: 1
  selector:
    matchLabels:
      component: redis
  template:
    metadata:
      labels:
        component: redis
    spec:
      containers:
        - name: redis
          image: redis
          ports:
            - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: myapp-ns ### ?
spec:
  type: ClusterIP
  selector:
    component: redis
  ports:
    - port: 6379
      targetPort: 6379

所以如果你部署以下 Pod :

apiVersion: v1
kind: Pod
metadata:
  name: redis-client
  namespace: myapp-ns ### ?
spec:
  containers:
    - name: redis-client
      image: debian

您将能够访问 Service 因此,以下命令(前提是已安装所有必需的工具)将起作用:

redis-cli -h redis
telnet redis 6379

但是如果你的redis客户端 Pod 如果部署到完全不同的命名空间,则需要使用完全限定域名(fqdn),该域名是根据此处描述的规则生成的:

redis-cli -h redis.myapp-ns.svc.cluster.local
telnet redis.myapp-ns.svc.cluster.local 6379

相关问题