簡體   English   中英

在 kubernetes 中使用持久卷重新分析

[英]redisinsights with persistent volume in kubernetes

我有以下.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 運行如何正常工作。

更新:

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

問題與服務有關,因為它干擾了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/在我的示例中。

它也發生在我身上。 如果有人錯過評論中的對話,這里是解決方案。

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

  2. 部署服務。

我認為這是一個錯誤,它並沒有真正起作用,因為 pod 隨時可能死亡。 這有點違背使用 Kubernetes 的原因。

有人在這里報告了這個問題https://forum.redislabs.com/t/redisinsight-fails-to-launch-in-kubernetes/652/2

根據當前文檔的建議,在 k8s 中運行 redisinsight 存在幾個問題。 我將在下面列出它們:

  1. 建議使用 emptyDir 問題:對於較大的 redis 集群,Emptydir 很可能會用完空間 解決方案:使用持久卷
  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 集群絕對是一場噩夢,而且它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM