Kubernetes 库伯内特斯:我如何知道节点I';我在吗?
如果我使用ssh连接到Kubernetes节点,如何计算该节点的UUID,以便查询主API以获取特定于该节点的信息 到目前为止我试过这个Kubernetes 库伯内特斯:我如何知道节点I';我在吗?,kubernetes,Kubernetes,如果我使用ssh连接到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 --a
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
kubernetes节点上有许多不同的ID和名称,这取决于您要查找的节点。如果要查询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"
您可以通过向kubectl添加宽输出选项获得节点名称:
//以纯文本输出格式列出所有POD,并包括附加信息(如节点名称)。
$kubectl获得吊舱-o宽
更多选项:kubelet是在每个节点中运行的实体,类似于“host agent”,kube api服务器与之交互以获取特定于节点的信息并执行特定于节点的任务 Kubelet有关于节点名的信息。通常,在启动kubelet时,节点名带有“-hostname override”选项 因此,如果设置了--hostname override,下面的命令将给出节点名 ps-eaf | grep kubelet | tr''\n'| grep”--主机名覆盖“| awk-F='{print$2}”
否则,必须有kubelet API来提供此信息,但kubelet API没有文档记录,因此最好不要在stackoverflow中建议它们我发现当前kubernetes节点(我检查minikube,gke节点池)有文件
/etc/machine id
,哪个cat/etc/machine id
对于每个kubernetes节点都是唯一的,并且与对应的kubectl get nodes-o json | jq-r.items[]status.nodeInfo.machineID
匹配
因为它不需要API调用,所以我认为这种方式更容易与shell或容器相结合 如果您打算稍后通过env变量使用它们,那么最好在部署期间公开它们 例如:
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
指
嘿,我试过你的建议,但是找不到404?你能发布输入的确切命令吗?有些路径对尾部的斜杠很挑剔。curl-Gs->是空的,我知道我没有运行任何pods,但404 not found是odd,你运行的是哪个版本的kubernetes?您至少应该有一个kube代理pod(在kube系统名称空间中)(添加了另一个获取节点名称的选项)作为最佳答案不知道为什么这个答案没有更多的投票。首先,它实际上解决了问题,没有猜测工作。其次,它不需要网络或任何特殊工具,如kubectl或jq。我可以把文件映射到我的吊舱里,我可以走了。