英文:
How to access my pod in k8s using go-client
问题
我正在使用go-client来访问我的环境中的k8s资源。有一些API可以获取/列出pod、命名空间等。
我如何访问当前正在运行的pod?
英文:
I am using go-client to access k8s resources in my environment. There are APIs to get/list pods, namespaces, etc.
How do I access the pod that I am currently running on?
答案1
得分: 1
您可以使用环境变量将Pod信息传递给容器,具体方法请参考Kubernetes官方文档中的"Expose Pod Information to Containers Through Environment Variables"部分,使用Pod字段作为环境变量的值。
以下是示例代码:
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-fieldref
spec:
containers:
- name: test-container
...
...
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
然后,在您的Go代码中可以通过查找这些环境变量来使用它们:
log.Printf("MY_POD_NAME: %q", os.Getenv("MY_POD_NAME"))
请注意,以上代码仅为示例,您需要根据实际情况进行适当的修改和调整。
英文:
You can Expose Pod Information to Containers Through Environment Variables using pod fields:
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-fieldref
spec:
containers:
- name: test-container
...
...
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
then simply look up these env vars in your Go code:
log.Printf("MY_POD_NAME: %q", os.Getenv("MY_POD_NAME"))
答案2
得分: 0
Kubernetes的client-go库提供了访问Pod的API,CoreV1包提供了获取所有Pod的API,可以查看文档:https://pkg.go.dev/k8s.io/client-go/kubernetes/typed/core/v1#CoreV1Client.Pods
你可以通过命名空间、标签或查询来轻松过滤或获取Pod。
以下是一个示例代码,用于获取命名空间中的所有Pod:
config, err := clientcmd.BuildConfigFromFlags("", "集群配置文件的路径")
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
// 获取命名空间中的所有Pod
pods, err := clientset.CoreV1().Pods("命名空间").List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err.Error())
}
以下是使用标签获取Pod的示例代码:
label := fmt.Sprintf("标签名称=%s", "某个标签的值")
ap1 := sm.clientset.CoreV1()
pods, _ := ap1.Pods(namespace).List(context.Background(), metav1.ListOptions{LabelSelector: label})
pods_num := len(pods.Items)
fmt.Printf("找到以下数量的Pod:%d\n", pods_num)
for i, pod := range pods.Items {
fmt.Printf("[%2d] %s,阶段:%s,创建时间:%s,主机IP:%s\n", i, pod.GetName(), string(pod.Status.Phase), pod.GetCreationTimestamp(), string(pod.Status.HostIP))
}
英文:
The Kubernetes client-go supplies API to access pods, and the CoreV1 package gives an API to get All Pods see the documentation
https://pkg.go.dev/k8s.io/client-go/kubernetes/typed/core/v1#CoreV1Client.Pods
You can easily filter or fetch Pods by Namespace, Label or Query,
See a sample code to get all pods in Namespace.
config, err := clientcmd.BuildConfigFromFlags("", "PATH to cluster config yaml")
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
// Get all pods in namespace
pods, err := clientset.CoreV1().Pods("NANESPACE").List(context.TODO(),
metav1.ListOptions{})
if err != nil {
panic(err.Error())
}
See the Sample code for getting pods using a label:
labal := fmt.Sprintf("LABLE-NAME=%s", "SOME LABEL VALUE")
ap1 := sm.clientset.CoreV1()
pods, _ := ap1.Pods(namespace).List(context.Background(),
metav1.ListOptions{LabelSelector: labal})
pods_num := len(pods.Items)
fmt.Printf("Found the following number of Pods: %d\n", pods_num)
for i, pod := range pods.Items {
fmt.Printf("[%2d] %s, Phase: %s, Created: %s, HostIP: %s\n", i,
pod.GetName(), string(pod.Status.Phase),
pod.GetCreationTimestamp(),
string(pod.Status.HostIP))
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论