chore: added tool to get socket count
diff --git a/tools/socketcount/socketcount.go b/tools/socketcount/socketcount.go
new file mode 100644
index 0000000..ba14192
--- /dev/null
+++ b/tools/socketcount/socketcount.go
@@ -0,0 +1,101 @@
+package main
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "path/filepath"
+ "strconv"
+ "strings"
+
+ log "github.com/sirupsen/logrus"
+ "github.com/spf13/pflag"
+ v1 "k8s.io/api/core/v1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/client-go/kubernetes"
+ "k8s.io/client-go/kubernetes/scheme"
+ "k8s.io/client-go/tools/clientcmd"
+ "k8s.io/client-go/tools/remotecommand"
+ "k8s.io/client-go/util/homedir"
+)
+
+var (
+ kubeconfig string
+)
+
+func init() {
+ homedir := homedir.HomeDir()
+ pflag.StringVar(
+ &kubeconfig,
+ "kubeconfig",
+ filepath.Join(homedir, ".kube", "config"),
+ "absolute path to the kubeconfig file",
+ )
+}
+
+func main() {
+ pflag.Parse()
+
+ config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ clientset, err := kubernetes.NewForConfig(config)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ pods, err := clientset.CoreV1().Pods("kube-system").List(context.TODO(), metav1.ListOptions{
+ LabelSelector: "k8s-app=kube-proxy",
+ })
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ totalSockets := 0
+ for _, pod := range pods.Items {
+ req := clientset.CoreV1().RESTClient().
+ Post().
+ Resource("pods").
+ Namespace(pod.Namespace).
+ Name(pod.Name).
+ SubResource("exec").
+ VersionedParams(&v1.PodExecOptions{
+ Command: []string{"/bin/sh", "-c", "cat /proc/cpuinfo | grep '^physical id' | sort | uniq | wc -l"},
+ Stdin: false,
+ Stdout: true,
+ Stderr: true,
+ TTY: false,
+ }, scheme.ParameterCodec)
+
+ exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ var stdout, stderr bytes.Buffer
+ err = exec.StreamWithContext(context.TODO(), remotecommand.StreamOptions{
+ Stdout: &stdout,
+ Stderr: &stderr,
+ })
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ sockets, err := strconv.ParseInt(strings.Trim(stdout.String(), "\n"), 10, 64)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ totalSockets += int(sockets)
+
+ fmt.Printf(
+ "- %s: %d sockets\n",
+ pod.Spec.NodeName,
+ sockets,
+ )
+ }
+
+ fmt.Printf("Total sockets: %d\n", totalSockets)
+}