docker - 在 kubernetes 中具有持久容量的 redisinsights
问题描述
我有以下.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 运行如何正常工作。
解决方案
更新:
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
推荐阅读
- javascript - 如何渲染不同颜色的点?
- lisp - Lisp `characterp` 每次都返回 nil
- node.js - 无法使用 Express-generator “npm start”
- sql - SQL 将数据拉到另一列 SUBSTRING CHARINDEX
- r - 读取 CSV 文件,遍历行,使用连接
- ios - 如何快速在现有类中添加变量?
- c# - options.UseOracle() 在 EF Core 中不可用
- excel - 网页抓取 ETF 每日数据 VBA
- javascript - 从现有的 base64 图像创建缩略图
- linux - 具有延迟线程的多线程应用程序的 stdout/stderr 的 QProcess 输出