blob: ba14192f7c0e2a804fdcf35409a4c5b21d7481a4 [file] [log] [blame]
Mohammed Naser9a6e07e2023-12-12 16:14:30 -05001package main
2
3import (
4 "bytes"
5 "context"
6 "fmt"
7 "path/filepath"
8 "strconv"
9 "strings"
10
11 log "github.com/sirupsen/logrus"
12 "github.com/spf13/pflag"
13 v1 "k8s.io/api/core/v1"
14 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15 "k8s.io/client-go/kubernetes"
16 "k8s.io/client-go/kubernetes/scheme"
17 "k8s.io/client-go/tools/clientcmd"
18 "k8s.io/client-go/tools/remotecommand"
19 "k8s.io/client-go/util/homedir"
20)
21
22var (
23 kubeconfig string
24)
25
26func init() {
27 homedir := homedir.HomeDir()
28 pflag.StringVar(
29 &kubeconfig,
30 "kubeconfig",
31 filepath.Join(homedir, ".kube", "config"),
32 "absolute path to the kubeconfig file",
33 )
34}
35
36func main() {
37 pflag.Parse()
38
39 config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
40 if err != nil {
41 log.Fatal(err)
42 }
43
44 clientset, err := kubernetes.NewForConfig(config)
45 if err != nil {
46 log.Fatal(err)
47 }
48
49 pods, err := clientset.CoreV1().Pods("kube-system").List(context.TODO(), metav1.ListOptions{
50 LabelSelector: "k8s-app=kube-proxy",
51 })
52 if err != nil {
53 log.Fatal(err)
54 }
55
56 totalSockets := 0
57 for _, pod := range pods.Items {
58 req := clientset.CoreV1().RESTClient().
59 Post().
60 Resource("pods").
61 Namespace(pod.Namespace).
62 Name(pod.Name).
63 SubResource("exec").
64 VersionedParams(&v1.PodExecOptions{
65 Command: []string{"/bin/sh", "-c", "cat /proc/cpuinfo | grep '^physical id' | sort | uniq | wc -l"},
66 Stdin: false,
67 Stdout: true,
68 Stderr: true,
69 TTY: false,
70 }, scheme.ParameterCodec)
71
72 exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
73 if err != nil {
74 log.Fatal(err)
75 }
76
77 var stdout, stderr bytes.Buffer
78 err = exec.StreamWithContext(context.TODO(), remotecommand.StreamOptions{
79 Stdout: &stdout,
80 Stderr: &stderr,
81 })
82 if err != nil {
83 log.Fatal(err)
84 }
85
86 sockets, err := strconv.ParseInt(strings.Trim(stdout.String(), "\n"), 10, 64)
87 if err != nil {
88 log.Fatal(err)
89 }
90
91 totalSockets += int(sockets)
92
93 fmt.Printf(
94 "- %s: %d sockets\n",
95 pod.Spec.NodeName,
96 sockets,
97 )
98 }
99
100 fmt.Printf("Total sockets: %d\n", totalSockets)
101}