天天看点

【K8s学习第三篇】K8s集群管理工具kubectl

命令行工具kubectl

​kubelet​

​​ 会在集群中每个​​节点(node)​​​上运行。 它保证​​容器(containers)​​​都运行在 ​​Pod​​ 中。

kubelet 接收一组通过各类机制提供给它的 PodSpecs, 确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。

​​相关网站:https://kubernetes.io/zh-cn/docs/reference/kubectl/​​

Kubernetes 提供 kubectl 是使用 Kubernetes API 与 Kubernetes 集群的​​控制面​​进行通信的命令行工具。

针对配置信息,​

​kubectl​

​​ 在 ​

​$HOME/.kube​

​​ 目录中查找一个名为 ​

​config​

​​ 的配置文件。 你可以通过设置 ​

​KUBECONFIG​

​​ 环境变量或设置 ​​--kubeconfig​​​参数来指定其它 ​​kubeconfig​​ 文件。

语法

使用以下语法从终端窗口运行 ​

​kubectl​

​ 命令:

kubectl [command] [TYPE] [NAME] [flags]      

其中 ​

​command​

​​、​

​TYPE​

​​、​

​NAME​

​​ 和 ​

​flags​

​ 分别是:

  • ​command​

    ​​:指定要对一个或多个资源执行的操作,例如​

    ​create​

    ​​、​

    ​get​

    ​​、​

    ​describe​

    ​​、​

    ​delete​

    ​。
  • ​TYPE​

    ​​:指定​​资源类型​​。资源类型不区分大小写, 可以指定单数、复数或缩写形式。例如,以下命令输出相同的结果:
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1      
  • ​NAME​

    ​​:指定资源的名称。名称区分大小写。 如果省略名称,则显示所有资源的详细信息。例如:​

    ​kubectl get pods​

    ​​。

    在对多个资源执行操作时,你可以按类型和名称指定每个资源,或指定一个或多个文件:

  • 要按类型和名称指定资源:
  • 要对所有类型相同的资源进行分组,请执行以下操作:​

    ​TYPE1 name1 name2 name<#>​

    ​​。

    例子:​​

    ​kubectl get pod example-pod1 example-pod2​

  • 分别指定多个资源类型:​

    ​TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>​

    ​​。

    例子:​​

    ​kubectl get pod/example-pod1 replicationcontroller/example-rc1​

  • 用一个或多个文件指定资源:​

    ​-f file1 -f file2 -f file<#>​

  • ​​使用 YAML 而不是 JSON​​​, 因为 YAML 对用户更友好, 特别是对于配置文件。

    例子:​​

    ​kubectl get -f ./pod.yaml​

  • ​flags​

    ​​: 指定可选的参数。例如,可以使用​

    ​-s​

    ​​ 或​

    ​--server​

    ​ 参数指定 Kubernetes API 服务器的地址和端口。

注意: 从命令行指定的参数会覆盖默认值和任何相应的环境变量。

如果你需要帮助,在终端窗口中运行 ​

​kubectl help​

​。

常见的基础命令

create 通过文件名或标准输入创建资源

expose 将一个资源暴露为一个新的Service

run 在集群中运行一个指定的镜像

set 在对象上设置特定的功能

get 显示一个或多个资源

explain 展示文档参考资料

edit 使用默认的编辑器编辑一个资源

delete 通过文件名,标准输入,资源名称或标签来删除资源

apply 通过文件名或标准输入对资源应用配置

patch 补丁修改、更新资源

replace 通过文件名或标准输入替换一个资源

convert 不同的API版本之间转换配置文件

label 更新资源上的标签

annotate 更新资源上的注释

completion 用于实现kubectl工具自动补全

api-versions 打印受支持的API版本

config 修改kubeconfig文件(用于访问API,比如配置认证信息)

help 所有命令帮助

plugin 运行一个命令行插件

version 打印客户端和服务版本信息

部署命令

rollout 管理资源的发布
rolling-update 对给定的复制控制器滚动更新
scale 扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Job
autoscale 创建一个自动选择扩容或缩容并设置Pod数量

集群管理命令

certificate 修改证书资源
cluster-info 显示集群信息
top 显示资源(CPU/M)
cordon 标记节点不可调度
uncordon 标记节点可被调度
drain 驱逐节点上的应用,准备下线维护
taint 修改节点taint标记

故障调试命令

describe 显示特定资源或资源组的详细信息

logs 在一个Pod中打印一个容器日志,如果Pod只有一个容器,容器名称是可选的

attach 附加到一个运行的容器

exec 执行命令到容器

port-forward 转发一个或多个

proxy 运行一个proxy到Kubernetes API Server

cp 拷贝文件或目录到容器中

