当前位置: 首页 > 知识库问答 >
问题:

Kubernetes Redis群集问题

卜勇
2023-03-14

我试图在CentOS上使用kubernetes创建redis集群。我的kubernetes主服务器运行在一台主机上,而kubernetes从服务器运行在两台不同的主机上。

{ "Network": "172.30.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }
apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-master
  labels:
  app: redis
  role: master
  tier: backend
spec:
  replicas: 6
  template:
    metadata:
      labels:
        app: redis
        role: master
        tier: backend
    spec:
      containers:
      - name: master
        image: redis
        command: 
          - "redis-server"
        args:
          - "/redis-master/redis.conf"
        ports:
        - containerPort: 6379
        volumeMounts:
        - mountPath: /redis-master
          name: config
        - mountPath: /redis-master-data 
          name: data
        volumes:
        - name: data
          emptyDir: {}
        - name: config
          configMap:
            name: redis-config
            items:
            - key: redis-config
              path: redis.conf    

kubectl create-f RC.Yaml

NAME                           READY     STATUS    RESTARTS   AGE       IP            NODE
redis-master-149tt             1/1       Running   0          8s        172.30.96.4   centos-minion-1
redis-master-14j0k             1/1       Running   0          8s        172.30.79.3   centos-minion-2
redis-master-3wgdt             1/1       Running   0          8s        172.30.96.3   centos-minion-1
redis-master-84jtv             1/1       Running   0          8s        172.30.96.2   centos-minion-1
redis-master-fw3rs             1/1       Running   0          8s        172.30.79.4   centos-minion-2
redis-master-llg9n             1/1       Running   0          8s        172.30.79.2   centos-minion-2

使用的Redis-config文件

appendonly yes
cluster-enabled yes
cluster-config-file /redis-master/nodes.conf
cluster-node-timeout 5000
dir /redis-master
port 6379

我使用以下命令创建kubernetes服务。

Name:           redis-service
Namespace:      default
Labels:         app=redis
                role=master
                tier=backend
Selector:       app=redis,role=master,tier=backend
Type:           NodePort
IP:             10.254.229.114
Port:           <unset> 6379/TCP
NodePort:       <unset> 30894/TCP
Endpoints:      172.30.79.2:6379,172.30.79.3:6379,172.30.79.4:6379 + 3     more...
Session Affinity:   None
No events.

./redis-trib.rb创建-副本1 172.30.79.2:6379 172.30.79.3:6379 172.30.79.4:6379 172.30.96.2:6379 172.30.96.3:6379 172.30.96.3:6379 172.30.96.4:6379

Redis集群按预期创建,下面的消息

[OK] All 16384 slots covered.

现在,我应该能够从网络中的任何主机访问kubernetes节点IP(192.168.240.116)和nodePort(30894)上的redis-cluster。当我从一个kubernetes节点执行下面的命令时,一切都按预期进行。

Redis-CLI-P 30894-H 192.168.240.116-C

192.168.240.116:30894> set foo bar
-> Redirected to slot [12182] located at 172.30.79.4:6379
OK
172.30.79.4:6379> 

当我从同一个网络中的不同(非Kubernetes)节点运行同一个命令时,我会看到连接超时错误。

Redis-CLI-C-P 30894-H 192.168.240.116

192.168.240.116:30894> set foo bar
-> Redirected to slot [12182] located at 172.30.79.4:6379
Could not connect to Redis at 172.30.79.4:6379: Connection timed out

当使用NodePort服务类型公开时,是否不可能访问kubernetes集群网络之外的redis-cluster?

我为这个问题纠结了好一阵子了。有人能建议我应该使用什么方法来访问网络之外的redis-cluster吗?

谢谢

共有1个答案

闻人飞翼
2023-03-14

运行./redis-trib.rb create--replicas 1 172.30.79.2:6379 172.30.79.3:6379 172.30.79.4:6379 172.30.96.2:6379 172.30.96.3:6379 172.30.96.4:6379对此设置没有意义。

端口6379只能通过您使用的服务访问,而不能在尝试时直接访问。这就是为什么在尝试使用设置时会遇到问题。

您可以做的是使用每个POD自己的服务公开每个POD,并有一个额外的集群服务来加载平衡外部请求。如Kelsey Hightower的示例存储库所示。这样,POD可以通过内部公开的端口进行通信,(外部)客户端可以使用loadbalanced集群端口。这意味着每个POD都需要自己的副本集(或部署)。Kelsey在YouTube上有一个长篇大论,解释了这个设置--YouTube/SlideShare。

另一种选择是使用单个redis主程序,如其他示例所示。

 类似资料:
  • 第一次使用 kubectl 访问 如果您是第一次访问 Kubernetes API 的话,我们建议您使用 Kubernetes 命令行工具:kubectl。 为了访问集群,您需要知道集群的地址,并且需要有访问它的凭证。通常,如果您完成了入门指南那么这些将会自动设置,或者其他人为您部署的集群提供并给您凭证和集群地址。 使用下面的命令检查 kubectl 已知的集群的地址和凭证: $ kubectl

  • 根据用户部署和暴露服务的方式不同,有很多种方式可以用来访问 kubernetes 集群。 最简单也是最直接的方式是使用 kubectl 命令。 其次可以使用 kubeconfig 文件来认证授权访问 API server。 通过各种 proxy 经过端口转发访问 kubernetes 集群中的服务 使用 Ingress,在集群外访问 kubernetes 集群内的 service

  • 在服务器2上 当我用以下命令启动服务器1时:sudo service mysql start--wsrep-new-cluster它启动得很好,如果我打开mysql并检查wsrep的状态,它会说一切都启动并运行,这很好,但是当我试图在第二台服务器上启动sudo service mysql时,我在错误日志中得到以下结果: 我不知道为什么第二台服务器不能检测到集群正在启动和运行。这些机器可以很好地相互

  • 问题内容: 我对SQL(Server2008)的较低层次的了解是有限的,现在我们的DBA对此提出了挑战。让我解释一下这种情况:(我已经提到一些明显的陈述,希望我是对的,但是如果您发现有问题,请告诉我)。 我们有一张桌子,上面放着人们的“法院命令”。创建表(名称:CourtOrder)时,我的创建方式如下: 然后,我将非聚集索引应用于主键(以提高效率)。我的理由是,这是一个唯一字段(主键),应该像我

  • Cluster Cluster.EdsClusterConfig Cluster.OutlierDetection Cluster.LbSubsetConfig Cluster.LbSubsetConfig.LbSubsetSelector Cluster.LbSubsetConfig.LbSubsetFallbackPolicy (Enum) Cluster.RingHashLbConfig C

  • 在 Kubernetes 集群内访问 TiDB 时,使用 TiDB service 域名 ${cluster_name}-tidb.${namespace} 即可。 若需要在集群外访问,则需将 TiDB 服务端口暴露出去。在 TidbCluster CR 中,通过 spec.tidb.service 字段进行配置: spec: ... tidb: service: ty