我有以下.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试图将port读为int,但是不知何故获取了字符串并且感到困惑。但是我不明白这在本地docker运行中如何工作。

最佳答案

更新:
RedisInsight的kubernetes documentation最近已更新。它清楚地描述了如何在有服务和无服务的情况下创建RedisInsight k8s部署。
IT也explains当已经有一个名为“redisinsight”的服务时该怎么办:


问题在于服务的名称。
documentation中,提到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

07-24 13:07