auth 检查授权

集群内身份验证和命名空间覆盖

默认情况下,​

​kubectl​

​​ 命令首先确定它是否在 Pod 中运行,从而被视为在集群中运行。 它首先检查 ​

​KUBERNETES_SERVICE_HOST​

​​ 和 ​

​KUBERNETES_SERVICE_PORT​

​​ 环境变量以及 ​

​/var/run/secrets/kubernetes.io/serviceaccount/token​

​ 中是否存在服务帐户令牌文件。 如果三个条件都被满足,则假定在集群内进行身份验证。

为保持向后兼容性,如果在集群内身份验证期间设置了 ​

​POD_NAMESPACE​

​ 环境变量,它将覆盖服务帐户令牌中的默认命名空间。 任何依赖默认命名空间的清单或工具都会受到影响。

​POD_NAMESPACE​

​ 环境变量

如果设置了 ​

​POD_NAMESPACE​

​​ 环境变量,对命名空间资源的 CLI 操作对象将使用该变量值作为默认值。 例如,如果该变量设置为 ​

​seattle​

​​,​

​kubectl get pods​

​​ 将返回 ​

​seattle​

​ 命名空间中的 Pod。 这是因为 Pod 是一个命名空间资源,且命令中没有提供命名空间。

直接使用 ​

​--namespace <value>​

​ 会覆盖此行为。

kubectl 如何处理 ServiceAccount 令牌

假设:

  • 有 Kubernetes 服务帐户令牌文件挂载在​

    ​/var/run/secrets/kubernetes.io/serviceaccount/token​

    ​ 上,并且
  • 设置了​

    ​KUBERNETES_SERVICE_HOST​

    ​ 环境变量,并且
  • 设置了​

    ​KUBERNETES_SERVICE_PORT​

    ​ 环境变量,并且
  • 你没有在 kubectl 命令行上明确指定命名空间。

然后 kubectl 假定它正在你的集群中运行。 kubectl 工具查找该 ServiceAccount 的命名空间 (该命名空间与 Pod 的命名空间相同)并针对该命名空间进行操作。 这与集群外运行的情况不同; 当 kubectl 在集群外运行并且你没有指定命名空间时, kubectl 命令会针对 ​

​default​

​ 命名空间进行操作。

格式化输出

所有 ​

​kubectl​

​​ 命令的默认输出格式都是人类可读的纯文本格式。要以特定格式在终端窗口输出详细信息, 可以将 ​

​-o​

​​ 或 ​

​--output​

​​ 参数添加到受支持的 ​

​kubectl​

​ 命令中。

语法

kubectl [command] [TYPE] [NAME] -o <output_format>      

取决于具体的 ​

​kubectl​

​ 操作,支持的输出格式如下:

输出格式 描述

​-o custom-columns=<spec>​

使用逗号分隔的​​自定义列​​列表打印表。

​-o custom-columns-file=<filename>​

使用 ​

​<filename>​

​​ 文件中的​​自定义列​​模板打印表。

​-o json​

输出 JSON 格式的 API 对象

​-o jsonpath=<template>​

打印 ​​jsonpath​​ 表达式定义的字段

​-o jsonpath-file=<filename>​

打印 ​

​<filename>​

​​ 文件中 ​​jsonpath​​ 表达式定义的字段。

​-o name​

仅打印资源名称而不打印任何其他内容。

​-o wide​

以纯文本格式输出,包含所有附加信息。对于 Pod 包含节点名。

​-o yaml​

输出 YAML 格式的 API 对象。
示例

在此示例中,以下命令将单个 Pod 的详细信息输出为 YAML 格式的对象:

kubectl get pod web-pod-13je7 -o yaml      

自定义列

要定义自定义列并仅将所需的详细信息输出到表中,可以使用 ​

​custom-columns​

​​ 选项。 你可以选择内联定义自定义列或使用模板文件:​

​-o custom-columns=<spec>​

​​ 或 ​

​-o custom-columns-file=<filename>​

​。

示例

内联:

kubectl get pods <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
submit-queue   610995      

Server-side 列

​kubectl​

​ 支持从服务器接收关于对象的特定列信息。 这意味着对于任何给定的资源,服务器将返回与该资源相关的列和行,以便客户端打印。 通过让服务器封装打印的细节,这允许在针对同一集群使用的客户端之间提供一致的人类可读输出。

此功能默认启用。要禁用它,请将该 ​

​--server-print=false​

​​ 参数添加到 ​

​kubectl get​

​ 命令中。

例子:

要打印有关 Pod 状态的信息,请使用如下命令:

kubectl get pods <pod-name> --server-print=false      

输出类似于:

NAME       AGE
pod-name   1m      

 kubectl get pods nginx-86c57db685-6rbq8 --server-print=false

