DC/OS 1.10 及更高版本,和包 2.0.0-x 及更高版本
如果您正在使用 DC/OS 1.10 或更高版本,并且已安装服务的版本高于 2.0.0-x,那么卸载服务很简单。
从 DC/OS CLI,输入 dcos package uninstall --app-id=<service-name> hdfs
.
卸载过程
卸载服务包括以下步骤:
- 服务调度程序将重新启动,并且其环境变量
SDK_UNINSTALL
设置为“true”。这将使服务进入卸载模式。 - 服务调度程序执行卸载操作,操作如下:
- 服务的所有运行任务均被终止。
- 调度程序取消保留所有已保留资源。
- 警告:在保留的磁盘资源中存储的任何数据都将无法恢复。
- 所有已知资源都取消保留之后,调度程序的持久状态将被删除。
- 完成卸载过程之后,群集即会自动删除调度程序任务。
注意: 卸载操作开始后就不能取消,因为这可能使服务处于不确定的半销毁状态。
调试卸载
有些情况下,自动卸载过程需要手动干预才能完成。
僵尸服务调度程序
如果服务调度程序在其 stdout
中报告卸载完成,但调度程序未从系统中删除,您可以通过 Marathon 安全地删除它。
缺少 DC/OS 代理
如果无法取消以前保留的所有资源,服务将不会完成卸载。其常见原因是服务为其保留资源的一个 DC/OS 代理不再是 DC/OS 群集的组成部分。
-
如果代理仅因维护而暂时离开,服务将在代理返回群集时取消保留资源。
-
如果代理已永久删除,那么卸载将无限期挂起。防止此问题的最简单方法是:启动卸载之前在部署于缺失代理上的任何 pod 上执行
pod replace
。 -
如果仅在启动卸载后发现缺少的代理,则可以使用以下过程来完成卸载。
首先确定服务等待的资源。
- CLI:
dcos hdfs --name=hdfs plan show deploy
(必要时在运行dcos package install --cli hdfs
后) - HTTP:
https://yourcluster.com/service/hdfs/v1/plans/deploy
$ dcos hdfs --name=hdfs plan show deploy
deploy (IN_PROGRESS)
├─ kill-tasks (COMPLETE)
│ ├─ kill-task-node-0-server__1a4114bc-48bb-47f6-be99-1b5ca6d55c4e (COMPLETE)
│ ├─ kill-task-node-1-server__0c42118e-04fd-40e1-b49d-0d3f71d2d243 (COMPLETE)
│ └─ kill-task-node-2-server__e00cad38-f27f-4332-b1df-5118ca480d50 (COMPLETE)
├─ unreserve-resources (IN_PROGRESS)
│ ├─ unreserve-f41351a2-b478-4e13-a94c-705f530989ef (COMPLETE)
│ ├─ unreserve-48f64612-8427-4cde-86f4-4edeb9efff37 (COMPLETE)
│ ├─ unreserve-402d51f5-6014-4ca3-bd13-324dae62b888 (PENDING)
│ ├─ unreserve-cb95e869-277f-48b9-954f-08c0d7a26bcf (PENDING)
│ ├─ unreserve-cbd748d0-df7b-4d01-b0b7-6acf915d8f98 (COMPLETE)
│ ├─ unreserve-00ed63d6-427c-4492-9713-772390cc5241 (COMPLETE)
│ ├─ unreserve-5dd56b1d-4522-4bbd-88b5-de9fa0f181f2 (PENDING)
│ └─ unreserve-c9915f07-f446-4e14-a6b4-12c8dd2f914b (COMPLETE)
└─ deregister-service (PENDING)
└─ deregister (PENDING)
正如我们以上所看到的那样,一些要取消保留的资源被困在 PENDING
状态。我们可以强迫它们进入 COMPLETE
状态,从而允许调度程序完成卸载操作。这可以使用以下任一方法进行:
- CLI:
dcos hdfs --name=hdfs plan show deploy
- HTTP:
https://yourcluster.com/service/hdfs/v1/plans/deploy/forceComplete?phase=unreserve-resources&step=unreserve-<UUID>
$ dcos hdfs --name=hdfs plan force-complete deploy unreserve-resources unreserve-402d51f5-6014-4ca3-bd13-324dae62b888
$ dcos hdfs --name=hdfs plan force-complete deploy unreserve-resources unreserve-cb95e869-277f-48b9-954f-08c0d7a26bcf
$ dcos hdfs --name=hdfs plan force-complete deploy unreserve-resources unreserve-5dd56b1d-4522-4bbd-88b5-de9fa0f181f2
此时,调度程序应显示计划中这些步骤的 COMPLETE
状态,允许其继续正常进行卸载操作:
$ dcos hdfs --name=hdfs plan show deploy
deploy (IN_PROGRESS)
├─ kill-tasks (COMPLETE)
│ ├─ kill-task-node-0-server__1a4114bc-48bb-47f6-be99-1b5ca6d55c4e (COMPLETE)
│ ├─ kill-task-node-1-server__0c42118e-04fd-40e1-b49d-0d3f71d2d243 (COMPLETE)
│ └─ kill-task-node-2-server__e00cad38-f27f-4332-b1df-5118ca480d50 (COMPLETE)
├─ unreserve-resources (COMPLETE)
│ ├─ unreserve-f41351a2-b478-4e13-a94c-705f530989ef (COMPLETE)
│ ├─ unreserve-48f64612-8427-4cde-86f4-4edeb9efff37 (COMPLETE)
│ ├─ unreserve-402d51f5-6014-4ca3-bd13-324dae62b888 (COMPLETE)
│ ├─ unreserve-cb95e869-277f-48b9-954f-08c0d7a26bcf (COMPLETE)
│ ├─ unreserve-cbd748d0-df7b-4d01-b0b7-6acf915d8f98 (COMPLETE)
│ ├─ unreserve-00ed63d6-427c-4492-9713-772390cc5241 (COMPLETE)
│ ├─ unreserve-5dd56b1d-4522-4bbd-88b5-de9fa0f181f2 (COMPLETE)
│ └─ unreserve-c9915f07-f446-4e14-a6b4-12c8dd2f914b (COMPLETE)
└─ deregister-service (PENDING)
└─ deregister (PENDING)
手动卸载
如果无法以其他方式恢复,则可以手动卸载服务。
-
从 Marathon 中删除卸载调度程序。
-
如下使用其 UUID 从 Mesos 中取消注册服务:
$ dcos service --inactive | grep hdfs hdfs False 3 3.3 6240.0 15768.0 <UUID> $ dcos service shutdown <UUID>
-
运行
janitor.py
清理剩余的保留资源,如下列 DC/OS 1.9 说明中所述。
DC/OS 1.9 及更早版本,或早于 2.0.0-x 的包
如果您正在运行 DC/OS 1.9 或更早版本,或早于 2.0.0-x 的 Apache HDFS 服务版本,请遵循以下步骤:
- 停止服务。从 DC/OS CLI,输入
dcos package uninstall --app-id=<service-name> hdfs
. - 使用框架清洁器脚本
janitor.py
清理剩余的保留资源。
$ MY_SERVICE_NAME=<service-name>
$ dcos package uninstall --app-id=$MY_SERVICE_NAME hdfs`.
$ dcos node ssh --master-proxy --leader "docker run mesosphere/janitor /janitor.py \
-r $MY_SERVICE_NAME-role \
-p $MY_SERVICE_NAME-principal \
-z dcos-service-$MY_SERVICE_NAME"
参见 DC/OS 文档 了解有关框架清洁器脚本的详细信息。