kubectl

kubectl 是 Kubernetes 的命令行工具(CLI),是 Kubernetes 用户和管理员必备的管理工具。

kubectl 提供了大量的子命令,方便管理 Kubernetes 集群中的各种功能。这里不再罗列各种子命令的格式,而是介绍下如何查询命令的帮助

  • kubectl -h 查看子命令列表

  • kubectl options 查看全局选项

  • kubectl <command> --help 查看子命令的帮助

  • kubectl [command] [PARAMS] -o=<format> 设置输出格式(如 json、yaml、jsonpath 等)

  • kubectl explain [RESOURCE] 查看资源的定义

配置

使用 kubectl 的第一步是配置 Kubernetes 集群以及认证方式,包括

  • cluster 信息:Kubernetes server 地址

  • 用户信息:用户名、密码或密钥

  • Context:cluster、用户信息以及 Namespace 的组合

示例

kubectl config set-credentials myself --username=admin --password=secret
kubectl config set-cluster local-server --server=http://localhost:8080
kubectl config set-context default-context --cluster=local-server --user=myself --namespace=default
kubectl config use-context default-context
kubectl config view

常用命令格式

  • 创建:kubectl run <name> --image=<image> 或者 kubectl create -f manifest.yaml

  • 查询:kubectl get <resource>

  • 更新 kubectl set 或者 kubectl patch

  • 删除:kubectl delete <resource> <name> 或者 kubectl delete -f manifest.yaml

  • 查询 Pod IP:kubectl get pod <pod-name> -o jsonpath='{.status.podIP}'

  • 容器内执行命令:kubectl exec -ti <pod-name> sh

  • 容器日志:kubectl logs [-f] <pod-name>

  • 导出服务:kubectl expose deploy <name> --port=80

  • Base64 解码:

注意,kubectl run 仅支持 Pod、Replication Controller、Deployment、Job 和 CronJob 等几种资源。具体的资源类型是由参数决定的,默认为 Deployment:

创建的资源类型
参数

Pod

--restart=Never

Replication Controller

--generator=run/v1

Deployment

--restart=Always

Job

--restart=OnFailure

CronJob

--schedule=<cron>

命令行自动补全

Linux 系统 Bash:

MacOS zsh

自定义输出列

比如,查询所有 Pod 的资源请求和限制:

日志查看

kubectl logs 用于显示 pod 运行中,容器内程序输出到标准输出的内容。跟 docker 的 logs 命令类似。

注:kubectl 只可以查看单个容器的日志,如果想要同时查看多个 Pod 的日志,可以使用 stern。比如: stern --all-namespaces -l run=nginx

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

kubectl attach 用于连接到一个正在运行的容器。跟 docker 的 attach 命令类似。

在容器内部执行命令

kubectl exec 用于在一个正在运行的容器执行命令。跟 docker 的 exec 命令类似。

多容器 Pod 可通过 kubectl.kubernetes.io/default-container annotation 配置 kubectl 命令的默认容器。

端口转发

kubectl port-forward 用于将本地端口转发到指定的 Pod。

也可以将本地端口转发到服务、复制控制器或者部署的端口。

API Server 代理

kubectl proxy 命令提供了一个 Kubernetes API 服务的 HTTP 代理。

可以通过代理地址 http://localhost:8080/api/ 来直接访问 Kubernetes API,比如查询 Pod 列表

注意,如果通过 --address 指定了非 localhost 的地址,则访问 8080 端口时会报未授权的错误,可以设置 --accept-hosts 来避免这个问题( 不推荐生产环境这么设置 ):

文件拷贝

kubectl cp 支持从容器中拷贝,或者拷贝文件到容器中

注意:文件拷贝依赖于 tar 命令,所以容器中需要能够执行 tar 命令

kubectl drain

  • 它会删除该 NODE 上由 ReplicationController, ReplicaSet, DaemonSet, StatefulSet or Job 创建的 Pod

  • 不删除 mirror pods(因为不可通过 API 删除 mirror pods)

  • 如果还有其它类型的 Pod(比如不通过 RC 而直接通过 kubectl create 的 Pod)并且没有 --force 选项,该命令会直接失败

  • 如果命令中增加了 --force 选项,则会强制删除这些不是通过 ReplicationController, Job 或者 DaemonSet 创建的 Pod

有的时候不需要 evict pod,只需要标记 Node 不可调用,可以用 kubectl cordon 命令。

恢复的话只需要运行 kubectl uncordon NODE 将 NODE 重新改成可调度状态。

权限检查

kubectl auth 提供了两个子命令用于检查用户的鉴权情况:

  • kubectl auth can-i 检查用户是否有权限进行某个操作,比如

  • kubectl auth reconcile 自动修复有问题的 RBAC 策略,如

模拟其他用户

kubectl 支持模拟其他用户或者组来进行集群管理操作,比如

这实际上就是在请求 Kubernetes API 时添加了如下的 HTTP HEADER:

查看事件(events)

kubectl 插件

kubectl 插件提供了一种扩展 kubectl 的机制,比如添加新的子命令。插件可以以任何语言编写,只需要满足以下条件即可

  • 插件放在 ~/.kube/plugins 或环境变量 KUBECTL_PLUGINS_PATH 指定的目录中

  • 插件的格式为 子目录 / 可执行文件或脚本 且子目录中要包括 plugin.yaml 配置文件

比如

你也可以使用 krew 来管理 kubectl 插件。

原始 URI

kubectl 也可以用来直接访问原始 URI,比如要访问 Metrics API 可以

  • kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes

  • kubectl get --raw /apis/metrics.k8s.io/v1beta1/pods

  • kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes/<node-name>

  • kubectl get --raw /apis/metrics.k8s.io/v1beta1/namespaces/<namespace-name>/pods/<pod-name>

附录

kubectl 的安装方法

最后更新于