【K8s学习第三篇】K8s集群管理工具kubectl

2d7h =2天7小时

排序列表对象

要将对象排序后输出到终端窗口,可以将 ​

​--sort-by​

​​ 参数添加到支持的 ​

​kubectl​

​​ 命令。 通过使用 ​

​--sort-by​

​​ 参数指定任何数字或字符串字段来对对象进行排序。 要指定字段,请使用 ​​jsonpath​​ 表达式。

语法

kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>      
示例

要打印按名称排序的 Pod 列表,请运行:

kubectl get pods --sort-by=.metadata.name      

示例:常用操作

使用以下示例集来帮助你熟悉运行常用 kubectl 操作:

​kubectl apply​

​ - 以文件或标准输入为准应用或更新资源。

# 使用 example-service.yaml 中的定义创建服务。
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>      

​kubectl get​

​ - 列出一个或多个资源。

# 以纯文本输出格式列出所有 Pod。
kubectl get pods

# 以纯文本输出格式列出所有 Pod,并包含附加信息(如节点名)。
kubectl get pods -o wide

# 以纯文本输出格式列出具有指定名称的副本控制器。提示:你可以使用别名 'rc' 缩短和替换 'replicationcontroller' 资源类型。
kubectl get replicationcontroller <rc-name>

# 以纯文本输出格式列出所有副本控制器和服务。
kubectl get rc,services

# 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。
kubectl get ds --include-uninitialized

# 列出在节点 server01 上运行的所有 Pod
kubectl get pods --field-selector=spec.nodeName=server01      

kubectl get rc,service

【K8s学习第三篇】K8s集群管理工具kubectl

kubectl get pods --field-selector=spec.nodeName=k8snode1

【K8s学习第三篇】K8s集群管理工具kubectl

​kubectl describe​

​ - 显示一个或多个资源的详细状态,默认情况下包括未初始化的资源。

# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe nodes <node-name>

# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe pods/<pod-name>

# 显示由名为 <rc-name> 的副本控制器管理的所有 Pod 的详细信息。
# 记住:副本控制器创建的任何 Pod 都以副本控制器的名称为前缀。
kubectl describe pods <rc-name>

# 描述所有的 Pod
kubectl describe pods      

kubectl describe nodes k8snode1

【K8s学习第三篇】K8s集群管理工具kubectl
【K8s学习第三篇】K8s集群管理工具kubectl

[root@k8smaster ~]# kubectl get pods nginx-86c57db685-6rbq8

【K8s学习第三篇】K8s集群管理工具kubectl

说明:

​kubectl get​

​​ 命令通常用于检索同一资源类别的一个或多个资源。 它具有丰富的参数,允许你使用 ​

​-o​

​​ 或 ​

​--output​

​​ 参数自定义输出格式。 你可以指定 ​

​-w​

​​ 或 ​

​--watch​

​​ 参数以开始监测特定对象的更新。 ​

​kubectl describe​

​​ 命令更侧重于描述指定资源的许多相关方面。它可以调用对 ​

​API 服务器​

​​ 的多个 API 调用来为用户构建视图。 例如,该 ​

​kubectl describe node​

​ 命令不仅检索有关节点的信息,还检索在其上运行的 Pod 的摘要,为节点生成的事件等。

​kubectl delete​

​ - 基于文件、标准输入或通过指定标签选择器、名称、资源选择器或资源来删除资源。

# 使用 pod.yaml 文件中指定的类型和名称删除 Pod。
kubectl delete -f pod.yaml

# 删除所有带有 '<label-key>=<label-value>' 标签的 Pod 和服务。
kubectl delete pods,services -l <label-key>=<label-value>

# 删除所有 Pod,包括未初始化的 Pod。
kubectl delete pods --all      

​kubectl exec​

​ - 对 Pod 中的容器执行命令。

# 从 Pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> -- date

# 运行输出 'date' 获取在 Pod <pod-name> 中容器 <container-name> 的输出。
kubectl exec <pod-name> -c <container-name> -- date

# 获取一个交互 TTY 并在 Pod  <pod-name> 中运行 /bin/bash。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> -- /bin/bash      

[root@k8smaster ~]# kubectl exec nginx-86c57db685-6rbq8 -- date

【K8s学习第三篇】K8s集群管理工具kubectl

[root@k8smaster ~]# kubectl exec -it nginx-86c57db685-6rbq8 -- bin/bash

【K8s学习第三篇】K8s集群管理工具kubectl

​kubectl logs​

​ - 打印 Pod 中容器的日志。

# 返回 Pod <pod-name> 的日志快照。
kubectl logs <pod-name>

# 从 Pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>      

