Kubernetes:我怎么知道我在哪个节点?

时间:2016-01-26 06:19:07

标签: kubernetes

如果我进入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

5 个答案:

答案 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服务器查询externalIDproviderID

$ 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-idcat /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

参考

https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/

答案 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中建议它们