首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从系统开始进入码头?

如何从系统开始进入码头?
EN

Server Fault用户
提问于 2021-08-18 21:07:01
回答 1查看 1.2K关注 0票数 1

我想从systemd开始在对接器中启动etcd (单节点),但是好像出了问题--它在启动后30秒就被终止了。

该服务似乎在状态“激活”中启动,但在大约30秒后终止,而没有到达状态“活动”。也许码头集装箱和系统之间没有信号?

更新(见post底部):当我删除failed (Result: timeout)指令时,systemd服务状态达到Restart=on-failure

当我在启动后检查etcd服务的状态时,我会得到以下结果:

代码语言:javascript
复制
$ sudo systemctl status etcd● etcd.service - etcd   Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: disabled)
   Active: activating (auto-restart) (Result: exit-code) since Wed 2021-08-18 20:13:30 UTC; 4s ago
  Process: 2971 ExecStart=/usr/bin/docker run -p 2380:2380 -p 2379:2379 --volume=etcd-data:/etcd-data --name etcd my-aws-account.dkr.ecr.eu-north-1.amazonaws.com/etcd:v3.5.0 /usr/local/bin/etcd --data-dir=/etcd-data --name etcd0 --advertise-client-urls http://10.0.0.11:2379 --listen-client-urls http://0.0.0.0:2379 --initial-advertise-peer-urls http://10.0.0.11:2380 --listen-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://10.0.0.11:2380 (code=exited, status=125)
 Main PID: 2971 (code=exited, status=125)

我在Amazon 2机器上运行它,启动时将运行一个用户数据脚本。我已经确认docker.servicedocker_ecr_login.service成功运行。

在机器启动后不久,我可以看到etcd正在运行:

代码语言:javascript
复制
 sudo systemctl status etcd
● etcd.service - etcd
   Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: disabled)
   Active: activating (start) since Wed 2021-08-18 20:30:07 UTC; 1min 20s ago
 Main PID: 1573 (docker)
    Tasks: 9
   Memory: 24.3M
   CGroup: /system.slice/etcd.service
           └─1573 /usr/bin/docker run -p 2380:2380 -p 2379:2379 --volume=etcd-data:/etcd-data --name etcd my-aws-account.dkr.ecr.eu-north-1.amazonaws.com...