[root@k8smaster ~]# kubectl logs -f --tail 100 nginx-86c57db685-6rbq8

【K8s学习第三篇】K8s集群管理工具kubectl

​kubectl diff​

​ - 查看集群建议更新的差异。

# “pod.json”中包含的差异资源。
kubectl diff -f pod.json

# 从标准输入读取的差异文件。
cat service.yaml | kubectl diff -f -      

示例:创建和使用插件

使用以下示例来帮助你熟悉编写和使用 ​

​kubectl​

​ 插件:

# 用任何语言创建一个简单的插件,并为生成的可执行文件命名
# 以前缀 "kubectl-" 开始
 ./kubectl-hello      
#!/bin/sh

# 这个插件打印单词 "hello world"
echo "hello world"      

这个插件写好了,把它变成可执行的:

sudo chmod a+x ./kubectl-hello

# 并将其移动到路径中的某个位置
sudo mv ./kubectl-hello /usr/local/bin
sudo chown root:root /usr/local/bin

# 你现在已经创建并"安装了"一个 kubectl 插件。
# 你可以开始使用这个插件,从 kubectl 调用它,就像它是一个常规命令一样
kubectl hello      
hello world      
# 你可以"卸载"一个插件,只需从你的 $PATH 中删除它
sudo rm /usr/local/bin/kubectl-hello      

[root@k8smaster ~]# vi ./kubectl-hello

【K8s学习第三篇】K8s集群管理工具kubectl

[root@k8smaster ~]# ll kubectl-hello  

-rw-r--r--. 1 root root 71 7月  25 17:37 kubectl-hello

[root@k8smaster ~]# chmod +x kubectl-hello 

-rwxr-xr-x. 1 root root   71 7月  25 17:37 kubectl-hello

[root@k8smaster ~]# mv ./kubectl-hello /usr/local/bin/

[root@k8smaster ~]# ll /usr/local/bin

总用量 4

-rwxr-xr-x. 1 root root 71 7月  25 17:37 kubectl-hello

[root@k8smaster ~]# kubectl hello

hello world

【K8s学习第三篇】K8s集群管理工具kubectl

为了查看可用的所有 ​

​kubectl​

​​ 插件,你可以使用 ​

​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      

[root@k8smaster ~]# kubectl plugin list

【K8s学习第三篇】K8s集群管理工具kubectl

​kubectl plugin list​

​ 指令也可以向你告警哪些插件被运行,或是被其它插件覆盖了,例如:

sudo chmod -x /usr/local/bin/kubectl-foo # 删除执行权限
kubectl plugin list      
The following kubectl-compatible plugins are available:

/usr/local/bin/kubectl-hello
/usr/local/bin/kubectl-foo
  - warning: /usr/local/bin/kubectl-foo identified as a plugin, but it is not executable
/usr/local/bin/kubectl-bar

error: one plugin warning was found      

你可以将插件视为在现有 kubectl 命令之上构建更复杂功能的一种方法:

cat ./kubectl-whoami      

接下来的几个示例假设你已经将 ​

​kubectl-whoami​

​ 设置为以下内容:

#!/bin/bash

#这个插件利用 `kubectl config` 命令基于当前所选上下文输出当前用户的信息
kubectl config view --template='{{ range .contexts }}{{ if eq .name "'$(kubectl config current-context)'" }}Current user: {{ printf "%s\n" .context.user }}{{ end }}{{ end }}'      

运行以上命令将为你提供一个输出,其中包含 KUBECONFIG 文件中当前上下文的用户:

#!/bin/bash
# 使文件成为可执行的
sudo chmod +x ./kubectl-whoami

# 然后移动到你的路径中
sudo mv ./kubectl-whoami /usr/local/bin

kubectl whoami
Current user: plugins-user      

创建一个namespace

[root@k8smaster ~]# kubectl create namespace test

namespace/test created

[root@k8smaster ~]# kubectl get ns | grep test

test                   Active   15s

在此namespace下创建并运行一个nginx的Pod

kubectl run pod --image=nginx:latest -n test

【K8s学习第三篇】K8s集群管理工具kubectl

查看新创建的pod

kubectl get pod -n test

【K8s学习第三篇】K8s集群管理工具kubectl

删除指定的namespace

kubectl delete ns test

【K8s学习第三篇】K8s集群管理工具kubectl

kubectl 备忘单

本页列举了常用的 ​

​kubectl​

​ 命令和标志。

Kubectl 自动补全

BASH

source <(kubectl completion bash) # 在 bash 中设置当前 shell 的自动补全,要先安装 bash-completion 包。
echo "source <(kubectl completion bash)" >> ~/.bashrc # 在你的 bash shell 中永久地添加自动补全      

