【问题标题】:redisinsights with persistent volume in kubernetes在 kubernetes 中具有持久容量的 redisinsights
【发布时间】:2023-03-30 09:37:01
【问题描述】:

我有以下 .yaml 文件要在 kubernetes 中安装 redisinsights,并支持持久性。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: redisinsight-storage-class
provisioner: 'kubernetes.io/gce-pd'
parameters:
  type: 'pd-standard'
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redisinsight-volume-claim
spec:
  storageClassName: redisinsight-storage-class
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redisinsight #deployment name
  labels:
    app: redisinsight #deployment label
spec:
  replicas: 1 #a single replica pod
  selector:
    matchLabels:
      app: redisinsight #which pods is the deployment managing, as defined by the pod template
  template: #pod template
    metadata:
      labels:
        app: redisinsight #label for pod/s
    spec:
      initContainers:
        - name: change-data-dir-ownership
          image: alpine:3.6
          command:
            - chmod
            - -R
            - '777'
            - /db
          volumeMounts:
            - name: redisinsight
              mountPath: /db
      containers:
        - name: redisinsight #Container name (DNS_LABEL, unique)
          image: redislabs/redisinsight:1.6.1 #repo/image
          imagePullPolicy: Always #Always pull image
          volumeMounts:
            - name: redisinsight #Pod volumes to mount into the container's filesystem. Cannot be updated.
              mountPath: /db
          ports:
            - containerPort: 8001 #exposed conainer port and protocol
              protocol: TCP
      volumes:
        - name: redisinsight
          persistentVolumeClaim:
            claimName: redisinsight-volume-claim
---
apiVersion: v1
kind: Service
metadata:
  name: redisinsight
spec:
  ports:
    - port: 8001
      name: redisinsight
  type: LoadBalancer
  selector:
    app: redisinsight

但是,它无法启动并给出错误:

INFO 2020-07-03 06:30:08,117 redisinsight_startup Registered SIGTERM handler
ERROR 2020-07-03 06:30:08,131 redisinsight_startup Error in main()
Traceback (most recent call last):
  File "./startup.py", line 477, in main
ValueError: invalid literal for int() with base 10: 'tcp://10.69.9.111:8001'
Traceback (most recent call last):
  File "./startup.py", line 495, in <module>
  File "./startup.py", line 477, in main
ValueError: invalid literal for int() with base 10: 'tcp://10.69.9.111:8001'

但是同样的 docker 镜像,当通过 docker 在本地运行时:

docker run -v redisinsight:/db -p 8001:8001 redislabs/redisinsight

工作正常。我做错了什么?

感觉就像 redisinsights 试图将端口读取为 int 但不知何故得到一个字符串并且感到困惑。但我无法理解这在本地 docker 运行中如何正常工作。

