Kubernetes,在同一集群中运行两个redis pod会导致问题,单独运行其中一个会完美运行

muk1a3rh  于 8个月前  发布在  Redis
关注(0)|答案(1)|浏览(84)

在我的Kubernetes集群中,我管理四个部署:

  • Laravel队列工人:标签是拉拉威尔·库贝·工人。
  • Django Queue Workers:标签为django-kube-worker
  • Laravel Redis示例:标记为拉拉威尔·库贝·工人·瑞迪斯。
  • Django Redis示例:标签是Django-Kube-Worker-Redis。

我的目标是将Laravel worker pod连接到其对应的Redis示例,以处理存储在那里的队列作业。类似地,我尝试对Django队列worker pod和它们的Redis对等体做同样的事情。
单独来说,Laravel和Django的部署都能完美地工作。Laravel无缝填充和处理队列,Django也是如此。但是,当两组部署同时运行时会出现问题:工作pod间歇性地无法连接到它们各自的Redis pod。这种不一致令人费解。
我偶尔会成功建立连接,但它不一致或不可靠。(时间跨度约为15秒)。

我还注意到两个Redis配置之间没有冲突的行为。下面是Laravel Redis部署的配置文件。包含在((....))中的任何内容都表示Django Redis部署的等效配置。
Laravel redis deployment.yml:

apiVersion: v1
kind: Service
metadata:
  name: laravel-kube-worker-redis  (( django-kube-worker-redis ))
  labels:
    tier: backend
    layer: redis
spec:
  ports:
    - port: 6379  (( 6380 ))
      targetPort: 6379  (( 6380 ))
      nodePort: 32379  (( 32380 ))
      protocol: TCP
  selector:
    tier: backend
    layer: redis
  type: NodePort

Laravel Redis持久-体积-声称.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: laravel-kube-worker-redis  (( django-kube-worker-redis ))
spec:
  storageClassName: do-block-storage 
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Laravel redis statefulset.yml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: laravel-kube-worker-redis  (( django-kube-worker-redis ))
  labels:
    tier: backend
    layer: redis
spec:
  serviceName: laravel-kube-worker-redis  (( django-kube-worker-redis ))
  selector:
    matchLabels:
      tier: backend
      layer: redis
  replicas: 1
  template:
    metadata:
      labels:
        tier: backend
        layer: redis
    spec:
      containers:
        - name: redis
          image: redis:alpine
          command: ["redis-server", "--appendonly", "yes", "--bind", "0.0.0.0"]
          ports:
            - containerPort: 6379  (( 6380 ))
              name: web
          volumeMounts:
            - name: redis-aof
              mountPath: /data
          resources:
            requests:
              memory: "1048Mi" # Set the minimum memory request
            limits:
              memory: "4096Mi" # Set the maximum memory limit
      volumes:
        - name: redis-aof
          persistentVolumeClaim:
            claimName: laravel-kube-worker-redis  (( django-kube-worker-redis ))

值得注意的是,Django Redis中的所有标签都有不同的key:价值观
我还想指出的是,在Laravel worker pod中,我使用laravel-kube-worker-redis:6379连接到Redis环境。
此外,在检查pod、services和statefsets状态时,一切似乎都井然有序。Redis pod没有强制重启,所有配置都符合我的示例中描述的内容。

klh5stk1

klh5stk11#

apiVersion: v1
kind: Service
....

  # HERE IS YOUR PROBLEM
  selector:
    tier: backend
    layer: redis
  type: NodePort

您的两个服务都路由到 * 两个 * Redis部署。服务使用Pod上的标签来确定是否应路由到Pod。您正在使用相同的标签启动两个redis部署,并且还使用相同的选择器配置每个服务...
简而言之,您需要:

apiVersion: v1
kind: Service
metadata:
  name: laravel-kube-worker-redis
spec:
  ports:
    - port: 6379
      targetPort: 6379
      nodePort: 32379
      protocol: TCP
  selector:
    tier: backend
    layer: laravel-redis # more specific!
  type: NodePort
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: laravel-kube-worker-redis
  labels:
    tier: backend
    layer: laravel-redis # more specific!
spec:
  serviceName: laravel-kube-worker-redis
  selector:
    matchLabels:
      tier: backend
      layer: laravel-redis # more specific!

有关更多上下文,请参见https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/

相关问题