你还可以在补全时为 ​

​kubectl​

​ 使用一个速记别名:

alias k=kubectl
complete -o default -F __start_kubectl k      

ZSH

source <(kubectl completion zsh)  # 在 zsh 中设置当前 shell 的自动补全
echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc # 在你的 zsh shell 中永久地添加自动补全      

关于 --all-namespaces 的一点说明

我们经常用到 ​

​--all-namespaces​

​ 参数,你应该要知道它的简写:

​kubectl -A​

【K8s学习第三篇】K8s集群管理工具kubectl

Kubectl 上下文和配置

设置 ​

​kubectl​

​​ 与哪个 Kubernetes 集群进行通信并修改配置信息。 查看​​使用 kubeconfig 跨集群授权访问​​ 文档获取配置文件详细信息。

kubectl config view # 显示合并的 kubeconfig 配置。

# 同时使用多个 kubeconfig 文件并查看合并的配置
KUBECONFIG=~/.kube/config:~/.kube/kubconfig2

kubectl config view

# 获取 e2e 用户的密码
kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'

kubectl config view -o jsonpath='{.users[].name}'    # 显示第一个用户
kubectl config view -o jsonpath='{.users[*].name}'   # 获取用户列表
kubectl config get-contexts                          # 显示上下文列表
kubectl config current-context                       # 展示当前所处的上下文
kubectl config use-context my-cluster-name           # 设置默认的上下文为 my-cluster-name

kubectl config set-cluster my-cluster-name           # 在 kubeconfig 中设置集群条目

# 在 kubeconfig 中配置代理服务器的 URL,以用于该客户端的请求
kubectl config set-cluster my-cluster-name --proxy-url=my-proxy-url

# 添加新的用户配置到 kubeconf 中,使用 basic auth 进行身份认证
kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword

# 在指定上下文中持久性地保存名字空间,供所有后续 kubectl 命令使用
kubectl config set-context --current --namespace=ggckad-s2

# 使用特定的用户名和名字空间设置上下文
kubectl config set-context gce --user=cluster-admin --namespace=foo \
  && kubectl config use-context gce

kubectl config unset users.foo                       # 删除用户 foo

# 设置或显示 context / namespace 的短别名
# (仅适用于 bash 和 bash 兼容的 shell,在使用 kn 设置命名空间之前要先设置 current-context)
alias kx='f() { [ "$1" ] && kubectl config use-context $1 || kubectl config current-context ; } ; f'
alias kn='f() { [ "$1" ] && kubectl config set-context --current --namespace $1 || kubectl config view --minify | grep namespace | cut -d" " -f6 ; } ; f'      

Kubectl apply

​apply​

​​ 通过定义 Kubernetes 资源的文件来管理应用。 它通过运行 ​

​kubectl apply​

​​ 在集群中创建和更新资源。 这是在生产中管理 Kubernetes 应用的推荐方法。 参见 ​​Kubectl 文档​​。

创建对象

Kubernetes 配置可以用 YAML 或 JSON 定义。可以使用的文件扩展名有 ​

​.yaml​

​​、​

​.yml​

​​ 和 ​

​.json​

​。

kubectl apply -f ./my-manifest.yaml           # 创建资源
kubectl apply -f ./my1.yaml -f ./my2.yaml     # 使用多个文件创建
kubectl apply -f ./dir                        # 基于目录下的所有清单文件创建资源
kubectl apply -f https://git.io/vPieo         # 从 URL 中创建资源
kubectl create deployment nginx --image=nginx # 启动单实例 nginx

# 创建一个打印 “Hello World” 的 Job
kubectl create job hello --image=busybox:1.28 -- echo "Hello World" 

# 创建一个打印 “Hello World” 间隔1分钟的 CronJob
kubectl create cronjob hello --image=busybox:1.28   --schedule="*/1 * * * *" -- echo "Hello World"    

kubectl explain pods                          # 获取 pod 清单的文档说明

# 从标准输入创建多个 YAML 对象
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    args:
    - sleep
    - "1000000"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep-less
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    args:
    - sleep
    - "1000"
EOF

# 创建有多个 key 的 Secret
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: $(echo -n "s33msi4" | base64 -w0)
  username: $(echo -n "jane" | base64 -w0)
EOF      

查看和查找资源

# get 命令的基本输出
kubectl get services                          # 列出当前命名空间下的所有 services
kubectl get pods --all-namespaces             # 列出所有命名空间下的全部的 Pods
kubectl get pods -o wide                      # 列出当前命名空间下的全部 Pods,并显示更详细的信息
kubectl get deployment my-dep                 # 列出某个特定的 Deployment
kubectl get pods                              # 列出当前命名空间下的全部 Pods
kubectl get pod my-pod -o yaml                # 获取一个 pod 的 YAML

