04-kubectl 命令之故障排查和调试命令

  • kubectl-describe:显示一个或多个资源对象的详细信息
  • kubectl-logs:输出pod资源对象中一个容器的日志
  • kubectl-attach:连接到一个运行的容器
  • kubectl-exec:在指定容器内执行命令
  • kubectl port-forward:将本机指定端口映射到pod资源对象的端口
  • kubectl proxy:将本机指定端口映射到kube-apiserver
  • kubectl-cp:用于pod与主机交换文件
  • kubectl auth:检查验证

kubectl describe

输出指定的一个/多个资源的详细信息。

此命令组合调用多条API,输出指定的一个或者一组资源的详细描述。

kubectl describe TYPE NAME_PREFIX

首先检查是否有精确匹配 TYPE 和 NAME_PREFIX 的资源,如果没有,将会输出所有名称以 NAME_PREFIX 开头的资源详细信息。

支持的资源包括但不限于(大小写不限):pods(po)、services(svc)、replicationcontrollers(rc)、nodes(no)、events(ev)、componentstatuses(cs)、limitranges(limits)、persistentvolumes(pv)、persistentvolumeclaims(pvc)、resourcequotas(quota) 和 secrets。

官方地址

语法

1
kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 描述一个node
kubectl describe nodes kubernetes-minion-emt8.c.myproject.internal


# 描述一个pod
kubectl describe pods/nginx


# 描述pod.json中的资源类型和名称指定的pod
kubectl describe -f pod.json


# 描述所有的pod
$ kubectl describe pods


# 描述所有包含label name=myLabel的pod
$ kubectl describe po -l name=myLabel


# 描述所有被replication controller “frontend”管理的pod(rc创建的pod都以rc的名字作为前缀)
kubectl describe pods frontend

选项

  • -f, --filename=[]: 用来指定待描述资源的文件名,目录名或者URL。
  • -l, --selector="": 用于过滤资源的Label。

继承自父命令的选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。
--api-version="": 和服务端交互使用的API版本。
--certificate-authority="": 用以进行认证授权的.cert文件路径。
--client-certificate="": TLS使用的客户端证书路径。
--client-key="": TLS使用的客户端密钥路径。
--cluster="": 指定使用的kubeconfig配置文件中的集群名。
--context="": 指定使用的kubeconfig配置文件中的环境名。
--insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。
--kubeconfig="": 命令行请求使用的配置文件路径。
--log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。
--log-dir="": 如果不为空,将日志文件写入此目录。
--log-flush-frequency=5s: 刷新日志的最大时间间隔。
--logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。
--match-server-version[=false]: 要求服务端和客户端版本匹配。
--namespace="": 如果不为空,命令将使用此namespace。
--password="": API Server进行简单认证使用的密码。
-s, --server="": Kubernetes API Server的地址和端口号。
--stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。
--token="": 认证到API Server使用的令牌。
--user="": 指定使用的kubeconfig配置文件中的用户名。
--username="": API Server进行简单认证使用的用户名。
--v=0: 指定输出日志的级别。
--vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。

kubectl logs

输出pod中一个容器的日志。如果pod只包含一个容器则可以省略容器名。

官方文档

语法格式

1
kubectl logs [-f] [-p] POD [-c CONTAINER]

选项

1
2
3
4
5
6
7
8
9
-c, --container="": 容器名。
-f, --follow[=false]: 指定是否持续输出日志。
--interactive[=true]: 如果为true,当需要时提示用户进行输入。默认为true
--limit-bytes=0: 输出日志的最大字节数。默认无限制。
-p, --previous[=false]: 如果为true,输出pod中曾经运行过,但目前已终止的容器的日志。
--since=0: 仅返回相对时间范围,如5s、2m或3h,之内的日志。默认返回所有日志。只能同时使用since和since-time中的一种。
--since-time="": 仅返回指定时间(RFC3339格式)之后的日志。默认返回所有日志。只能同时使用since和since-time中的一种。
--tail=-1: 要显示的最新的日志条数。默认为-1,显示所有的日志。
--timestamps[=false]: 在日志中包含时间戳。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 返回仅包含一个容器的pod nginx的日志快照
kubectl logs nginx


# 返回pod ruby中已经停止的容器web-1的日志快照
kubectl logs -p -c ruby web-1


# 持续输出pod ruby中的容器web-1的日志
kubectl logs -f -c ruby web-1


# 仅输出pod nginx中最近的20条日志
kubectl logs --tail=20 nginx


# 输出pod nginx中最近一小时内产生的所有日志
$ kubectl logs --since=1h nginx

kubectl attach

连接到一个正在运行的容器。

官方文档

语法

kubectl attach POD -c CONTAINER

参数选项

  • -c, --container="": 容器名。如果省略,则默认选择第一个 pod。
  • -i, --stdin[=false]: 将控制台输入发送到容器。
  • -t, --tty[=false]: 将标准输入控制台作为容器的控制台输入。
1
2
3
4
5
6
7
8
9
# 获取正在运行中的pod 123456-7890的输出,默认连接到第一个容器
kubectl attach 123456-7890

# 获取pod 123456-7890中ruby-container的输出
kubectl attach 123456-7890 -c ruby-container

# 切换到终端模式,将控制台输入发送到pod 123456-7890的ruby-container的“bash”命令,并将其输出到控制台/
# 错误控制台的信息发送回客户端。
kubectl attach 123456-7890 -c ruby-container -i -t

kubectl exec

在容器内部执行命令。

官方文档

语法格式

1
kubectl exec POD [-c CONTAINER] -- COMMAND [args...]

选项

  • -c, --container="": 容器名。如果未指定,使用pod中的一个容器。
  • -p, --pod="": Pod名。
  • -i, --stdin[=false]: 将控制台输入发送到容器。
  • -t, --tty[=false]: 将标准输入控制台作为容器的控制台输入。

举例

1
2
3
4
5
6
7
8
9
# 默认在pod 123456-7890的第一个容器中运行“date”并获取输出
kubectl exec 123456-7890 date

# 在pod 123456-7890的容器ruby-container中运行“date”并获取输出
kubectl exec 123456-7890 -c ruby-container date

# 切换到终端模式,将控制台输入发送到pod 123456-7890的ruby-container的“bash”命令,并将其输出到控制台/
# 错误控制台的信息发送回客户端。
$ kubectl exec 123456-7890 -c ruby-container -i -t -- bash -il

kubectl port-forward

ubectl proxy

kubectl cp

用于pod和外部的文件交换,类似于docker 的cp,就是将容器中的内容和外部的内容进行交换。

官方文档

语法

1
kubectl cp <file-spec-src> <file-spec-dest> [options]

示例

1
2
3
4
5
6
7
8
9
10
# 拷贝宿主机本地文件夹到pod
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir


# 指定namespace的拷贝pod文件到宿主机本地目录
kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar


# 对于多容器pod,用-c指定容器名
kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container>

kubectl auth


04-kubectl 命令之故障排查和调试命令
https://flepeng.github.io/042-云原生-02-kubernetes-13-命令-kubectl-04-kubectl-命令之故障排查和调试命令/
作者
Lepeng
发布于
2023年3月1日
许可协议