From e92192d37962a814d3546fd6c5b9f46d6f36cca4 Mon Sep 17 00:00:00 2001 From: Piotr Szczesniak Date: Fri, 20 Feb 2015 11:39:15 +0100 Subject: [PATCH] Added new command clusterinfo to kubectl This is first version of the command. It prints IPs of master and cluster services. Should be improved once generalized labels are implemented #341. It requires label kubernet.io/cluster-service=true set for cluster services. Follow up cl after discussion in #4417. --- cluster/addons/dns/skydns-rc.yaml.in | 1 + docs/kubectl-clusterinfo.md | 46 ++++++++++ docs/kubectl.md | 1 + docs/man/man1/kubectl-clusterinfo.1 | 132 +++++++++++++++++++++++++++ docs/man/man1/kubectl.1 | 2 +- pkg/kubectl/cmd/clusterinfo.go | 72 +++++++++++++++ pkg/kubectl/cmd/cmd.go | 1 + 7 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 docs/kubectl-clusterinfo.md create mode 100644 docs/man/man1/kubectl-clusterinfo.1 create mode 100644 pkg/kubectl/cmd/clusterinfo.go diff --git a/cluster/addons/dns/skydns-rc.yaml.in b/cluster/addons/dns/skydns-rc.yaml.in index 4f56ac4c52..00353bb151 100644 --- a/cluster/addons/dns/skydns-rc.yaml.in +++ b/cluster/addons/dns/skydns-rc.yaml.in @@ -11,6 +11,7 @@ desiredState: k8s-app: kube-dns podTemplate: labels: + name: kube-dns k8s-app: kube-dns kubernetes.io/cluster-service: "true" desiredState: diff --git a/docs/kubectl-clusterinfo.md b/docs/kubectl-clusterinfo.md new file mode 100644 index 0000000000..3677e6723c --- /dev/null +++ b/docs/kubectl-clusterinfo.md @@ -0,0 +1,46 @@ +## kubectl clusterinfo + +Display cluster info + +### Synopsis + +``` +Display addresses of the master and services with label kubernetes.io/cluster-service=true +``` + +kubectl clusterinfo + +### Options inherrited from parent commands + +``` + --alsologtostderr=false: log to standard error as well as files + --api-version="": The API version to use when talking to the server + -a, --auth-path="": Path to the auth info file. If missing, prompt the user. Only used if using https. + --certificate-authority="": Path to a cert. file for the certificate authority. + --client-certificate="": Path to a client key file for TLS. + --client-key="": Path to a client key file for TLS. + --cluster="": The name of the kubeconfig cluster to use + --context="": The name of the kubeconfig context to use + -h, --help=false: help for kubectl + --insecure-skip-tls-verify=false: If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure. + --kubeconfig="": Path to the kubeconfig file to use for CLI requests. + --log_backtrace_at=:0: when logging hits line file:N, emit a stack trace + --log_dir=: If non-empty, write log files in this directory + --log_flush_frequency=5s: Maximum number of seconds between log flushes + --logtostderr=true: log to standard error instead of files + --match-server-version=false: Require server version to match client version + --namespace="": If present, the namespace scope for this CLI request. + --password="": Password for basic authentication to the API server. + -s, --server="": The address and port of the Kubernetes API server + --stderrthreshold=2: logs at or above this threshold go to stderr + --token="": Bearer token for authentication to the API server. + --user="": The name of the kubeconfig user to use + --username="": Username for basic authentication to the API server. + --v=0: log level for V logs + --validate=false: If true, use a schema to validate the input before sending it + --vmodule=: comma-separated list of pattern=N settings for file-filtered logging +``` + +### SEE ALSO +* [kubectl](kubectl.md) + diff --git a/docs/kubectl.md b/docs/kubectl.md index 7f3265eed3..6edec67d94 100644 --- a/docs/kubectl.md +++ b/docs/kubectl.md @@ -45,6 +45,7 @@ kubectl ### SEE ALSO * [kubectl-version](kubectl-version.md) +* [kubectl-clusterinfo](kubectl-clusterinfo.md) * [kubectl-proxy](kubectl-proxy.md) * [kubectl-get](kubectl-get.md) * [kubectl-describe](kubectl-describe.md) diff --git a/docs/man/man1/kubectl-clusterinfo.1 b/docs/man/man1/kubectl-clusterinfo.1 new file mode 100644 index 0000000000..a59393d0d3 --- /dev/null +++ b/docs/man/man1/kubectl-clusterinfo.1 @@ -0,0 +1,132 @@ +.TH "KUBERNETES" "1" " kubernetes User Manuals" "Eric Paris" "Jan 2015" "" + + +.SH NAME +.PP +kubectl clusterinfo \- Display cluster info + + +.SH SYNOPSIS +.PP +\fBkubectl clusterinfo\fP [OPTIONS] + + +.SH DESCRIPTION +.PP +Display addresses of the master and services with label kubernetes.io/cluster\-service=true + + +.SH OPTIONS INHERITED FROM PARENT COMMANDS +.PP +\fB\-\-alsologtostderr\fP=false + log to standard error as well as files + +.PP +\fB\-\-api\-version\fP="" + The API version to use when talking to the server + +.PP +\fB\-a\fP, \fB\-\-auth\-path\fP="" + Path to the auth info file. If missing, prompt the user. Only used if using https. + +.PP +\fB\-\-certificate\-authority\fP="" + Path to a cert. file for the certificate authority. + +.PP +\fB\-\-client\-certificate\fP="" + Path to a client key file for TLS. + +.PP +\fB\-\-client\-key\fP="" + Path to a client key file for TLS. + +.PP +\fB\-\-cluster\fP="" + The name of the kubeconfig cluster to use + +.PP +\fB\-\-context\fP="" + The name of the kubeconfig context to use + +.PP +\fB\-h\fP, \fB\-\-help\fP=false + help for kubectl + +.PP +\fB\-\-insecure\-skip\-tls\-verify\fP=false + If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure. + +.PP +\fB\-\-kubeconfig\fP="" + Path to the kubeconfig file to use for CLI requests. + +.PP +\fB\-\-log\_backtrace\_at\fP=:0 + when logging hits line file:N, emit a stack trace + +.PP +\fB\-\-log\_dir\fP="" + If non\-empty, write log files in this directory + +.PP +\fB\-\-log\_flush\_frequency\fP=5s + Maximum number of seconds between log flushes + +.PP +\fB\-\-logtostderr\fP=true + log to standard error instead of files + +.PP +\fB\-\-match\-server\-version\fP=false + Require server version to match client version + +.PP +\fB\-\-namespace\fP="" + If present, the namespace scope for this CLI request. + +.PP +\fB\-\-password\fP="" + Password for basic authentication to the API server. + +.PP +\fB\-s\fP, \fB\-\-server\fP="" + The address and port of the Kubernetes API server + +.PP +\fB\-\-stderrthreshold\fP=2 + logs at or above this threshold go to stderr + +.PP +\fB\-\-token\fP="" + Bearer token for authentication to the API server. + +.PP +\fB\-\-user\fP="" + The name of the kubeconfig user to use + +.PP +\fB\-\-username\fP="" + Username for basic authentication to the API server. + +.PP +\fB\-\-v\fP=0 + log level for V logs + +.PP +\fB\-\-validate\fP=false + If true, use a schema to validate the input before sending it + +.PP +\fB\-\-vmodule\fP= + comma\-separated list of pattern=N settings for file\-filtered logging + + +.SH SEE ALSO +.PP +\fBkubectl(1)\fP, + + +.SH HISTORY +.PP +January 2015, Originally compiled by Eric Paris (eparis at redhat dot com) based on the kubernetes source material, but hopefully they have been automatically generated since! diff --git a/docs/man/man1/kubectl.1 b/docs/man/man1/kubectl.1 index 3d9065e55e..d11bb1190d 100644 --- a/docs/man/man1/kubectl.1 +++ b/docs/man/man1/kubectl.1 @@ -128,7 +128,7 @@ Find more information at .SH SEE ALSO .PP -\fBkubectl\-version(1)\fP, \fBkubectl\-proxy(1)\fP, \fBkubectl\-get(1)\fP, \fBkubectl\-describe(1)\fP, \fBkubectl\-create(1)\fP, \fBkubectl\-update(1)\fP, \fBkubectl\-delete(1)\fP, \fBkubectl\-config(1)\fP, \fBkubectl\-namespace(1)\fP, \fBkubectl\-log(1)\fP, \fBkubectl\-rollingupdate(1)\fP, \fBkubectl\-resize(1)\fP, \fBkubectl\-exec(1)\fP, \fBkubectl\-port\-forward(1)\fP, \fBkubectl\-run\-container(1)\fP, \fBkubectl\-stop(1)\fP, \fBkubectl\-expose(1)\fP, \fBkubectl\-label(1)\fP, +\fBkubectl\-version(1)\fP, \fBkubectl\-clusterinfo(1)\fP, \fBkubectl\-proxy(1)\fP, \fBkubectl\-get(1)\fP, \fBkubectl\-describe(1)\fP, \fBkubectl\-create(1)\fP, \fBkubectl\-update(1)\fP, \fBkubectl\-delete(1)\fP, \fBkubectl\-config(1)\fP, \fBkubectl\-namespace(1)\fP, \fBkubectl\-log(1)\fP, \fBkubectl\-rollingupdate(1)\fP, \fBkubectl\-resize(1)\fP, \fBkubectl\-exec(1)\fP, \fBkubectl\-port\-forward(1)\fP, \fBkubectl\-run\-container(1)\fP, \fBkubectl\-stop(1)\fP, \fBkubectl\-expose(1)\fP, \fBkubectl\-label(1)\fP, .SH HISTORY diff --git a/pkg/kubectl/cmd/clusterinfo.go b/pkg/kubectl/cmd/clusterinfo.go new file mode 100644 index 0000000000..bc242f4889 --- /dev/null +++ b/pkg/kubectl/cmd/clusterinfo.go @@ -0,0 +1,72 @@ +/* +Copyright 2015 Google Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "fmt" + "io" + "strings" + + "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/resource" + + "github.com/spf13/cobra" +) + +func (f *Factory) NewCmdClusterInfo(out io.Writer) *cobra.Command { + cmd := &cobra.Command{ + Use: "clusterinfo", + Short: "Display cluster info", + Long: "Display addresses of the master and services with label kubernetes.io/cluster-service=true", + Run: func(cmd *cobra.Command, args []string) { + RunClusterInfo(f, out, cmd) + }, + } + return cmd +} + +func RunClusterInfo(factory *Factory, out io.Writer, cmd *cobra.Command) { + client, err := factory.ClientConfig(cmd) + checkErr(err) + fmt.Fprintf(out, "Kubernetes master is running at %v\n", client.Host) + + mapper, typer := factory.Object(cmd) + cmdNamespace, err := factory.DefaultNamespace(cmd) + checkErr(err) + + // TODO: use generalized labels once they are implemented (#341) + b := resource.NewBuilder(mapper, typer, factory.ClientMapperForCommand(cmd)). + NamespaceParam(cmdNamespace).DefaultNamespace(). + SelectorParam("kubernetes.io/cluster-service=true"). + ResourceTypeOrNameArgs(false, []string{"services"}...). + Latest() + b.Do().Visit(func(r *resource.Info) error { + services := r.Object.(*api.ServiceList).Items + for _, service := range services { + splittedLink := strings.Split(strings.Split(service.ObjectMeta.SelfLink, "?")[0], "/") + // insert "proxy" into the link + splittedLink = append(splittedLink, "") + copy(splittedLink[4:], splittedLink[3:]) + splittedLink[3] = "proxy" + link := strings.Join(splittedLink, "/") + fmt.Fprintf(out, "%v is running at %v%v/\n", service.ObjectMeta.Labels["name"], client.Host, link) + } + return nil + }) + + // TODO: consider printing more information about cluster +} diff --git a/pkg/kubectl/cmd/cmd.go b/pkg/kubectl/cmd/cmd.go index 29f6ea29d3..f321ba8c76 100644 --- a/pkg/kubectl/cmd/cmd.go +++ b/pkg/kubectl/cmd/cmd.go @@ -197,6 +197,7 @@ Find more information at https://github.com/GoogleCloudPlatform/kubernetes.`, f.BindFlags(cmds.PersistentFlags()) cmds.AddCommand(f.NewCmdVersion(out)) + cmds.AddCommand(f.NewCmdClusterInfo(out)) cmds.AddCommand(f.NewCmdProxy(out)) cmds.AddCommand(f.NewCmdGet(out))