有时候我们在使用systemctl命令的时候,比如systemctlstartkube-apiserver,会提示错误:[root@vultrkubenetes]#systemctlstartkube-apiserverJobforkube-apiserver.servicefailedbecausethe控制进程以错误代码退出。有关详细信息,请参阅“systemctlstatuskube-apiserver.service”和“journalctl-xe”。根据提示,再次运行systemctlstatuskube-apiserver.service,提示类似:kube-apiserver.service-KubernetesAPIServiceLoaded:loaded(/usr/lib/systemd/system/kube-apiserver.service;disabled;供应商预设:禁用)活动:失败(结果:开始限制)自周五2018-07-2006:37:05UTC;1min17sagoDocs:https://github.com/GoogleCloudPlatform/kubernetesProcess:8208ExecStart=/usr/bin/kube-apiserver$KUBE_LOGTOSTDERR$KUBE_LOG_LEVEL$KUBE_ETCD_SERVERS$KUBE_API_ADDRESS$KUBE_API_PORT$KUBELET_PORT$KUBE_ALLOW_PRIV$KUBE_SERVICE_ADDRESSES$KUBE_ADMISSION_CONTROL$KUBE_API_ARGS(代码=退出,状态=203/EXEC)7月20日06:37:05vultr.guestsystemd[1]:kube-apiserver.service:主进程退出,code=exited,status=203/EXECJul2006:37:05vultr.guestsystemd[1]:无法启动KubernetesAPI服务。Jul2006:37:05vultr.guestsystemd[1]:单元kube-apiserver.service进入失败状态。7月20日06:37:05vultr.guestsystemd[1]:kube-apiserver.service失败。7月20日06:37:05vultr.guestsystemd[1]:kube-apiserver.serviceholdofftimeover,schedulingrestart.Jul2006:37:05vultr.guestsystemd[1]:kube-apiserver.service启动请求重复太快7月2006:37:05vultr.guestsystemd[1]:无法启动KubernetesAPI服务。7月20日06:37:05vultr.guestsystemd[1]:单元kube-apiserver.service进入失败状态。7月20日06:37:05vultr.guestsystemd[1]:kube-apiserver.servicefailed.注意看ExecStartExecStart=/usr/bin/kube-apiserver$KUBE_LOGTOSTDERR$KUBE_LOG_LEVEL$KUBE_ETCD_SERVERS$KUBE_API_ADDRESS$KUBE_API_PORT$KUBELET_PORT$KUBE_ALLOW_PRIV$KUBE_SERVICE_ADDRESSOLSSION$KUBE_SERVICE_ADDRESSOLSSION$KUBE_API_ADDRESS$KUBE_API_PORT$KUBE_ALLOW_PRIVKUBE_API_ARGS其实我们的调试思路是知道kube-apiserver这个命令加上后面的参数出错了,所以我们只要手动运行这个命令就会知道哪里出错了,但是这里的环境变量还是一个$KUBE_LOG_LEVEL之类的变量,没有编译,不容易调试和运行。这里有一个技巧,可以编辑你的系统服务的服务配置文件,并在服务选择中添加一个项目,类似于:ExecStartPre=/bin/bash-l-c'echo"/usr/bin/kube-apiserver$YOUR_ARGS">/tmp/systemctl.debug'实际运行时,将$YOUR_ASRGS替换成你在systemctlstatus后看到的参数。然后systemctldaemon-reload,启动服务后可以运行cat/tmp/systemctl.debug查看具体运行的命令,然后复制到命令行运行即可知道具体报错。
