【问题标题】:Why is my systemd unit not reading env variables properly?为什么我的 systemd 单元不能正确读取环境变量?
【发布时间】:2015-09-03 03:48:02
【问题描述】:

我正在尝试在 coreos 上运行 kubernetes。我正在使用fleet、setup-network-environment 和kube-register 来注册节点。但是,在我编写 systemd 单元文件的 cloud-init 文件中,kubelet 的单元文件无法正常运行:

 ExecStart=/opt/bin/kubelet  \
 --address=0.0.0.0 --port=10250 \
 --hostname_override=${DEFAULT_IPV4} \
 --allow_privileged=true \
 --logtostderr=true \
 --healthz_bind_address=0.0.0.0

${DEFAULT_IPV4} 不是我的公共 ip,而是$default_ipv4,这也不会导致 ip。我知道--host-name-override 应该只接受一个字符串,当我从命令行运行此行时它可以工作。还有其他单元文件,${ENV_VAR} 可以正常工作。为什么 kubelet 的单元文件就坏掉了?

编辑 1

/etc/网络环境

LO_IPV4=127.0.0.1
ENS33_IPV4=192.168.195.242
DEFAULT_IPV4=192.168.195.242
ENS34_IPV4=172.22.22.238

编辑 2

kubelet 单元文件

- name: kube-kubelet.service
  command: start
  content: |
    [Unit]
    Description=Kubernetes Kubelet
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    Requires=setup-network-environment.service
    After=setup-network-environment.service
    [Service]
    EnvironmentFile=/etc/network-environment
    ExecStartPre=/usr/bin/curl -L -o /opt/bin/kubelet -z /opt/bin/kubelet https://storage.googleapis.com/kubernetes-release/release/v0.18.2/bin/linux/amd64/kubelet
    ExecStartPre=/usr/bin/chmod +x /opt/bin/kubelet
    # wait for kubernetes master to be up and ready
    ExecStartPre=/opt/bin/wupiao 172.22.22.10 8080
    ExecStart=/opt/bin/kubelet \
    --address=0.0.0.0 \
    --port=10250 \
    --hostname_override=172.22.22.21 \
    --api_servers=172.22.22.10:8080 \
    --allow_privileged=true \
    --logtostderr=true \
    --healthz_bind_address=0.0.0.0 \
    --healthz_port=10248
    Restart=always
    RestartSec=10

【问题讨论】:

    标签: environment-variables coreos systemd kubernetes fleet


    【解决方案1】:

    Exec*=command 不是 shell 命令。在我的实验中,它不是很擅长找出变量在哪里,除非它自己。我去网上看了一些例子,它们总是单独显示环境变量。所以,给定一个像 /tmp/myfile 这样的文件:

    ENV=1.2.3.4
    

    这些 [Service] 定义不会像你想的那样:

    EnvironmentFile=/tmp/myfile
    ExecStart=echo M$ENV
    ExecStart=echo $ENV:8080
    

    但是,这将单独在一行上工作:

    EnvironmentFile=/tmp/myfile
    ExecStart=echo $ENV
    

    这在尝试传递参数时没有多大帮助,例如:

    EnvironmentFile=/tmp/myfile
    ExecStart=echo --myarg=http://$ENV:8080/v2
    

    为了完成传递参数,我必须将整个 myarg 放在 /tmp/myfile 中的字符串中:

    ENV="--myarg=http://1.2.3.4:8080/v2"
    

    终于可以让我的论点通过了:

    EnvironmentFile=/tmp/myfile
    ExecStart=echo $ENV
    

    【讨论】:

    • d 来自哪里?我正在使用 setup-network-environment 中的默认 /etc/network-environment,我确实提到我正在使用它。我没有在数字海洋上运行,这是在本地虚拟机上,最终是在 gce 上。
    • 您可以发布您的云文本吗?此外,在 setup-network-environment 运行后了解 /etc/network-environment 的内容也会有所帮助。 ${d..} 的东西来自模板参数。我的模板解析为 --hostname_override=$public_ip,我将修改答案以包含解析的文本。
    • 云初始化文本怎么样?至少是 kubelet 的完整单元定义。
    • 好吧,我很难过。我假设你有--hostname_override=$DEFAULT_IPV4,这不起作用。我看到我们之间的唯一区别是我在 [Unit] 和 [Service] 之间有一个换行符。我不认为这有什么不同。
    • 是的,我怀疑这是问题所在,但我还是会试一试。
    【解决方案2】:

    看来问题出在流浪盒中的 coreos 版本上。在更新 vagrant box 后,环境变量能够解析为正确的值。

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多