在Kubernetes Pod中如何在运行守护进程和其他命令

40次阅读
没有评论

问题描述

在使用Kubernetes时,有一个需求是希望在Pod中运行守护进程和其他命令。他尝试了多种在部署文件中的语法,但是遇到了问题。他希望找到一种方法,在守护进程(influxd)启动后运行其他命令(influx setup),并保持容器运行。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Kubernetes中,可以使用Job API来创建一个只运行一次的容器,用于执行临时任务。你可以将守护进程和其他命令分别放在一个Deployment和一个Job中。以下是一个示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: influxdb
  namespace: influxdb
spec:
  selector:
    matchLabels:
      app: influxdb
  replicas: 1
  template:
    metadata:
      labels:
        app: influxdb
    spec:
      volumes:
        - name: influxdb-data
          persistentVolumeClaim:
            claimName: nfs-pvc-influx
      containers:
        - name: influxdb-daemon
          image: influxdb:2.0.7
          volumeMounts:
            - mountPath: /home/influxdb/
              name: influxdb-data
          env:
            - name: INFLUXD_CONFIG_PATH
              value: /etc/influxdb2/
          ports:
            - containerPort: 8086
              name: pbe
              protocol: TCP
---
apiVersion: batch/v1
kind: Job
metadata:
  name: influxdb-init
  namespace: influxdb
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: influxdb-init
          image: influxdb:2.0.7
          command:
            - sh
            - "-c"
            - |
              sleep 15
              influx setup --host http://influxdb-nodeport.influxdb.svc.cluster.local:8086 --org organistation1 --bucket dummy --username user --password user --token token --force && exit
      backoffLimit: 0

在上面的示例中,我们定义了一个Deployment和一个Job。Deployment用于运行守护进程(influxdb-daemon),Job用于运行其他命令(influxdb-init)。Deployment和Job分别属于同一个命名空间(influxdb)。
请注意,Deployment和Job的配置可能需要根据你的实际情况进行调整。在Job中,我们使用了sleep命令来等待守护进程完全启动,然后再运行其他命令。你可以根据需要调整等待时间。

方案2

请注意以下操作注意版本差异及修改前做好备份。
另一种方法是在部署文件中使用多个入口点。以下是一个示例,用于设置Nginx反向代理:
首先创建一个脚本,用于执行配置:

envsubst '${NODE_NAME}' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf
exec "$@"

然后在Dockerfile中将脚本添加到容器中:

FROM nginx
ADD docker-entrypoint.sh /ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

将脚本设置为ENTRYPOINT,这将在容器内创建配置文件。然后启动Nginx并使用所需的配置。
请注意,这种方法可能不适用于influx,但对于“配置和运行”容器来说是一种干净的选择。
以上是两种解决方案,你可以根据实际情况选择适合你的方法。希望对你有帮助!

正文完