Use protobuf for kubectl top

This commit is contained in:
Marek Siarkowicz 2020-11-18 00:14:20 +01:00
parent 7f083d339f
commit 560394da38
2 changed files with 28 additions and 11 deletions

View File

@ -27,6 +27,7 @@ import (
"k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/client-go/discovery" "k8s.io/client-go/discovery"
corev1client "k8s.io/client-go/kubernetes/typed/core/v1" corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
"k8s.io/klog/v2"
cmdutil "k8s.io/kubectl/pkg/cmd/util" cmdutil "k8s.io/kubectl/pkg/cmd/util"
"k8s.io/kubectl/pkg/metricsutil" "k8s.io/kubectl/pkg/metricsutil"
"k8s.io/kubectl/pkg/util/i18n" "k8s.io/kubectl/pkg/util/i18n"
@ -38,10 +39,12 @@ import (
// TopNodeOptions contains all the options for running the top-node cli command. // TopNodeOptions contains all the options for running the top-node cli command.
type TopNodeOptions struct { type TopNodeOptions struct {
ResourceName string ResourceName string
Selector string Selector string
SortBy string SortBy string
NoHeaders bool NoHeaders bool
UseProtocolBuffers bool
NodeClient corev1client.CoreV1Interface NodeClient corev1client.CoreV1Interface
Printer *metricsutil.TopCmdPrinter Printer *metricsutil.TopCmdPrinter
DiscoveryClient discovery.DiscoveryInterface DiscoveryClient discovery.DiscoveryInterface
@ -87,6 +90,7 @@ func NewCmdTopNode(f cmdutil.Factory, o *TopNodeOptions, streams genericclioptio
cmd.Flags().StringVarP(&o.Selector, "selector", "l", o.Selector, "Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)") cmd.Flags().StringVarP(&o.Selector, "selector", "l", o.Selector, "Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)")
cmd.Flags().StringVar(&o.SortBy, "sort-by", o.Selector, "If non-empty, sort nodes list using specified field. The field can be either 'cpu' or 'memory'.") cmd.Flags().StringVar(&o.SortBy, "sort-by", o.Selector, "If non-empty, sort nodes list using specified field. The field can be either 'cpu' or 'memory'.")
cmd.Flags().BoolVar(&o.NoHeaders, "no-headers", o.NoHeaders, "If present, print output without headers") cmd.Flags().BoolVar(&o.NoHeaders, "no-headers", o.NoHeaders, "If present, print output without headers")
cmd.Flags().BoolVar(&o.UseProtocolBuffers, "use-protocol-buffers", o.UseProtocolBuffers, "If present, protocol-buffers will be used to request metrics.")
return cmd return cmd
} }
@ -109,6 +113,11 @@ func (o *TopNodeOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []
if err != nil { if err != nil {
return err return err
} }
if o.UseProtocolBuffers {
config.ContentType = "application/vnd.kubernetes.protobuf"
} else {
klog.Warning("Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag")
}
o.MetricsClient, err = metricsclientset.NewForConfig(config) o.MetricsClient, err = metricsclientset.NewForConfig(config)
if err != nil { if err != nil {
return err return err

View File

@ -41,13 +41,15 @@ import (
) )
type TopPodOptions struct { type TopPodOptions struct {
ResourceName string ResourceName string
Namespace string Namespace string
Selector string Selector string
SortBy string SortBy string
AllNamespaces bool AllNamespaces bool
PrintContainers bool PrintContainers bool
NoHeaders bool NoHeaders bool
UseProtocolBuffers bool
PodClient corev1client.PodsGetter PodClient corev1client.PodsGetter
Printer *metricsutil.TopCmdPrinter Printer *metricsutil.TopCmdPrinter
DiscoveryClient discovery.DiscoveryInterface DiscoveryClient discovery.DiscoveryInterface
@ -106,6 +108,7 @@ func NewCmdTopPod(f cmdutil.Factory, o *TopPodOptions, streams genericclioptions
cmd.Flags().BoolVar(&o.PrintContainers, "containers", o.PrintContainers, "If present, print usage of containers within a pod.") cmd.Flags().BoolVar(&o.PrintContainers, "containers", o.PrintContainers, "If present, print usage of containers within a pod.")
cmd.Flags().BoolVarP(&o.AllNamespaces, "all-namespaces", "A", o.AllNamespaces, "If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.") cmd.Flags().BoolVarP(&o.AllNamespaces, "all-namespaces", "A", o.AllNamespaces, "If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.")
cmd.Flags().BoolVar(&o.NoHeaders, "no-headers", o.NoHeaders, "If present, print output without headers.") cmd.Flags().BoolVar(&o.NoHeaders, "no-headers", o.NoHeaders, "If present, print output without headers.")
cmd.Flags().BoolVar(&o.UseProtocolBuffers, "use-protocol-buffers", o.UseProtocolBuffers, "If present, protocol-buffers will be used to request metrics.")
return cmd return cmd
} }
@ -131,6 +134,11 @@ func (o *TopPodOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []s
if err != nil { if err != nil {
return err return err
} }
if o.UseProtocolBuffers {
config.ContentType = "application/vnd.kubernetes.protobuf"
} else {
klog.Warning("Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag")
}
o.MetricsClient, err = metricsclientset.NewForConfig(config) o.MetricsClient, err = metricsclientset.NewForConfig(config)
if err != nil { if err != nil {
return err return err