如果我进入Kubernetes节点,如何找出节点的UUID,以便查询主API以获取该节点的特定信息?
到目前为止试过这个
root 13020 2.5 1.0 410112 41660 ? Ssl Jan25 26:04 /usr/bin/kubelet --logtostderr=true --v=0 --api_servers=http://10.32.140.181:8080 --address=0.0.0.0 --port=10250 --allow_privileged=false --maximum-dead-containers=1 --max-pods=14
[achang@p3dlwsbkn50d51 ~]$ curl -Gs http://localhost:10255/pods/
404 page not found
答案 0 :(得分:3)
您可以获取节点名称向kubectl添加宽输出选项:
// List all pods in plain-text output format and includes additional information (such as node name).
$ kubectl get pods -o wide
更多选项:https://kubernetes.io/docs/user-guide/kubectl-overview/
答案 1 :(得分:2)
有很多不同的ID和名称绑定到kubernetes节点,这取决于您要查找的内容。如果要查询API服务器以获取节点信息,则最有可能查找节点名称。节点名称通常与主机名相同,但如果不是,最简单的方法是查询kubelet以运行pod,并查看它们正在运行的节点:
$ curl -Gs http://localhost:10255/pods/ | grep -o '"nodeName":"[^"]*"' | head -n 1
"nodeName":"e2e-test-stclair-minion-8o3b"
通过查询节点规范可以找到其他ID:
$ curl -Gs http://localhost:10255/spec/ | grep -oE '(machine_|system_uu|boot_)id":.*'
machine_id": "",
system_uuid": "CB7FAAA0-3A53-5FE4-4285-D33D03FEBA6C",
boot_id": "8b89b8f5-5fbb-4cc0-82e4-7c57ec11f656",
最后,可以从API服务器查询externalID
和providerID
:
$ kubectl get nodes e2e-test-stclair-minion-8o3b -o=jsonpath="externalID:{.spec.externalID}; providerID:{.spec.providerID}"
编辑:
如果上述操作失败并且您可以访问api服务器,则只需查找与所需节点的主机名匹配的节点:
$ NODEHOST="your-host"
$ kubectl get nodes | grep "hostname=$NODEHOST"
答案 2 :(得分:1)
我发现当前的kubernetes节点(我检查minikube,gke节点池)有文件/etc/machine-id
,cat /etc/machine-id
对于每个kubernetes节点都是唯一的,并且与对应的kubectl get nodes -o json | jq -r .items[].status.nodeInfo.machineID
匹配。
因为它不需要API调用,我认为这种方式更容易与shell或容器结合使用。
答案 3 :(得分:1)
现在,如果您打算稍后通过环境变量使用它们,最好在部署期间公开它们。
示例:
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-fieldref
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "sh", "-c"]
args:
- while true; do
echo -en '\n';
printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;
sleep 10;
done;
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: MY_POD_SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
restartPolicy: Never
参考
答案 4 :(得分:0)
kubelet是在每个节点中运行的实体,就像"主机代理"与kube-api-server交互以获取节点特定信息以及执行特定于节点的任务。
Kubelet包含有关节点名称的信息。通常,节点名称使用" - hostname-override"启动kubelet时的选项。
因此,如果设置了--hostname-override,则以下命令将给出节点名称。
ps -eaf | grep kubelet | tr' ' ' \ n' | grep" - hostname-override" | awk -F =' {print $ 2}'
否则,必须有kubelet API来提供这些信息,但是kubelet API没有记录,因此最好不要在stackoverflow中建议它们