【问题标题】:Pilosa k8s pod crashloopbackoff with error "server : executable file not found in $PATH"Pilosa k8s pod crashloopbackoff 错误“服务器:$PATH 中找不到可执行文件”
【发布时间】:2021-02-22 14:06:23
【问题描述】:

我正在为 pilosa 准备舵图。安装图表后(或在创建部署时), pilosa pod 进入 CrashLoopBackOff。

这是为 k8s 部署渲染的 YAML 文件。

# Source: pilosa/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: RELEASE-NAME-pilosa
  labels:
    helm.sh/chart: pilosa-0.1.0
    app.kubernetes.io/name: pilosa
    app.kubernetes.io/instance: RELEASE-NAME
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: pilosa
      app.kubernetes.io/instance: RELEASE-NAME
  template:
    metadata:
      labels:
        app.kubernetes.io/name: pilosa
        app.kubernetes.io/instance: RELEASE-NAME
    spec:
      imagePullSecrets:
        - name: my-cr-secret
      serviceAccountName: default
      securityContext:
        {}
      initContainers:
        - command:
          - /bin/sh
          - -c
          - |
            sysctl -w net.ipv4.tcp_keepalive_time=600
            sysctl -w net.ipv4.tcp_keepalive_intvl=60
            sysctl -w net.ipv4.tcp_keepalive_probes=3
          image: busybox
          name: init-sysctl
          securityContext:
            privileged: true
      containers:
        - name: pilosa
          securityContext:
            {}
          image: "mycr.azurecr.io/pilosa:v1.4.0"
          imagePullPolicy: IfNotPresent
          command:
            - server
            - --data-dir
            - /data
            - --max-writes-per-request
            - "20000"
            - --bind
            - http://pilosa:10101
            - --cluster.coordinator=true
            - --gossip.seeds=pilosa:14000
            - --handler.allowed-origins="*"
          ports:
            - name: http
              containerPort: 10101
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          volumeMounts:
            - name: "pilosa-pv-storage"
              mountPath: /data
          resources:
            {}
      volumes:
      - name: pilosa-pv-storage
        persistentVolumeClaim:
          claimName: pilosa-pv-claim

当检查我发现的原因时:

$ kubectl describe pod pilosa-57cb7b8764-knsmw
.

.

Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  48s                default-scheduler  Successfully assigned default/pilosa-57cb7b8764-knsmw to 10.0.10.3
  Normal   Pulling    47s                kubelet            Pulling image "busybox"
  Normal   Pulled     45s                kubelet            Successfully pulled image "busybox"
  Normal   Created    45s                kubelet            Created container init-sysctl
  Normal   Started    45s                kubelet            Started container init-sysctl
  Normal   Pulling    45s                kubelet            Pulling image "mycr.azurecr.io/pilosa:v1.2.0"
  Normal   Pulled     15s                kubelet            Successfully pulled image "mycr.azurecr.io/pilosa:v1.2.0"
  Normal   Created    14s (x2 over 15s)  kubelet            Created container pilosa
  Warning  Failed     14s (x2 over 15s)  kubelet            Error: failed to start container "pilosa": Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"server\": executable file not found in $PATH": unknown
  Normal   Pulled     14s                kubelet            Container image "mycr.azurecr.io/pilosa:v1.2.0" already present on machine
  Warning  BackOff    10s                kubelet            Back-off restarting failed container

这意味着问题是它无法运行命令服务器:

 Error: failed to start container "pilosa": Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"server\": executable file not found in $PATH": unknown

但该命令在此处指定的 pilosa 中可用:https://www.pilosa.com/docs/latest/installation/

谁能帮我找到解决办法?

【问题讨论】:

    标签: kubernetes executable kubernetes-helm file-not-found pilosa


    【解决方案1】:

    这里的问题是 Kubernetes 覆盖了 Pilosa Docker 映像中的 ENTRYPOINT。 server 命令实际上是pilosa 的子命令,它之所以起作用,是因为 Pilosa Dockerfile 是如何定义命令的:

    ENTRYPOINT ["/pilosa"]
    CMD ["server", "--data-dir", "/data", "--bind", "http://0.0.0.0:10101"]
    

    因为您使用的是command: 声明,所以在调用容器时它会覆盖ENTRYPOINT 和CMD。

    我认为简单的解决方案是将command:替换为args:,我相信k8s将不再覆盖ENTRYPOINT。或者您也可以将/pilosa 添加到命令的前面。

    您还可以查看此 Pilosa 舵图,该图未维护但可能对您有用。请注意,它使用 StatefulSet 而不是 Deployment,这应该更适合 Pilosa:https://github.com/pilosa/helm

    【讨论】:

    • 是的,这样做之后 pod 仍然是 crashLoopBackOff 并出现错误:“错误:运行服务器:设置服务器:获取侦听器:net.Listen:侦听 tcp 10.96.146.102:10101:绑定:无法分配请求的地址”!
    • 保持绑定地址为--bind http://0.0.0.0:10101。您现在的表单可能正在尝试绑定到匹配服务的 IP 地址,这将不起作用。
    • @DavidMaze 我试过了。现在 pod 正在运行。但我其实并没有正确理解其背后的原因!并且,即使 Pod 正在运行,它仍然会给出错误日志“无法加入 10.96.183.208: dial tcp 10.96.193.108:14000: i/o timeout”。
    • 上述错误日志在使用 arg --gossip.seeds=0.0.0.0:14000 而不是 --gossip.seeds=pilosa:14000 时也得到了修复!为什么绑定到匹配服务的 IP 不起作用?我以前使用--bind http://pilosa:10101,它正在工作。不同的是,之前我使用的是 pilosa 图像v1.2.0,现在是v1.4.0。这是导致这个问题的原因吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多