这篇文章发布时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

您不知道的有关 kubectl 的一些事情

kubectl 是用于与 Kubernetes 集群交互的命令行工具。 许多人每天都使用它来将容器工作负载部署到生产集群中。但是,kubectl 的功能远不止 kubectl create -fkubectl rolling-update。kubectl 实际上是容器编排和管理的多功能工具。下面我们描述一些您可能没有见过的 kubectl 功能。

运行交互式命令

kubectl run 自 1.0 版本以来就已存在于 kubectl 中,但最近我们添加了在集群中运行交互式容器的功能。这意味着,在您的 Kubernetes 集群中获得交互式 shell 只需以下命令:

$> kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
Waiting for pod default/busybox-tv9rm to be running, status is Pending, pod ready: false
Waiting for pod default/busybox-tv9rm to be running, status is Running, pod ready: false
$> # ls 
bin dev etc home proc root sys tmp usr var 
$> # exit

上述 kubectl 命令等效于 docker run -i -t busybox sh。遗憾的是,我们在 kubectl 1.0 中错误地将 -t 用于模板,因此我们需要保持与现有 CLI 用户的向后兼容性。但是,现有的 -t 用法已被弃用,我们最终会将 --tty 缩短为 -t

在这个示例中,-i 表示您想要为容器分配一个 stdin,并表示您想要一个交互式会话;--restart=Never 表示在您退出终端后不应重新启动容器;--tty 请求为该会话分配一个 TTY。

查看 Pod 的日志

有时您只想查看服务器中正在发生的事情。为此,请使用 kubectl logs 子命令。添加 -f 标志可让您将新日志实时流式传输到终端,就像 tail -f 一样。

$> kubectl logs -f redis-izl09

附加到现有容器

除了交互式执行命令之外,您现在还可以附加到任何正在运行的进程。就像 kubectl logs 一样,您将获得 stderr 和 stdout 数据,但使用 attach,您还可以将 stdin 从终端发送到程序。对于交互式调试,甚至只是向行为异常的应用程序发送 ctrl-c 都非常有用。

$> kubectl attach redis -i

1:C 12 Oct 23:05:11.848 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf

                _._                
           _.-``__''-._            
      _.-`` `. `_. ''-._ Redis 3.0.3 (00000000/0) 64 bit
  .-`` .-```. ```\/ _.,_ ''-._     
 ( ' , .-` | `, ) Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
 | `-._ `._ / _.-' | PID: 1
  `-._ `-._ `-./ _.-' _.-'         
 |`-._`-._ `-.__.-' _.-'_.-'|      
 | `-._`-._ _.-'_.-' | https://redis.ac.cn
`-._ `-._`-.__.-'_.-' _.-'         
 |`-._`-._ `-.__.-' _.-'_.-'|      
 | `-._`-._ _.-'_.-' |             
  `-._ `-._`-.__.-'_.-' _.-'       
      `-._ `-.__.-' _.-'           
          `-._ _.-'                
              `-.__.-'             

1:M 12 Oct 23:05:11.849 # Server started, Redis version 3.0.3

将 Pod 的端口转发到本地计算机

通常,您希望能够临时与集群中的应用程序通信,而不会出于安全原因将其暴露给公共互联网。为了实现这一点,port-forward 命令允许您通过 Kubernetes API 服务器安全地将本地计算机上的端口转发到集群中运行的 Pod。例如:

$> kubectl port-forward redis-izl09 6379

在您的本地计算机上打开端口 6379,并将该端口的通信转发到集群中的 Pod 或 Service。 例如,您可以使用 telnet 命令来探测集群中的 Redis 服务

$> telnet localhost 6379 
INCR foo
:1
INCR foo 
:2

在现有容器内执行命令

除了能够附加到容器内部的现有进程之外,exec 命令还允许您在现有容器内部生成新进程。这对于调试或检查您的 Pod 以查看内部发生了什么而不会中断正在运行的服务非常有用。kubectl execkubectl run 不同,因为它在现有容器内部运行命令,而不是生成一个新的容器来执行。

$> kubectl exec redis-izl09 -- ls /
bin
boot
data
dev
entrypoint.sh
etc
home

添加或删除标签

有时您希望动态地从 Pod、Service 或 Replication Controller 中添加或删除标签。也许您想将现有的 Pod 添加到 Service 中,或者您想从 Service 中删除 Pod。无论您想要什么,您都可以使用 kubectl label 子命令轻松动态地添加或删除标签。

`$> kubectl label pods redis-izl09 mylabel=awesome `
`pod "redis-izl09" labeled`

向对象添加注释

就像标签一样,您可以使用 kubectl annotate 子命令从 API 对象中添加或删除注释。与标签不同,注释用于帮助描述您的对象,但不会通过标签查询来识别 Pod(有关注释的更多详细信息)。例如,您可能会添加一个图标的注释,供 GUI 用于显示您的 Pod。

$> kubectl annotate pods redis-izl09 icon-url=http://goo.gl/XXBTWq
pod "redis-izl09" annotated

输出自定义格式

有时,您希望自定义 kubectl 汇总集群中的对象时显示的字段。为此,您可以使用 custom-columns-file 格式。custom-columns-file 接受一个用于呈现输出的模板文件。同样,JSONPath 表达式用于模板中以指定 API 对象中的字段。例如,以下模板首先显示重启次数,然后显示对象名称:

$> cat cols.tmpl
RESTARTS                                   NAME
.status.containerStatuses[0].restartCount .metadata.name

如果将此模板传递给 kubectl get pods 命令,您将获得一个 Pod 列表,其中显示指定的字段。

$> kubectl get pods redis-izl09 -o=custom-columns-file --template=cols.tmpl                 RESTARTS           NAME   
 0                  redis-izl09   
 1                  redis-abl42  

轻松管理多个 Kubernetes 集群

如果您运行多个 Kubernetes 集群,您就会知道管理不同集群的所有凭据可能会很棘手。使用 kubectl config 子命令,在不同集群之间切换就像以下操作一样简单:

$> kubectl config use-context

不确定有哪些集群可用?您可以使用以下命令查看当前配置的集群:

$> kubectl config view

哎呀,这会输出大量文本。为了将其限制为我们感兴趣的内容,我们可以使用 JSONPath 模板:

$> kubectl config view -o jsonpath="{.context[*].name}"

啊,这样就好多了。

结论

这就是您可以使用 Kubernetes 集群和 kubectl 命令行执行的九个新而令人兴奋的操作。如果您刚开始使用 Kubernetes,请查看 Google Container Engine 或其他开始使用 Kubernetes 的方法。