在K8S POD中获取pod所在node节点的ip

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在K8S POD中获取pod所在node节点的ip相关的知识,希望对你有一定的参考价值。

参考技术A 网上找了很多办法都没用,自己琢磨了下,在环境变量里设置fieldRef读取status.hostIP的值,这个其实就是宿主机的值,再在Pod里通过环境变量读取就好了。

同理一样可以获得节点名称,所在的命名空间等

这是一个yaml示例

无法从阿里巴巴集群中获取命名空间、节点和 Pod 数据

【中文标题】无法从阿里巴巴集群中获取命名空间、节点和 Pod 数据【英文标题】:Not able to fetch namespace, nodes & pods data from Alibaba cluster 【发布时间】:2022-01-08 22:41:45 【问题描述】:

我在阿里巴巴上创建了一个集群。

我需要在 Golang 项目中获取集群数据。

从 API 得到以下错误:


  "Code": 403,
  "Message": "namespaces is forbidden: User \"281247226166595041\" cannot list resource \"namespaces\" in API group \"\" at the cluster scope"

尝试通过 kubectl 访问它:

$ kubectl get namespace
Error from server (Forbidden): namespaces is forbidden: User "225396037912844073" cannot list resource "namespaces" in API group "" at the cluster scope

无法获取其他用户创建的集群的数据。

请帮我解决这个问题。

【问题讨论】:

【参考方案1】:

这是身份验证问题

您的用户无权列出该命名空间。

您需要更新 RBAC 或用户访问权限,或者您正在将 Go 客户端身份验证到 Kubernetes。

如果您使用服务帐户授予访问权限,请检查 RBAC。

授予服务帐号cluster-admin访问权限

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: <new-account-name>
  namespace: <namespace>

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: go-rbac
subjects:
  - kind: ServiceAccount
    name: default
    namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

kubectl apply -f .yaml

如果您在集群外运行,请确保您的脚本指向正确的 kubeconfig

package main

import (
  "fmt"

  "k8s.io/client-go/1.5/kubernetes"
  "k8s.io/client-go/1.5/pkg/api/v1"
  "k8s.io/client-go/1.5/tools/clientcmd"
)

func main()  
    config, err := clientcmd.BuildConfigFromFlags("", <kube-config-path>)
    if err != nil 
      return nil, err
    

    c, err := kubernetes.NewForConfig(config)
    if err != nil 
      return nil, err
    

在卡斯特内部运行

package main

import (
    "context"
    "fmt"
    "time"

    "k8s.io/apimachinery/pkg/api/errors"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
    //
    // Uncomment to load all auth plugins
    // _ "k8s.io/client-go/plugin/pkg/client/auth"
    //
    // Or uncomment to load specific auth plugins
    // _ "k8s.io/client-go/plugin/pkg/client/auth/azure"
    // _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
    // _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
    // _ "k8s.io/client-go/plugin/pkg/client/auth/openstack"
)

func main() 
    // creates the in-cluster config
    config, err := rest.InClusterConfig()
    if err != nil 
        panic(err.Error())
    
    // creates the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil 
        panic(err.Error())
    

例如:https://github.com/kubernetes/client-go/blob/master/examples/in-cluster-client-configuration/main.go

【讨论】:

阿里集群的服务账号如何获取,能帮我一下吗? 你是如何运行代码的?在 K8s 上的容器内还是在 K8s 集群外? @PranitaT 你还在面对问题吗?如果它对你有用,你能更新一下状态吗?

以上是关于在K8S POD中获取pod所在node节点的ip的主要内容,如果未能解决你的问题,请参考以下文章

K8S Pod 内抓包定位网络问题

K8S Pod 内抓包定位网络问题

k8s一个pod加载多个containers,指定pod运行的node

k8s网络篇

一个node没有重复pod

清除k8s中node节点无用的镜像