首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从pod定义文件将代码加载到redis

从pod定义文件将代码加载到redis
EN

Stack Overflow用户
提问于 2022-05-09 08:14:07
回答 2查看 52关注 0票数 0

库伯奈特的工作定义如下:

代码语言:javascript
复制
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是空的:

代码语言:javascript
复制
/deploy/base$ kubectl exec -it -n box redis-master-mbhrk -- /bin/sh
# redis-cli lrange codes 0 -1
(empty array)
#

当队列码为空时,这个吊舱应该会杀死他。

另外,我在吊舱控制台中出现了一个错误。

代码语言:javascript
复制
can't access tty; job control turned off

我如何将代码加载到redis?

EN

回答 2

Stack Overflow用户

发布于 2022-05-09 23:25:15

容器只运行一个命令。您已经将该命令设置为/bin/sh -c,并传递给它一个要运行的命令字符串(redis-server),以及两个附加的参数,这些参数在该命令字符串中可以看到为$0$1

您需要做的第一件事是将Redis服务器本身拆分为一个单独的容器,可能由StatefulSet管理(如果禁用持久性,则可能是部署)。您可以使用类似预先打包的Helm图表来简化部署。我们假设这种情况已经存在:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: redis-server
...

现在,您的作业只需要运行redis-cli RPUSH命令。由于使用命令替换的方式,这里确实需要一个shell。但是,由于您没有在这里运行Redis服务器,因此您不需要使用各种机器。

您可能可以将该职务写为:

代码语言:javascript
复制
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服务器尚未可用,这将自动重新启动它,但如果成功,作业将被标记为“已完成”。

票数 1
EN

Stack Overflow用户

发布于 2022-05-11 07:47:18

问题出在

代码语言:javascript
复制
args:
  - redis-server
  - sleep 10

命令redis -服务器是将redis服务器升级的命令。因此无法执行下一个命令,因为redis-server仍在运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72168861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档