# describe 命令的详细输出
kubectl describe nodes my-node
kubectl describe pods my-pod

# 列出当前名字空间下所有 Services,按名称排序
kubectl get services --sort-by=.metadata.name

# 列出 Pods,按重启次数排序
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'

# 列举所有 PV 持久卷,按容量排序
kubectl get pv --sort-by=.spec.capacity.storage

# 获取包含 app=cassandra 标签的所有 Pods 的 version 标签
kubectl get pods --selector=app=cassandra -o \
  jsonpath='{.items[*].metadata.labels.version}'

# 检索带有 “.” 键值,例: 'ca.crt'
kubectl get configmap myconfig \
  -o jsonpath='{.data.ca\.crt}'

# 检索一个 base64 编码的值,其中的键名应该包含减号而不是下划线。
kubectl get secret my-secret --template='{{index .data "key-name-with-dashes"}}'

# 获取所有工作节点(使用选择器以排除标签名称为 'node-role.kubernetes.io/control-plane' 的结果)
kubectl get node --selector='!node-role.kubernetes.io/control-plane'

# 获取当前命名空间中正在运行的 Pods
kubectl get pods --field-selector=status.phase=Running

# 获取全部节点的 ExternalIP 地址
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

# 列出属于某个特定 RC 的 Pods 的名称
# 在转换对于 jsonpath 过于复杂的场合,"jq" 命令很有用;可以在 https://stedolan.github.io/jq/ 找到它。
sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}
echo $(kubectl get pods --selector=$sel --output=jsnotallow={.items..metadata.name})

# 显示所有 Pods 的标签(或任何其他支持标签的 Kubernetes 对象)
kubectl get pods --show-labels

# 检查哪些节点处于就绪状态
JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \
 && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"

# 不使用外部工具来输出解码后的 Secret
kubectl get secret my-secret -o go-template='{{range $k,$v := .data}}{{"### "}}{{$k}}{{"\n"}}{{$v|base64decode}}{{"\n\n"}}{{end}}'

# 列出被一个 Pod 使用的全部 Secret
kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq

# 列举所有 Pods 中初始化容器的容器 ID(containerID)
# 可用于在清理已停止的容器时避免删除初始化容器
kubectl get pods --all-namespaces -o jsonpath='{range .items[*].status.initContainerStatuses[*]}{.containerID}{"\n"}{end}' | cut -d/ -f3

# 列出事件(Events),按时间戳排序
kubectl get events --sort-by=.metadata.creationTimestamp

# 比较当前的集群状态和假定某清单被应用之后的集群状态
kubectl diff -f ./my-manifest.yaml

# 生成一个句点分隔的树,其中包含为节点返回的所有键
# 在复杂的嵌套JSON结构中定位键时非常有用
kubectl get nodes -o json | jq -c 'paths|join(".")'

# 生成一个句点分隔的树,其中包含为pod等返回的所有键
kubectl get pods -o json | jq -c 'paths|join(".")'

# 假设你的 Pods 有默认的容器和默认的名字空间,并且支持 'env' 命令,可以使用以下脚本为所有 Pods 生成 ENV 变量。
# 该脚本也可用于在所有的 Pods 里运行任何受支持的命令,而不仅仅是 'env'。 
for pod in $(kubectl get po --output=jsnotallow={.items..metadata.name}); do echo $pod && kubectl exec -it $pod -- env; done

# 获取一个 Deployment 的 status 子资源
kubectl get deployment nginx-deployment --subresource=status      

更新资源

kubectl set image deployment/frontend www=image:v2               # 滚动更新 "frontend" Deployment 的 "www" 容器镜像
kubectl rollout history deployment/frontend                      # 检查 Deployment 的历史记录,包括版本
kubectl rollout undo deployment/frontend                         # 回滚到上次部署版本
kubectl rollout undo deployment/frontend --to-revision=2         # 回滚到特定部署版本
kubectl rollout status -w deployment/frontend                    # 监视 "frontend" Deployment 的滚动升级状态直到完成
kubectl rollout restart deployment/frontend                      # 轮替重启 "frontend" Deployment

cat pod.json | kubectl replace -f -                              # 通过传入到标准输入的 JSON 来替换 Pod

# 强制替换,删除后重建资源。会导致服务不可用。
kubectl replace --force -f ./pod.json

# 为多副本的 nginx 创建服务,使用 80 端口提供服务,连接到容器的 8000 端口。
kubectl expose rc nginx --port=80 --target-port=8000

# 将某单容器 Pod 的镜像版本(标签)更新到 v4
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

