Kubernetes 库伯内特斯:我如何知道节点I';我在吗?

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

如果我使用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 --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。我可以把文件映射到我的吊舱里,我可以走了。