问题描述
我正在为 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 正在覆盖 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