如何从Kubernetes集群内运行的Container/Pod获取Worker Node标签
从Kubernetes Pod内获取所在节点标签的实现方案
有两种无需root权限、无需开启容器特权模式的方案可以实现需求:
方案1:通过Downward API直接注入指定节点标签(推荐)
这是Kubernetes原生支持的方案,无需给Pod配置K8s API访问权限,只需在Pod定义中提前声明需要注入的节点标签,容器启动后直接读取环境变量即可获取对应值,完全兼容非root运行的容器。
配置示例如下:
apiVersion: v1 kind: Pod metadata: name: node-label-demo spec: containers: - name: demo image: busybox:stable command: ["sh", "-c", "env | grep NODE_LABEL"] env: # 注入节点区域标签 - name: NODE_LABEL_REGION valueFrom: fieldRef: fieldPath: metadata.labels['topology.kubernetes.io/region'] # 注入节点可用区标签 - name: NODE_LABEL_ZONE valueFrom: fieldRef: fieldPath: metadata.labels['topology.kubernetes.io/zone'] # 注入节点实例规格标签 - name: NODE_LABEL_INSTANCE_TYPE valueFrom: fieldRef: fieldPath: metadata.labels['node.kubernetes.io/instance-type'] # 按需添加其他你需要获取的节点标签 restartPolicy: Never
方案2:通过ServiceAccount + RBAC调用K8s API动态获取全量节点标签
如果需要动态获取节点的所有标签、无法提前枚举需要的标签,可以用此方案,同样不需要容器开启特权或使用root权限运行。
步骤1:配置RBAC权限
创建ServiceAccount并分配节点只读权限:
apiVersion: v1 kind: ServiceAccount metadata: name: node-reader-sa --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: node-reader-role rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: node-reader-binding subjects: - kind: ServiceAccount name: node-reader-sa namespace: default # 替换为Pod实际所在的命名空间 roleRef: kind: ClusterRole name: node-reader-role apiGroup: rbac.authorization.k8s.io
步骤2:配置Pod使用该ServiceAccount
apiVersion: v1 kind: Pod metadata: name: node-label-api-demo spec: serviceAccountName: node-reader-sa containers: - name: demo image: alpine/curl:latest command: ["sh", "-c"] env: # 先通过Downward API注入当前节点名称,避免额外调用Pod接口 - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName args: - | # 读取ServiceAccount自动挂载的token SA_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) # 调用K8s API获取当前节点的全量信息,提取标签即可 curl -sSk -H "Authorization: Bearer $SA_TOKEN" https://kubernetes.default.svc/api/v1/nodes/$MY_NODE_NAME | grep -A 100 '"labels":'
内容的提问来源于stack exchange,提问作者user3435964
相关产品推荐
相关产品推荐

