开发者社区> 问答> 正文

为什么为Pod注入Sidecar后,Pod处于init crash的状态

已解决

为Pod注入Sidecar之后,执行以下命令,查看Pod状态,发现Pod处于init crash的状态。

kubectl get pod

预期输出:

NAME                 READY       STATUS                    RESTARTS        AGE
details-v1-u****     0/2         Init:Error                1               12h
productpage-n****    0/2         Init:CrashLoopBackOff     3               12h

然后执行以下命令,查看istio-init容器日志。

kubectl --kubeconfig=${USER_KUBECONFIG} -c istio-init logs ${pod}

预期输出:

......
......
-A ISTIO_OUTPUT -d 127.0.**.**/32 -j RETURN
-A ISTIO_OUTPUT -d 192.168.0.1/32 -j RETURN
-A ISTIO_OUTPUT -j ISTIO_REDIRECT
COMMIT
2022-03-23T06:42:21.179567Z    info    Running command: iptables-restore --noflush /tmp/iptables-rules-1648017741179373856.txt4205119933
2022-03-23T06:42:21.185698Z    error    Command error output: xtables other problem: line 2 failed
2022-03-23T06:42:21.185720Z    error    Failed to execute: iptables-restore --noflush /tmp/iptables-rules-1648017741179373856.txt4205119933, exit status 1

可以看到istio-init容器日志包含Failed to execute: iptables-restore信息。

展开
收起
游客rda5n5ukztvu2 2022-10-27 17:06:04 101 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    问题原因

    检查是否曾经手动通过docker container rm/docker container prune/docker system prune等命令清理了已经退出的istio-init容器,或者是否存在清理容器的相应的定时任务。

    清理已退出的istio-init容器,会导致K8s检测到Pod关联的容器不存在,此时K8s会重新启动被删除的容器。由于之前已创建了iptables规则,istio-init容器不能再次执行iptables规则,导致新启动的istio-init容器设置iptables规则失败而崩溃。

    解决方案

    您需要重建Pod,重建后,服务的Pod将恢复正常状态。

    如果您下次仍然要使用命令或定时任务脚本清理数据,需要注意以下事项:

    • 如果您需要使用命令清理数据,您需要在批量清理数据命令中过滤istio-init容器,防止istio-init容器被清理。
    docker system prune --filter "label!=io.kubernetes.container.name=istio-init"
    • 如果您需要使用定时任务脚本清理istio-init容器,您需要在定时任务脚本中将docker system prune命令修改为以下命令,过滤istio-init容器,防止istio-init容器被清理。
    docker system prune --filter "label!=io.kubernetes.container.name=istio-init"
    2022-10-27 17:19:49
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载