kubectl label pods my-pod new-label=awesome                      # 添加标签
kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq       # 添加注解
kubectl autoscale deployment foo --min=2 --max=10                # 对 "foo" Deployment 自动伸缩容      

部分更新资源

# 部分更新某节点
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

# 更新容器的镜像;spec.containers[*].name 是必须的。因为它是一个合并性质的主键。
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'

# 使用带位置数组的 JSON patch 更新容器的镜像
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'

# 使用带位置数组的 JSON patch 禁用某 Deployment 的 livenessProbe
kubectl patch deployment valid-deployment  --type json   -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'

# 在带位置数组中添加元素
kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'

# 通过修正 scale 子资源来更新 Deployment 的副本数
kubectl patch deployment nginx-deployment --subresource='scale' --type='merge' -p '{"spec":{"replicas":2}}'      

编辑资源

使用你偏爱的编辑器编辑 API 资源。

kubectl edit svc/docker-registry                      # 编辑名为 docker-registry 的服务
KUBE_EDITOR="nano" kubectl edit svc/docker-registry   # 使用其他编辑器      

对资源进行伸缩

kubectl scale --replicas=3 rs/foo                                 # 将名为 'foo' 的副本集伸缩到 3 副本
kubectl scale --replicas=3 -f foo.yaml                            # 将在 "foo.yaml" 中的特定资源伸缩到 3 个副本
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # 如果名为 mysql 的 Deployment 的副本当前是 2,那么将它伸缩到 3
kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # 伸缩多个副本控制器      

删除资源

kubectl delete -f ./pod.json                                              # 删除在 pod.json 中指定的类型和名称的 Pod
kubectl delete pod,service baz foo                                        # 删除名称为 "baz" 和 "foo" 的 Pod 和服务
kubectl delete pods,services -l name=myLabel                              # 删除包含 name=myLabel 标签的 pods 和服务
kubectl -n my-ns delete pod,svc --all                                     # 删除在 my-ns 名字空间中全部的 Pods 和服务
# 删除所有与 pattern1 或 pattern2 awk 模式匹配的 Pods
kubectl get pods  -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs  kubectl delete -n mynamespace pod      

与运行中的 Pod 进行交互

kubectl logs my-pod                                 # 获取 pod 日志(标准输出)
kubectl logs -l name=myLabel                        # 获取含 name=myLabel 标签的 Pods 的日志(标准输出)
kubectl logs my-pod --previous                      # 获取上个容器实例的 pod 日志(标准输出)
kubectl logs my-pod -c my-container                 # 获取 Pod 容器的日志(标准输出, 多容器场景)
kubectl logs -l name=myLabel -c my-container        # 获取含 name=myLabel 标签的 Pod 容器日志(标准输出, 多容器场景)
kubectl logs my-pod -c my-container --previous      # 获取 Pod 中某容器的上个实例的日志(标准输出, 多容器场景)
kubectl logs -f my-pod                              # 流式输出 Pod 的日志(标准输出)
kubectl logs -f my-pod -c my-container              # 流式输出 Pod 容器的日志(标准输出, 多容器场景)
kubectl logs -f -l name=myLabel --all-containers    # 流式输出含 name=myLabel 标签的 Pod 的所有日志(标准输出)
kubectl run -i --tty busybox --image=busybox:1.28 -- sh  # 以交互式 Shell 运行 Pod
kubectl run nginx --image=nginx -n mynamespace      # 在 “mynamespace” 命名空间中运行单个 nginx Pod
kubectl run nginx --image=nginx                     # 运行 ngins Pod 并将其规约写入到名为 pod.yaml 的文件
  --dry-run=client -o yaml > pod.yaml

kubectl attach my-pod -i                            # 挂接到一个运行的容器中
kubectl port-forward my-pod 5000:6000               # 在本地计算机上侦听端口 5000 并转发到 my-pod 上的端口 6000
kubectl exec my-pod -- ls /                         # 在已有的 Pod 中运行命令(单容器场景)
kubectl exec --stdin --tty my-pod -- /bin/sh        # 使用交互 shell 访问正在运行的 Pod (一个容器场景)
kubectl exec my-pod -c my-container -- ls /         # 在已有的 Pod 中运行命令(多容器场景)
kubectl top pod POD_NAME --containers               # 显示给定 Pod 和其中容器的监控数据
kubectl top pod POD_NAME --sort-by=cpu              # 显示给定 Pod 的指标并且按照 'cpu' 或者 'memory' 排序      

从容器中复制文件和目录

