kubernetes-无法从kubernetes集群内部连接到redis pods

dzjeubhm  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(521)

我正在尝试连接到我的kubernetes集群中的一些redis pods,但是我无法让它工作。在连接到redis集群的程序中,我尝试使用服务名作为主机名来调用redis服务 redis-sentinel:26379 或者使用运行redis映像的3个pod中的端点的直接列表 10.0.10.:26379 . 我知道redis集群可以工作,因为我可以在docker/kubernetes之外运行我的程序,把redis sentinel服务变成一个nodeport,它可以连接并运行得很好。但我无法从kubernetes内部的其他豆荚连接到这个redis集群。
使用docker桌面作为我的kubernetes环境。
redis pod服务:

kind: Service
metadata:
  labels:
    name: sentinel
    role: service
  name: redis-sentinel
spec:
  ports:
    - port: 26379
      targetPort: 26379
  selector:
    redis-sentinel: "true"

redis sentinel控制器:

kind: ReplicationController
metadata:
  name: redis-sentinel
spec:
  replicas: 3
  selector:
    redis-sentinel: "true"
  template:
    metadata:
      labels:
        name: redis-sentinel
        redis-sentinel: "true"
        role: sentinel
    spec:
      containers:
      - name: sentinel
        image: k8s.gcr.io/redis:v1
        env:
          - name: SENTINEL
            value: "true"
        ports:
          - containerPort: 26379

redis主控制器:

kind: ReplicationController
metadata:
  name: redis
spec:
  replicas: 3
  selector:
    name: redis
  template:
    metadata:
      labels:
        name: redis
        role: master
    spec:
      containers:
      - name: redis
        image: k8s.gcr.io/redis:v1
        ports:
        - containerPort: 6379
        resources:
          limits:
            cpu: "0.1"
        volumeMounts:
        - mountPath: /redis-master-data
          name: data
      volumes:
        - name: data

@马特,试着打乒乓球 redis-sentinel 超时和 nc redis-sentinel 26379 似乎什么也没做。
@frankyuchenggu是的,dns服务正在运行,但似乎失败了。运行busybox映像在运行 nslookup redis-sentinel ```

**server can't find redis-sentinel.default.svc.cluster.local: NXDOMAIN

***Can't find redis-sentinel.svc.cluster.local: No answer
***Can't find redis-sentinel.cluster.local: No answer
***Can't find redis-sentinel.default.svc.cluster.local: No answer
***Can't find redis-sentinel.svc.cluster.local: No answer
***Can't find redis-sentinel.cluster.local: No answer

看起来busybox映像与 `nslookup` 命令。使用来自kubernetes dns调试页的dnsutils映像可以找到服务

$ kubectl exec -ti dnsutils -- nslookup redis-sentinel
Server: 10.96.0.10
Address: 10.96.0.10#53

Name: redis-sentinel.default.svc.cluster.local
Address: 10.110.45.31

然而,似乎尝试 `redis-sentinel.default.svc.cluster.local:26379` 或者 `10.110.45.31:26379` 也不起作用,我的程序仍然找不到redis集群。
cfh9epnr

cfh9epnr1#

我猜你在github上使用了这个教程。在部署您提供的yamls时,我遇到了许多无法连接的问题。在上面提到的教程中,您可以找到您首先必须创建的信息 Master Pod .
我们将使用共享网络名称空间来引导redis集群。特别是,第一个哨兵需要知道如何找到主人(随后的哨兵只需询问第一个哨兵)。因为pod中的所有容器都共享一个网络名称空间,sentinel只需查看$(hostname-i):6379。
那么 Service 后来呢 redis server . 一切就绪后,你只需删除这个豆荚。可以在这里找到快速部署步骤

$ kubectl get svc,pods -o wide
NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE   SELECTOR
service/kubernetes       ClusterIP   10.97.0.1      <none>        443/TCP     21h   <none>
service/redis-sentinel   ClusterIP   10.97.13.152   <none>        26379/TCP   71m   redis-sentinel=true

NAME                       READY   STATUS    RESTARTS   AGE   IP          NODE                                   NOMINATED NODE   READINESS GATES
pod/redis-6kb5p            1/1     Running   0          71m   10.32.2.7   gke-redis-default-pool-bc40bcaa-08sj   <none>           <none>
pod/redis-sentinel-qf9l8   1/1     Running   0          71m   10.32.1.5   gke-redis-default-pool-bc40bcaa-txmt   <none>           <none>
pod/redis-sentinel-rnsw6   1/1     Running   0          71m   10.32.2.8   gke-redis-default-pool-bc40bcaa-08sj   <none>           <none>
pod/redis-sentinel-sbn8f   1/1     Running   0          71m   10.32.1.7   gke-redis-default-pool-bc40bcaa-txmt   <none>           <none>
pod/redis-sq2g2            1/1     Running   0          71m   10.32.1.6   gke-redis-default-pool-bc40bcaa-txmt   <none>           <none>
pod/redis-wv5q2            1/1     Running   0          71m   10.32.1.8   gke-redis-default-pool-bc40bcaa-txmt   <none>           <none>

$ kubectl get ep
NAME             ENDPOINTS                                         AGE
redis-sentinel   10.32.1.5:26379,10.32.1.7:26379,10.32.2.8:26379   72m

此外,您还可以使用 Redis 3.x. 如何连接
跑步 Redis container ,执行命令

kubectl exec -ti <pod-name> -- redis-cli 

$ kubectl exec -ti redis-6kb5p redis-cli
127.0.0.1:6379> info

# Server

redis_version:2.8.19
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:f308ca06a4d63700

连接到 redis 使用 service ,你应该进入吊舱。

$ kubectl exec -ti redis-sentinel-qf9l8 /bin/bash

如果你检查一下 env 在这个容器中,您将能够找到一些kubernetes配置。

root@redis-sentinel-qf9l8:/data# env
HOSTNAME=redis-sentinel-qf9l8
REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-2.8.19.tar.gz
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT=tcp://10.97.0.1:443
TERM=xterm
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_HOST=10.97.0.1
REDIS_SENTINEL_PORT_26379_TCP_ADDR=10.97.13.152
REDIS_SENTINEL_SERVICE_HOST=10.97.13.152

现在根据这里的脚本
master=$(redis cli-h${redis\u sentinel\u service\u host}-p${redis\u sentinel\u service\u port}
您可以使用kubernetes envs连接到服务。

root@redis-sentinel-qf9l8:/data# redis-cli -h ${REDIS_SENTINEL_SERVICE_HOST} -p ${REDIS_SENTINEL_SERVICE_PORT}
10.97.13.152:26379>

或使用特定信息 $ redis-cli -h <service-name> -p <service-port> ```
root@redis-sentinel-qf9l8:/data# redis-cli -h redis-sentinel -p 26379
redis-sentinel:26379>

作为附加信息。
你不能ping `service` 与 `ClusterIP` 因为它是由管理的虚拟地址 `kube-proxy` 守护进程。更多细节可以在官方文件中找到。

相关问题