库伯奈特的工作定义如下:
apiVersion: batch/v1
kind: Job
metadata:
name: redis-master
namespace: sandbox
labels:
app: redis
spec:
parallelism: 1
ttlSecondsAfterFinished: 10
template:
metadata:
labels:
app: redis
spec:
containers:
- name: master
image: redis
command: ["sh", "-c"]
args:
- redis-server
- sleep 10
- redis-cli RPUSH codes $(cat /data/codes)
env:
- name: MASTER
value: "true"
ports:
- containerPort: 6379
volumeMounts:
- name: codes
mountPath: /data/codes
subPath: codes
readOnly: true
volumes:
- name: codes
configMap:
name: codes
restartPolicy: Never当吊舱启动并运行时,redis是空的:
/deploy/base$ kubectl exec -it -n box redis-master-mbhrk -- /bin/sh
# redis-cli lrange codes 0 -1
(empty array)
#当队列码为空时,这个吊舱应该会杀死他。
另外,我在吊舱控制台中出现了一个错误。
can't access tty; job control turned off我如何将代码加载到redis?
发布于 2022-05-09 23:25:15
容器只运行一个命令。您已经将该命令设置为/bin/sh -c,并传递给它一个要运行的命令字符串(redis-server),以及两个附加的参数,这些参数在该命令字符串中可以看到为$0和$1。
您需要做的第一件事是将Redis服务器本身拆分为一个单独的容器,可能由StatefulSet管理(如果禁用持久性,则可能是部署)。您可以使用类似预先打包的Helm图表来简化部署。我们假设这种情况已经存在:
apiVersion: v1
kind: Service
metadata:
name: redis-server
...现在,您的作业只需要运行redis-cli RPUSH命令。由于使用命令替换的方式,这里确实需要一个shell。但是,由于您没有在这里运行Redis服务器,因此您不需要使用各种机器。
您可能可以将该职务写为:
apiVersion: batch/v1
kind: Job
metadata:
name: load-codes
namespace: sandbox
# labels:
# app: redis
spec:
template:
# metadata:
# labels:
# app: redis
spec:
containers:
- name: loader
image: redis
command:
- /bin/sh
- -c
- redis-cli -h redis-server RPUSH codes $(cat /data/codes)
volumeMounts:
- name: codes
mountPath: /data
readOnly: true
volumes:
- name: codes
configMap:
name: codes
restartPolicy: OnFailure您可能需要设置标签,这样它们就不会被主服务接收(因为pod没有运行Redis服务器)。我还将重新启动策略设置为OnFailure:如果pod由于某种原因而失败,可能是因为Redis服务器尚未可用,这将自动重新启动它,但如果成功,作业将被标记为“已完成”。
发布于 2022-05-11 07:47:18
问题出在
args:
- redis-server
- sleep 10命令redis -服务器是将redis服务器升级的命令。因此无法执行下一个命令,因为redis-server仍在运行。
https://stackoverflow.com/questions/72168861
复制相似问题