我在我的 CoreOS 云配置中定义了一次性服务,但由于无法从谷歌云存储(通过 wget)下载文件而失败:
4 月 13 日 11:09:56 staging-node-ys9y.c.experimentalberlin.internal sh[1132]:连接到 storage.googleapis.com|74.125.133.128|:443... 失败:连接超时。
我应该如何确保该服务能够从 Internet 下载文件?
我的云配置
#cloud-config
coreos:
units:
- name: bootstrap.service
command: start
content: |
[Unit]
Description=Bootstrap instance
After=network-online.target
Requires=network-online.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/bin/mkdir -p /tmp/kubernetes-staging
ExecStart=cd /tmp/kubernetes-staging
ExecStart=/bin/sh -c "cd /tmp/kubernetes-staging && wget https://storage.googleapis.com/experimentalberlin/staging.tar.gz && tar xf staging.tar.gz"
ExecStart=/tmp/kubernetes-staging/worker/bootstrap.sh
[Install]
WantedBy=local.target
我会采取多步骤的策略来解决这个问题。请原谅额外的信息和过度解释,CoreOS 的每个人都必须从我这里处理这个问题。;)
首先,您要确保可以从集群内部检索您尝试下载的 URL。目前,我看不出有什么理由不应该是这种情况,因为我能够得到它(顺便说一句,通常最好不要将私钥材料放在可公开访问的 tarball 中。在这种情况下,虽然仍然不是最佳
user-data
的将这些资产包含在或至少使用对称加密保护 tarball可能会更好。)由于 cloud-init 在网络上线后运行,这应该足够了(元数据服务驻留在网络上
http://169.254.169.254
,因此在网络上线之前无法检索 cloud-config。)这意味着可能的罪魁祸首是暂时的网络问题或其他详细信息。当我尝试通过此运行时,我收到以下错误:
这里的线索是这一行:
此消息告诉您运行脚本本身存在问题。挖掘这个是完全有意义的,因为当我查看那个 shell 脚本的顶部时,没有shebang告诉 systemd如何运行可执行文件(在这种情况下,它都是与Bourne Shell / Bourne-Again Shell兼容的命令,所以 shebang 应该可能是要么
#!/bin/sh
或#!/bin/bash
。)添加一个shebang应该可以解决这个问题。其他一些小细节:
使用时
wget
指定下载位置:扩展 tarball 时,您可以使用以下命令将其输出到特定位置
-C
:这允许您将它们分离到它们的相关
ExecStart=
选项中,从而提供额外的日志记录。bootstrap.sh
,我会将所有ExecStart=
选项(最后一个除外)更改为ExecStartPre=
.