首页 > 解决方案 > Kubernetes中通过服务名访问redis

问题描述

我在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

标签: kubernetesredis

解决方案


我应用了您的文件,并且能够从同一命名空间和不同的命名空间对服务执行 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的 pod 以确保它具有搜索前缀svc.cluster.localcluster.local


推荐阅读