Aug 18 20:30:17 ip-10-0-0-11.eu-north-1.compute.internal docker[1573]: {"level":"info","ts":"2021-08-18T20:30:17.690Z","logger":"raft","caller":"...rm 2"}
Aug 18 20:30:17 ip-10-0-0-11.eu-north-1.compute.internal docker[1573]: {"level":"info","ts":"2021-08-18T20:30:17.691Z","caller":"etcdserver/serve..."3.5"}
Aug 18 20:30:17 ip-10-0-0-11.eu-north-1.compute.internal docker[1573]: {"level":"info","ts":"2021-08-18T20:30:17.693Z","caller":"membership/clust..."3.5"}
Aug 18 20:30:17 ip-10-0-0-11.eu-north-1.compute.internal docker[1573]: {"level":"info","ts":"2021-08-18T20:30:17.693Z","caller":"etcdserver/server.go:2...
Aug 18 20:30:17 ip-10-0-0-11.eu-north-1.compute.internal docker[1573]: {"level":"info","ts":"2021-08-18T20:30:17.693Z","caller":"api/capability.g..."3.5"}
Aug 18 20:30:17 ip-10-0-0-11.eu-north-1.compute.internal docker[1573]: {"level":"info","ts":"2021-08-18T20:30:17.693Z","caller":"etcdserver/serve..."3.5"}
Aug 18 20:30:17 ip-10-0-0-11.eu-north-1.compute.internal docker[1573]: {"level":"info","ts":"2021-08-18T20:30:17.693Z","caller":"embed/serve.go:9...ests"}
Aug 18 20:30:17 ip-10-0-0-11.eu-north-1.compute.internal docker[1573]: {"level":"info","ts":"2021-08-18T20:30:17.695Z","caller":"etcdmain/main.go...emon"}
Aug 18 20:30:17 ip-10-0-0-11.eu-north-1.compute.internal docker[1573]: {"level":"info","ts":"2021-08-18T20:30:17.695Z","caller":"etcdmain/main.go...emon"}
Aug 18 20:30:17 ip-10-0-0-11.eu-north-1.compute.internal docker[1573]: {"level":"info","ts":"2021-08-18T20:30:17.702Z","caller":"embed/serve.go:1...2379"}
Hint: Some lines were ellipsized, use -l to show in full.

我得到了相同的行为--听Node (10.0.0.11)或127.0.0.1。

我可以在本地运行etcd,从命令行启动(它在30秒后不会终止),使用:

代码语言:javascript
复制
sudo docker run -p 2380:2380 -p 2379:2379 --volume=etcd-data:/etcd-data --name etcd-local \
my-aws-account.dkr.ecr.eu-north-1.amazonaws.com/etcd:v3.5.0 \
/usr/local/bin/etcd --data-dir=/etcd-data \
--name etcd0 \
--advertise-client-urls http://127.0.0.1:2379 \
--listen-client-urls http://0.0.0.0:2379 \
--initial-advertise-peer-urls http://127.0.0.1:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--initial-cluster etcd0=http://127.0.0.1:2380

要蚀刻的参数类似于运行单个节点etcd - ectd 3.5文档

这是用于启动etcd的启动脚本的相关部分:

代码语言:javascript
复制
sudo docker volume create --name etcd-data

cat <

当列出机器上的所有容器时,我可以看到它一直在运行:

代码语言:javascript
复制
sudo docker ps -a
CONTAINER ID   IMAGE                                                       COMMAND                  CREATED          STATUS                      PORTS                          NAMES
a744aed0beb1   my-aws-account.dkr.ecr.eu-north-1.amazonaws.com/etcd:v3.5.0   "/usr/local/bin/etcd…"   25 minutes ago   Exited (0) 24 minutes ago                          etcd

但我怀疑它不能重新启动,因为容器名称已经存在。

Why从systemd启动时,etcd容器是否在30秒后终止?它似乎成功启动,但systemd只显示它处于“激活”状态,但从未处于“活动”状态,并且似乎在大约30秒后被终止。是否有从码头集装箱到系统d的信号丢失?如果是这样的话,我如何使信号正确?

更新:

在删除服务单元文件中的Restart=on-failure指令后,我现在得到状态:<#>failed (结果: timeout)

代码语言:javascript
复制
$ sudo systemctl status etcd
● etcd.service - etcd
   Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: disabled)
   Active: failed (Result: timeout) since Wed 2021-08-18 21:35:54 UTC; 5min ago
  Process: 1567 ExecStart=/usr/bin/docker run -p 2380:2380 -p 2379:2379 --volume=etcd-data:/etcd-data --name etcd my-aws-account.dkr.ecr.eu-north-1.amazonaws.com/etcd:v3.5.0 /usr/local/bin/etcd --data-dir=/etcd-data --name etcd0 --advertise-client-urls http://127.0.0.1:2379 --listen-client-urls http://0.0.0.0:2379 --initial-advertise-peer-urls http://127.0.0.1:2380 --listen-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://127.0.0.1:2380 (code=exited, status=0/SUCCESS)
 Main PID: 1567 (code=exited, status=0/SUCCESS)

Aug 18 21:35:54 ip-10-0-0-11.eu-north-1.compute.internal docker[1567]: {"level":"info","ts":"2021-08-18T21:35:54.332Z","caller":"osutil/interrupt...ated"}
Aug 18 21:35:54 ip-10-0-0-11.eu-north-1.compute.internal docker[1567]: {"level":"info","ts":"2021-08-18T21:35:54.333Z","caller":"embed/etcd.go:36...379"]}
Aug 18 21:35:54 ip-10-0-0-11.eu-north-1.compute.internal docker[1567]: WARNING: 2021/08/18 21:35:54 [core] grpc: addrConn.createTransport failed ...ing...
Aug 18 21:35:54 ip-10-0-0-11.eu-north-1.compute.internal docker[1567]: {"level":"info","ts":"2021-08-18T21:35:54.335Z","caller":"etcdserver/serve...6a6c"}
Aug 18 21:35:54 ip-10-0-0-11.eu-north-1.compute.internal docker[1567]: {"level":"info","ts":"2021-08-18T21:35:54.337Z","caller":"embed/etcd.go:56...2380"}
Aug 18 21:35:54 ip-10-0-0-11.eu-north-1.compute.internal docker[1567]: {"level":"info","ts":"2021-08-18T21:35:54.338Z","caller":"embed/etcd.go:56...2380"}
Aug 18 21:35:54 ip-10-0-0-11.eu-north-1.compute.internal docker[1567]: {"level":"info","ts":"2021-08-18T21:35:54.339Z","caller":"embed/etcd.go:36...379"]}
Aug 18 21:35:54 ip-10-0-0-11.eu-north-1.compute.internal systemd[1]: Failed to start etcd.
Aug 18 21:35:54 ip-10-0-0-11.eu-north-1.compute.internal systemd[1]: Unit etcd.service entered failed state.
Aug 18 21:35:54 ip-10-0-0-11.eu-north-1.compute.internal systemd[1]: etcd.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
EN

回答 1

Server Fault用户

回答已采纳

发布于 2021-08-18 22:40:00

更新:发布测试数据,并根据收到的评论集成更新。docker -d并不是最初认为的系统集成所必需的。正如迈克尔所指出的,Type=设置在我的经验中似乎比将服务的后台状态卸载给码头更重要。正如我最初解释的那样,操作问题在第一次出现时似乎是没有背景的副作用。经过进一步测试后,这一背景似乎无关紧要。

请注意,在OP中使用的Amazon映像不是我可以测试或直接排除故障的东西。这里展示了一个用于etcd和systemd的对比示例,以帮助配置端点系统,类似于我的配置。系统详细信息:

  • Ubuntu 20.04 LTS
  • 码头工人20.10.7
  • etcd 3.5.0

systemd配置

最后,我得到了以下systemd服务文件。请注意,Type=simple,由于迈克尔建议澄清这一点的反应(显然,我自己对这部分拼图的理解)。您可以在这里了解更多关于系统类型的信息:

https://www.freedesktop.org/software/systemd/man/systemd.service.html

类型很重要;更重要的是,我最初对简单类型的理解是,我的注意力集中在缺乏与systemd的沟通上,这使得我忽略了类型设置在响应被调用应用程序的响应时所做的可应用行为(在本例中是坞)。

删除类型,或者将类型添加到简单中,都会导致相同的行为。在我的测试中,下面的配置可靠地工作,就像-d是否存在于docker命令中一样:

代码语言:javascript
复制
[Unit]
Description=Docker container-etcd.service
Documentation=man:docker
Requires=docker.service
Wants=network.target
After=network-online.target

[Service]
ExecStartPre=- /usr/bin/docker stop etcd
ExecStartPre=- /usr/bin/docker rm etcd
ExecStart=docker run --rm -d -p 2379:2379 -p 2380:2380 --volume=/home/user/etcd-data:/etcd-data --name etcd quay.io/coreos/etcd:v3.5.0 /usr/local/bin/etcd --data-dir=/etcd-data --name etcd --initial-advertise-peer-urls http://10.4.4.132:2380 --listen-peer-urls http://0.0.0.0:2380 --advertise-client-urls http://10.4.4.132:2379 --listen-client-urls http://0.0.0.0:2379 --initial-cluster etcd=http://10.4.4.132:2380
ExecStop=/usr/bin/docker stop etcd -t 10
ExecRestart=/usr/bin/docker restart etcd
KillMode=none
RemainAfterExit=1
Restart=on-failure
Type=simple

[Install]
WantedBy=multi-user.target default.target

说明

  • RemainAfterExit补充说,由于systemd将考虑服务在启动后退出(如果不存在);缺乏此布尔值会造成一种看似错误的情况,docker ps显示容器正在运行,而systemctl status container-etcd显示退出和不活动。
  • systemd单元文件在语法上有些不正确。%n通常用于Exec行引用服务名称(如在...docker中重新启动%n);我不想在试图解决OP问题时引入进一步的混淆。更不用说,我把etcd作为码头容器名称,而容器-etcd作为单元服务名称。
  • ExecStart被折叠成一行命令。\标准语法不适用于我,也不引用容器的etcd调用命令。我昨天的测试似乎运行良好,但今天的配置与昨天不同。因此,我重新做了测试和配置,以找到什么似乎是最稳定的我。
  • 显然,如果您要在任何时候使用docker,您必须或非常强烈地使用绑定挂载,如OP和这里所述。就我个人而言,我使用全路径位置,所有这些位置都存储在/srv下,然后绑定到容器中。这样我就有一个文件夹来备份,而容器的状态,无论是否存在,都是无关紧要的。

确认

在更新systemd服务文件、执行守护进程重新加载等操作之后,我将执行到容器中,并对etcd运行了一个测试命令:

  • docker exec -it etcd sh
  • etcdctl --endpoints=http://10.4.4.132:2379 member list

结果

代码语言:javascript
复制
9a552f9b95628384, started, etcd, http://10.4.4.132:2380, http://10.4.4.132:2379, false
票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1074981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档