kubectl cp /tmp/foo_dir my-pod:/tmp/bar_dir            # 将 /tmp/foo_dir 本地目录复制到远程当前命名空间中 Pod 中的 /tmp/bar_dir
kubectl cp /tmp/foo my-pod:/tmp/bar -c my-container    # 将 /tmp/foo 本地文件复制到远程 Pod 中特定容器的 /tmp/bar 下
kubectl cp /tmp/foo my-namespace/my-pod:/tmp/bar       # 将 /tmp/foo 本地文件复制到远程 “my-namespace” 命名空间内指定 Pod 中的 /tmp/bar
kubectl cp my-namespace/my-pod:/tmp/foo /tmp/bar       # 将 /tmp/foo 从远程 Pod 复制到本地 /tmp/bar      

说明: ​

​kubectl cp​

​​ 要求容器镜像中存在 “tar” 二进制文件。如果 “tar” 不存在,​

​kubectl cp​

​​ 将失败。 对于进阶用例,例如符号链接、通配符扩展或保留文件权限,请考虑使用 ​

​kubectl exec​

​。

tar cf - /tmp/foo | kubectl exec -i -n my-namespace my-pod -- tar xf - -C /tmp/bar  # 将 /tmp/foo 本地文件复制到远程 “my-namespace” 命名空间中 pod 中的 /tmp/bar
kubectl exec -n my-namespace my-pod -- tar cf - /tmp/foo | tar xf - -C /tmp/bar    # 将 /tmp/foo 从远程 pod 复制到本地 /tmp/bar      

与 Deployments 和 Services 进行交互

kubectl logs deploy/my-deployment                         # 获取一个 Deployment 的 Pod 的日志(单容器例子)
kubectl logs deploy/my-deployment -c my-container         # 获取一个 Deployment 的 Pod 的日志(多容器例子)

kubectl port-forward svc/my-service 5000                  # 侦听本地端口 5000 并转发到 Service 后端端口 5000
kubectl port-forward svc/my-service 5000:my-service-port  # 侦听本地端口 5000 并转发到名字为 <my-service-port> 的 Service 目标端口

kubectl port-forward deploy/my-deployment 5000:6000       # 侦听本地端口 5000 并转发到 <my-deployment> 创建的 Pod 里的端口 6000
kubectl exec deploy/my-deployment -- ls                   # 在 Deployment 里的第一个 Pod 的第一个容器里运行命令(单容器和多容器例子)      

与节点和集群进行交互

kubectl cordon my-node                                                # 标记 my-node 节点为不可调度
kubectl drain my-node                                                 # 对 my-node 节点进行清空操作,为节点维护做准备
kubectl uncordon my-node                                              # 标记 my-node 节点为可以调度
kubectl top node my-node                                              # 显示给定节点的度量值
kubectl cluster-info                                                  # 显示主控节点和服务的地址
kubectl cluster-info dump                                             # 将当前集群状态转储到标准输出
kubectl cluster-info dump --output-directory=/path/to/cluster-state   # 将当前集群状态输出到 /path/to/cluster-state

# 查看当前节点上存在的现有污点。
kubectl get nodes -o=custom-columns=NodeName:.metadata.name,TaintKey:.spec.taints[*].key,TaintValue:.spec.taints[*].value,TaintEffect:.spec.taints[*].effect

# 如果已存在具有指定键和效果的污点,则替换其值为指定值。
kubectl taint nodes foo dedicated=special-user:NoSchedule      

资源类型

列出所支持的全部资源类型和它们的简称、​​API 组​​​, 是否是​​名字空间作用域​​​ 和 ​​Kind​​。

kubectl api-resources      

用于探索 API 资源的其他操作:

kubectl api-resources --namespaced=true      # 所有命名空间作用域的资源
kubectl api-resources --namespaced=false     # 所有非命名空间作用域的资源
kubectl api-resources -o name                # 用简单格式列举所有资源(仅显示资源名称)
kubectl api-resources -o wide                # 用扩展格式列举所有资源(又称 "wide" 格式)
kubectl api-resources --verbs=list,get       # 支持 "list" 和 "get" 请求动词的所有资源
kubectl api-resources --api-group=extensions # "extensions" API 组中的所有资源      

格式化输出

要以特定格式将详细信息输出到终端窗口,将 ​

​-o​

​​(或者 ​

​--output​

​​)参数添加到支持的 ​

​kubectl​

​ 命令中。

使用 ​

​-o=custom-columns​

​ 的示例:

# 集群中运行着的所有镜像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'

# 列举 default 名字空间中运行的所有镜像,按 Pod 分组
kubectl get pods --namespace default --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image"

# 除 "k8s.gcr.io/coredns:1.6.2" 之外的所有镜像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[?(@.image!="k8s.gcr.io/coredns:1.6.2")].image'

# 输出 metadata 下面的所有字段,无论 Pod 名字为何
kubectl get pods -A -o=custom-columns='DATA:metadata.*'      

继续阅读