【问题讨论】:

    标签: docker kubernetes redis redisinsights


    【解决方案1】:

    更新:

    RedisInsight 的kubernetes documentation 最近更新了。它清楚地描述了如何在有和没有服务的情况下创建 RedisInsight k8s 部署。

    IT 还 explains 当已经有名为“redisinsight”的服务时该怎么办:

    注意 - 如果部署将由名为“redisinsight”的服务公开,请设置 REDISINSIGHT_HOST 和 REDISINSIGHT_PORT 环境变量以覆盖服务创建的环境变量。


    问题在于服务的名称。

    documentation中提到,RedisInsight有一个环境变量REDISINSIGHT_PORT可以配置RedisInsight可以运行的端口。

    当您在 Kubernetes 中创建服务时,所有匹配该服务的 pod 都会获取一个环境变量 &lt;SERVICE_NAME&gt;_PORT=&lt;SERVICE_IP&gt;:&lt;SERVICE_PORT&gt;

    因此,当您尝试创建名称为redisinsight 的上述服务时,Kubernetes 会传递服务环境变量REDISINSIGHT_PORT=&lt;SERVICE_IP&gt;:SERVICE_PORT。但是端口环境变量 (REDISINSIGHT_PORT) 被记录为 port number 而不是 endpoint,当在 pod 上运行的 redisinsight 尝试使用时,这会使 pod 崩溃环境变量作为端口号。

    因此,将服务名称更改为不同的名称,而不是 redisinsight,它应该可以工作。

    这是一个快速部署和服务文件:

    部署:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: redisinsight #deployment name
      labels:
        app: redisinsight #deployment label
    spec:
      replicas: 1 #a single replica pod
      selector:
        matchLabels:
          app: redisinsight #which pods is the deployment managing, as defined by the pod template
      template: #pod template
        metadata:
          labels:
            app: redisinsight #label for pod/s
        spec:
          containers:
          - name:  redisinsight #Container name (DNS_LABEL, unique)
            image: redislabs/redisinsight:1.6.3 #repo/image
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - name: db #Pod volumes to mount into the container's filesystem. Cannot be updated.
              mountPath: /db
            ports:
            - containerPort: 8001 #exposed conainer port and protocol
              protocol: TCP
          volumes:
          - name: db
            emptyDir: {} # node-ephemeral volume https://kubernetes.io/docs/concepts/storage/volumes/#emptydir
    

    服务:

    apiVersion: v1
    kind: Service
    metadata:
      name: redisinsight-http # name should not be redisinsight 
    spec:
      type: LoadBalancer
      ports:
        - port: 80
          targetPort: 8001
      selector:
        app: redisinsight
    

    请注意服务的名称。

    redisinsight pod 的日志:

     INFO 2020-09-02 11:46:20,689 redisinsight_startup Registered SIGTERM handler
     INFO 2020-09-02 11:46:20,689 redisinsight_startup Starting webserver...
     INFO 2020-09-02 11:46:20,689 redisinsight_startup Visit http://0.0.0.0:8001 in your web browser. Press CTRL-C to exit.
    

    也是服务端点(来自 minikube):

    $ minikube service list                                                                              
    |----------------------|------------------------------------|--------------|-------------------------|
    |      NAMESPACE       |                NAME                | TARGET PORT  |           URL           |
    |----------------------|------------------------------------|--------------|-------------------------|
    | default              | kubernetes                         | No node port |
    | default              | redisinsight-http                  |           80 | http://172.17.0.2:30860 |
    | kube-system          | ingress-nginx-controller-admission | No node port |
    | kube-system          | kube-dns                           | No node port |
    | kubernetes-dashboard | dashboard-metrics-scraper          | No node port |
    | kubernetes-dashboard | kubernetes-dashboard               | No node port |
    |----------------------|------------------------------------|--------------|-------------------------|
    

    顺便说一句,如果您根本不想创建服务(与问题无关),您可以进行端口转发:

    kubectl port-forward <redisinsight-pod-name> 8001:8001
    

    【讨论】:

    • 我通过指定默认的“redisinsight”以外的部署名称(例如 redisinsight-gui),设法在 OpenShift 中解决了这个问题。
    【解决方案2】:

    问题与服务有关,因为它干扰了pod 导致它崩溃。

    我们可以在 Redis 文档中看到 Installing RedisInsight on Kubernetes

    1. 成功应用部署并完成部署后,访问 RedisInsight。这可以通过将部署公开为 K8s 服务或使用端口转发来实现,如下例所示:

    kubectl port-forward deployment/redisinsight 8001

    打开浏览器并指向 http://localhost:8001

    或者在您的情况下使用 GCP 的服务可能如下所示:

    apiVersion: v1
    kind: Service
    metadata:
      name: redisinsight
    spec:
      ports:
        - protocol: TCP
          port: 8001
          targetPort: 8001
          name: redisinsight
      type: LoadBalancer
      selector:
        app: redisinsight
    

    一旦服务收到 External-IP,您就可以使用它来访问 Redis。

    crou@cloudshell:~ $ kubectl get service
    NAME           TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)          AGE
    kubernetes     ClusterIP      10.8.0.1     <none>          443/TCP          9d
    redisinsight   LoadBalancer   10.8.7.0     34.67.171.112   8001:31456/TCP   92s
    

    在我的示例中通过http://34.67.171.112:8001/

    【讨论】:

    • 问题不在于服务,而在于部署。即使使用您的服务定义,我的 pod 也拒绝出现并崩溃并显示相同的错误日志。我看到你的豆荚已经很好了。你有其他的 yaml 还是和我的一样?如果重要,我在 GCP 中尝试过。
    • 我已经复制并粘贴了您的确切 yaml。并且只改变了服务。我看到了与您完全相同的错误,但在修复服务后它解决了。 Pod 将在初始化期间重试连接到我认为 3 次(不要引用我的话)的服务,之后它显示为已崩溃。您可以删除pod,这样deployment 将创建一个新的。
    • 我创建了一个新的 GCP 集群并在 paste.opensuse.org/15480276 应用了 yaml,它有你的服务。但是我的部署/吊舱仍然没有出现并给出同样的错误。另外,我希望该服务是loadBalancer,以便可以从外部访问。你能检查一下上面的sniper是否适合你吗?
    • @Sankar,我已经重写了我的答案,因为我发现问题出在其他地方。如果它们仍然存在问题,请告诉我。
    • 这不是 k8s 错误,这是 redisinsight pod 的问题。即使在他们的文档中,他们也说在成功部署 pod 后提供服务。
    【解决方案3】:

    这也发生在我身上。万一有人错过了 cmets 中的对话,这里是解决方案。

    1. 先部署redisinsight pod,等待它运行成功。

    2. 部署服务。

    我认为这是一个错误,它并没有真正起作用,因为 pod 随时可能死亡。这有点违背使用 Kubernetes 的原因。

    有人在这里报告了这个问题https://forum.redislabs.com/t/redisinsight-fails-to-launch-in-kubernetes/652/2

    【讨论】:

    • 那个人只是我 :-) 我在这里提出问题后报告了那里。这是 redisinsight 包装中的一个错误。但不幸的是,我们没有办法为 redisinsights 提交这个错误 :( 创建端口转发等的方式在 prod 设置中不可用。
    • @Sankar 干得好!我不明白他们为什么不直接使用 github 问题列表。我懒得创建一个帐户来报告这个问题。
    【解决方案4】:

    根据当前文档的建议,在 k8s 中运行 redisinsight 存在几个问题。我将在下面列出它们:

    1. 建议使用emptyDir 问题:Emptydir 很可能会用完更大的 redis 集群的空间 解决方案:使用持久卷
    2. redisinsight docker 容器使用 redisinsight 使用 问题:redisinsight 用户不绑定到特定的 uid。由于这个原因,不能以允许访问 pvc 的方式设置持久卷权限 解决方案:使用 cryptexlabs/redisinsight:latest 扩展 redislabs/redisinsight:latest 但将 redisinsight 的 uid 设置为 777
    3. 默认权限不允许redisinsight访问 问题:redisinsight 将无法访问 /db 目录 解决方法:使用init容器设置目录权限,让用户777拥有/db目录
    4. 建议使用节点端口进行服务 问题:这是一个安全漏洞 解决方案:改用 ClusterIP,然后使用 kubectl portforwarding 来获得对 redisinsight 的访问权限或其他安全访问权限
    5. 在本地访问 rdb 文件是不切实际的。 问题:大型集群的 rdb 文件必须通过 kubectl 下载和上传 解决方案:使用 s3 解决方案。如果您在 EKS 集群中使用 kube2iam,您需要创建一个可以访问存储桶的特殊角色。在此之前,您必须创建集群的备份,然后按照以下说明导出备份:https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/backups-exporting.html

    总结 Redisinsight 是一个很好的工具。但是目前运行它洞察 kubernetes 集群是一个绝对的噩梦,我 t

    【讨论】:

      猜你喜欢
      • 2021-04-22
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2018-01-12
      • 2020-06-02
      • 1970-01-01
      • 2015-02-02
      相关资源
      最近更新 更多