1

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

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 运行如何正常工作。

4

4 回答 4

3

更新:

RedisInsight 的kubernetes 文档最近更新了。它清楚地描述了如何创建带有和不带有服务的 RedisInsight k8s 部署。

IT 还解释了当已经存在名为“redisinsight”的服务时该怎么做:

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


问题在于服务的名称。

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

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

因此,当您尝试使用名称创建上述服务时redisinsight,Kubernetes 会传递服务环境变量REDISINSIGHT_PORT=<SERVICE_IP>:SERVICE_PORT。但是端口环境变量 ( REDISINSIGHT_PORT) 被记录为端口号而不是端点,当在 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
于 2020-09-02T12:16:02.660 回答
1

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

正如我们在 Redis 文档中所读到的,在Kubernetes 上安装 RedisInsight

  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

一旦服务接收到外部 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/ 。

于 2020-07-03T15:16:43.590 回答
0

它也发生在我身上。如果有人错过评论中的对话,这里是解决方案。

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

  2. 部署服务。

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

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

于 2020-08-20T02:37:04.250 回答
0

根据当前文档的建议,在 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. 建议使用 nodeport 进行服务 问题:这是一个安全漏洞 解决方案:使用 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 集群绝对是一场噩梦,而且它

于 2021-05-04T17:59:29.787 回答