contrib/utils/kubectl_cmd_linux.go (39 lines of code) (raw):
//go:build linux
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
package utils
import (
"context"
"fmt"
"time"
"github.com/Azure/kperf/contrib/internal/mountns"
"golang.org/x/sys/unix"
"k8s.io/klog/v2"
)
// Metrics returns the metrics for a specific kube-apiserver.
func (kr *KubectlRunner) Metrics(ctx context.Context, timeout time.Duration, fqdn, ip string) ([]byte, error) {
args := []string{}
if kr.kubeCfgPath != "" {
args = append(args, "--kubeconfig", kr.kubeCfgPath)
}
args = append(args, "get", "--raw", "/metrics")
var result []byte
merr := mountns.Executes(func() error {
newETCHostFile, cleanup, err := CreateTempFileWithContent([]byte(fmt.Sprintf("%s %s\n", ip, fqdn)))
if err != nil {
return err
}
defer func() { _ = cleanup() }()
target := "/etc/hosts"
err = unix.Mount(newETCHostFile, target, "none", unix.MS_BIND, "")
if err != nil {
return fmt.Errorf("failed to mount %s on %s: %w",
newETCHostFile, target, err)
}
defer func() {
derr := unix.Unmount(target, 0)
if derr != nil {
klog.Warningf("failed umount %s", target)
}
}()
result, err = runCommand(ctx, timeout, "kubectl", args)
return err
})
return result, merr
}