You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中检测DaemonSet Pod所在的Kubernetes节点

在DaemonSet Pod中获取所在节点信息并拼接BMC地址

下面是几种实用的实现方式,附代码和配置示例:

1. 用Kubernetes内置环境变量(最简单方案)

Kubernetes会自动为每个Pod注入NODE_NAME环境变量,无需额外配置Pod即可直接获取当前运行的节点名称。

Python代码示例

import os

def get_bmc_address():
    # 读取内置环境变量NODE_NAME
    node_name = os.getenv("NODE_NAME")
    if not node_name:
        raise RuntimeError("无法获取当前节点名称")
    
    # 按规则拼接BMC地址
    bmc_address = f"{node_name}.bmc.domain.com"
    print(f"当前节点: {node_name} | BMC地址: {bmc_address}")
    return bmc_address

if __name__ == "__main__":
    get_bmc_address()

2. 通过Downward API注入更多节点元数据

如果需要节点的FQDN(如node1.domain.com)这类额外信息,可以用Downward API将节点的指定字段注入到Pod的环境变量中。

第一步:修改DaemonSet配置

在Pod模板中添加环境变量注入规则:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: bmc-collector
spec:
  selector:
    matchLabels:
      app: bmc-collector
  template:
    metadata:
      labels:
        app: bmc-collector
    spec:
      containers:
      - name: collector
        image: your-python-image:tag
        env:
          # 注入节点名称(与内置NODE_NAME效果一致)
          - name: NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          # 注入节点的FQDN(若节点status.hostIP对应你的域名)
          - name: NODE_FQDN
            valueFrom:
              fieldRef:
                fieldPath: status.hostIP
          # 从节点自定义标签读取域名(假设节点有标签node-domain: node1.domain.com)
          - name: NODE_DOMAIN
            valueFrom:
              nodeFieldRef:
                fieldPath: metadata.labels['node-domain']

第二步:对应Python代码

import os

def get_bmc_address():
    # 优先使用自定义注入的节点域名
    node_domain = os.getenv("NODE_DOMAIN")
    if node_domain:
        node_prefix = node_domain.split(".")[0]
    else:
        #  fallback到NODE_NAME
        node_prefix = os.getenv("NODE_NAME")
        if not node_prefix:
            raise RuntimeError("无法获取节点信息")
    
    bmc_address = f"{node_prefix}.bmc.domain.com"
    print(f"BMC地址: {bmc_address}")
    return bmc_address

if __name__ == "__main__":
    get_bmc_address()

3. 读取Pod的/etc/hosts文件(备选方案)

Pod的/etc/hosts文件会包含节点的主机名映射,可从中提取节点名称:

Python代码示例

def extract_node_name_from_hosts():
    with open("/etc/hosts", "r") as f:
        for line in f:
            parts = line.strip().split()
            if len(parts) < 2:
                continue
            # 根据你的域名规则匹配,例如筛选以.domain.com结尾的条目
            for hostname in parts[1:]:
                if hostname.endswith(".domain.com"):
                    return hostname.split(".")[0]
    return None

if __name__ == "__main__":
    node_name = extract_node_name_from_hosts()
    if node_name:
        print(f"BMC地址: {node_name}.bmc.domain.com")
    else:
        print("无法从hosts文件提取节点名称")

快速验证方法

在运行的Pod中执行以下命令,确认环境变量是否正常注入:

echo $NODE_NAME

内容的提问来源于stack exchange,提问作者Romain Pelissier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:03:36