我们正在开发使用 terraform(在 AWS 上)执行以下操作的代码:
- 使用我们提供的 cloud-config yaml 文件创建一个 core-os 实例(1)
- 从该实例创建 AMI
到目前为止,整个过程运行良好。
当我们通过 AWS 控制台从该 AMI 启动实例 (2) 时。新启动的实例不使用 cloud-config 文件。
它 (2) 具有通过 cloud-config yaml 文件在实例 (1) 中创建的服务/systemd 单元。但这些服务已停止运行。如果我们使用以下命令显式启动它们,它们将运行良好systemctl
我们如何确保从该 AMI 创建的任何实例都应在启动时启动这些服务/systemd 单元或应加载该云配置文件?
(我们也将 cloud-config yaml 保存在机器内部的某个位置,如果我们通过手动运行 cloud-config 文件coreos-cloudinit --from-file=path/to/file/cloud-config.yaml
,一切都会正常工作。但我们希望它在启动时就能正常工作,而无需任何手动步骤)
这是我们的云配置文件
#cloud-config
coreos:
etcd2:
# generate a new token for each unique cluster from https://discovery.etcd.io/new?size=3
# specify the initial size of your cluster with ?size=X
discovery: https://discovery.etcd.io/2cb27f1fecb57e14837016e04547aa32
# multi-region and multi-cloud deployments need to use $public_ipv4
advertise-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
initial-advertise-peer-urls: http://127.0.0.1:2380
# listen on both the official ports and the legacy ports
# legacy ports can be omitted if your application doesn't depend on them
listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
listen-peer-urls: http://0.0.0.0:2380,http://0.0.0.0:7001
units:
- name: etcd2.service
command: start
- name: fleet.service
command: start
- name: hello.service
command: start
content: |
[Unit]
Description=hello_docker
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --rm --name busybox1 busybox /bin/sh -c "while true; do echo Hello Docker; sleep 1; done"
ExecStop=/usr/bin/docker stop busybox1
答案1
您不需要为 CoreOS 设备制作自己的 AMI,只需使用官方的 CoreOS AMI。将相同的云配置文件传递给您要创建的每个设备,设备就会启动。与必须对内容进行快照相比,这使您的基础架构更加不可改变。
答案2
我遗漏的是,第一个实例 (1) 使用脚本作为用户数据,然后通过 cloud-init 命令运行云配置。
相反,我必须将我的云配置复制到 /usr/share/oem/ 中,以便 AMI 创建的实例也默认使用该云配置。
此外,以下内容可能会对面临类似问题的人有所帮助,但正如所提到的,它不会在第一次启动时启动。
您需要启用服务(确保它们具有安装部分)。
#cloud-config
coreos:
units:
- name: "example.service"
enable: true
content: |
[Service]
Type=oneshot
ExecStart=/usr/bin/echo Hello World
[Install]
WantedBy=multi-user.target
该服务不会在第一次启动时启动(因为该单元是在 systemd 实现 multi-user.target 之后启用的),但它会在后续启动时运行。
另外,在拍摄快照时,请确保先删除 /etc/machine-id。否则,所有机器都会有相同的 ID。
参考:关联