2.5 kubectl 格式化输出
kubectl
命令可以对结果进行多种格式化显示,输出的格式通过-o
参数指定:
kubectl [command] [TYPE] [NAME] -o= <output format>
根据不同子命令的输出结果,可选的输出格式如图所示:
常用的输出格式示例如下:
① 显示 Pod
的更多信息,例如 Node IP
等:
kubectl get pod <pod-name> -o wide
② 以 YAML
格式显示 Pod
的详细信息:
kubectl get pod <pod-name> -o yaml
③ 以自定义列名显示 Pod
的信息:
kubectl get pod <pod-name>-o custom-columns=NAME:metadata. Name, RSRC: metadata. Resourceversion
④ 基于自定义列名配置文件进行输出:
kubectl get pods <pod-name>-o=custom-columns-file=template.txt
template.. txt
文件的内容如下:
NAME RSRC metadata.Name metadata.Resourceversion
输出结果为如下:
NAME RSRC pod-name 52305
⑤ 关闭服务端列名。在默认情况下Kubernetes
服务端会将资源对象的某些特定信息显示为列,这可以通过设置-server-print=false
参数进行关闭,例如:
kubectl get pods <pod-name> --server-print=false
输出结果:
NAME AGE pod-name 1m
⑥ 将输出结果按某个字段排序。可以通过--sort-by
参数以 jsonpath
表达式进行指定:
kubectl [command] [TYPE] [NAME] --sort-by= <isonpath exp
例如,按照资源对象的名称进行排序:
kubectl get pods --sort-by=.metadata. Name
03 kubectl 操作例子
3.1 kubectl apply
kubectl apply:以文件或
stdin
部署或更新一个或多个资源
基于 example-service.yaml
中的定义创建一个 Service
资源:
kubectl apply -f example-service.yaml
使用 example--controller.yaml
中的定义创建一个 Replication Controller
资源:
kubectl apply -f example-controller.yaml
使用<directory>
目录下所有yaml、yml 和json 文件中的定义进行创建:
kubectl apply -f <directory>
3.2 kubectl get
kubectl get:列出一个或多个资源对象的信息
以文本格式列出所有 Pod
:
kubectl get pods
以文本格式列出所有 Pod
,包含附加信息(如 Node IP
):
kubectl get pods -o wide
以文本格式列出指定名称的 RC
:
kubectl get replicationcontroller <rc-name>
以文本格式列出所有 RC
和 Service
:
kubectl get rc, services
以文本格式列出所有 Daemonset
,包括未初始化的 Daemonset
:
kubectl get ds --include-uninitialized
列出在节点 server01
上运行的所有 Pod
:
kubectl get pods --field-selector=spec.nodeName=server01
3.3 kubectl describe
kubectl describe:显示一个或多个资源的详细信息)
显示名称为<node-name>
的节点的详细信息:
kubectl describe nodes <node-name>
显示名称为<pod-name>
的 Pod 的详细信息:
kubectl describe pods/ <pod-name>
显示名称为<rc-name>
的RC
控制器管理的所有Pod
的详细信息:
kubectl describe pods <rc-name>
描述所有 Pod 的详细信息:
kubectl describe pods
对 kubectl get
和 kubectl describe
命令说明如下:
- kubectl get命令 :常用于查看同一资源类型的一个或多个资源对象,可以使用
-o
或-output
参数自定义输出格式,还可以通过-w
或-watch
参数开启对资源对象更新的监控。 - kubectl describe 命令:更侧重于描述指定资源的各方面详细信息,通过对
API Server
的多个API
调用来构建结果视图。例如通过kubectl describe node
命令不仅会返回节点信息,还会返回在其上运行的Pod
的摘要、节点事件等信息。
3.4 kubectl delete
kubectl delete:该命令可以使用文件、
stdin
的输入删除指定的资源对象,还可以通过标签选择器、名称、资源选择器等条件来限定待删除的资源范围。
使用在 pod.yaml
文件中指定的类型和名称删除 Pod
:
kubectl delete -f pod.yaml
删除所有带有<label-key> = <label-value>:
标签的 Pod
和 Service
:
kubectl delete pods, services -1 <label-key> = <label-value>
删除所有 Pod,包括未初始化的 Pod
kubectl delete pods -all
3.5 kubectl exec
kubectl exec:在
Pod
的容器中运行命令
在名称为<pod-name>
的 Pod
的第 1 个容器中运行 date
命令并打印输出结果:
kubectl exec <pod-name> -- date
在指定的容器中运行 date
命令并打印输出结果:
kubectl exec <pod-name> -c <container-name> -- date
在Pod
的第1 个容器中运行bin/bash
命令进入交互式 TTY
终端界面:
kubectl exec -ti <pod-name> /bin/bash
3.6 kubectl logs
kubectl logs:打印 Pod 中容器的日志
kubectl logs <pod-name>
显示Pod
中名称为<container-name>
的容器输出到 stdout
的日志:
kubectl logs <pod-name> -c <container-name>
持续监控显示 pod
中的第 1 个容器输出到 stdout
的日志,类似于 tail -f
命令的功能:
kubectl logs -f <pod-name>
3.7 kubectl edit
kubectl edit 命令:编辑运行中的资源对象,例如使用下面的命令编辑运行中的一个
Deployment
kubectl edit deploy nginx
在命令运行之后,会通过 YAML
格式展示该对象的文本格式定义,用户可以对代码进行编辑和保存,从而完成对在线资源的直接修改。
3.8 kubectl port-forward
kubectl port-forward 命令:将
Pod
的端口号映射到宿主机
将 Pod
的 80 端口映射到宿主机的 8888 端口,客户端即可通过 http: //<NodeIP>:8888
访问容器服务了:
kubectl port-forward --address 0.0.0.0\ pod/nginx-6ddbbc47fb-sfdcv 8888:80
3.9 kubectl cp
kubectl cp命令: 在容器和 Node之间复制文件
把Pod
(默认为第1个容器)中的/etc/fstab
文件复制到宿主机的/tmp
目录下:
kubectl cp nginx-6ddbbc47fb-sfdcv:/etc/fstab /tmp
3.10 kubectl label
kubectl label命令: 设置资源对象的标签
名为“default
“”的命名空间设置“testing-=true
”标签:
kubectl label namespaces default testing=true
3.11 创建和使用命令行插件
为了扩展 kubectl
的功能,Kubernetes
从 1.8
版本开始引入插件机制,在 1.14
版本时达到稳定版。
用户自定义插件的可执行文件名需要以 kubectl-
”开头,复制到$PATH
中的某 个目录(如/usr/local/bin
)下,然后就可以通过kubectl<plugin-name>
运行自定义插件了。
例如,通过 Shell
脚本实现一个名为 hello
的插件,其功能为在屏幕上输出字符串“hello world
”。创建名为 kubectl-hello
的 Shell
脚本文件,内容如下:
#!/bin/sh echo "hello world"
为该脚本添加可执行权限:
chmod a+x./kubectl-hello
复制kubectl-helo
文件到/usr/local/bin/
目录下,就完成了安装插件的工作:
cp ./kubectl-hello /usr/local/bin
然后在 kubectl
命令后带上插件名称就能使用该插件了:
kubectl hello hello world
卸载插件也很简单,只需要删除插件文件即可:
rm /usr/local/bin/kubectl-hello
通过插件机制,可以将某些复杂的kubectl
命令简化为运行插件的方式。例如想创建一个命令来查看当前上下文环境(context
)中的用户名,则可以通过 kubectl config view
命令进行查看。为此,可以创建一个名为 kubectl--whoami'
的 Shell
脚本,内容如下:
#!/bin/bash kubectl config view --template=' ({range contexts }) {if eq name "'$ (kubectl config current-context) '"}}Current user: {printf "%s\n"context.user }}{end)) { end }
为该脚本添加可执行权限,并复制到/usr/local/bin/
目录下完成插件的安装:
chmod +x ./kubectl-whoami cp ./kubectl-whoami /usr/local/bin
运行kubectl whoami
命令,就能通过插件功能查看上下文环境中的用户名了:
kubectl whoami Current user: plugins-user
另外,使用kubectl plugin list
命令可以查看当前系统中已安装的插件列表:
kubectl plugin list The following kubectl-compatible plugins are available: /usr/local/bin/kubectl-hello /usr/local/bin/kubectl-foo /usr/local/bin/kubectl-bar