kubectl 命令

目录

一、概述

kubectl是最常用的客户端工具之一,它提供了基于命令行访问kubernetes api的简洁方式,能够满足对kubernetes的绝大部分的操作需求。

例如,需要创建资源对象时,kubectl会将json格式的清单内容以post方法提交至api server。

二、语法

kubectl [command] [TYPE] [NAME] [flags]
  1. command:对资源执行相应操作的子命令,如getcreatedeleterundescribe
  2. TYPE:要操作的资源对象的类型,如pods、services等,类型名称区分大小写,但支持使用简写格式
  3. NAME:对象名称,区分字符大小写;省略时,则表示指定TYPE的所有资源对象
  4. flags:命令行选项,-o 用于指定输出格式,-s 指定Kubernetes API 服务器的地址和端口。

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

三、操作

下表包含所有 kubectl 操作的简短描述和普通语法

操作 语法 描述
alpha kubectl alpha SUBCOMMAND [flags] 列出与 alpha 特性对应的可用命令,这些特性在 Kubernetes 集群中默认情况下是不启用的。
annotate kubectl annotate (-f FILENAME TYPE NAME TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] 添加或更新一个或多个资源的注解。
api-resources kubectl api-resources [flags] 列出可用的 API 资源。
api-versions kubectl api-versions [flags] 列出可用的 API 版本。
apply kubectl apply -f FILENAME [flags] 从文件或 stdin 对资源应用配置更改。
attach kubectl attach POD -c CONTAINER [-i] [-t] [flags] 附加到正在运行的容器,查看输出流或与容器(stdin)交互。
auth kubectl auth [flags] [options] 检查授权。
autoscale kubectl autoscale (-f FILENAME TYPE NAME TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags] 自动伸缩由副本控制器管理的一组 pod。
certificate kubectl certificate SUBCOMMAND [options] 修改证书资源。
cluster-info kubectl cluster-info [flags] 显示有关集群中主服务器和服务的端口信息。
completion kubectl completion SHELL [options] 为指定的 shell (bash 或 zsh)输出 shell 补齐代码。
config kubectl config SUBCOMMAND [flags] 修改 kubeconfig 文件。有关详细信息,请参阅各个子命令。
convert kubectl convert -f FILENAME [options] 在不同的 API 版本之间转换配置文件。配置文件可以是 YAML 或 JSON 格式。
cordon kubectl cordon NODE [options] 将节点标记为不可调度。
cp kubectl cp <file-spec-src> <file-spec-dest> [options] 在容器之间复制文件和目录。
create kubectl create -f FILENAME [flags] 从文件或 stdin 创建一个或多个资源。
delete kubectl delete (-f FILENAME TYPE [NAME /NAME -l label --all]) [flags] 从文件、标准输入或指定标签选择器、名称、资源选择器或资源中删除资源。
describe kubectl describe (-f FILENAME TYPE [NAME_PREFIX /NAME -l label]) [flags] 显示一个或多个资源的详细状态。
diff kubectl diff -f FILENAME [flags] 将 live 配置和文件或标准输入做对比 (BETA)
drain kubectl drain NODE [options] 腾空节点以准备维护。
edit kubectl edit (-f FILENAME TYPE NAME TYPE/NAME) [flags] 使用默认编辑器编辑和更新服务器上一个或多个资源的定义。
exec kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]] 对 pod 中的容器执行命令。
explain kubectl explain [--recursive=false] [flags] 获取多种资源的文档。例如 pod, node, service 等。
expose kubectl expose (-f FILENAME TYPE NAME TYPE/NAME) [--port=port] [--protocol=TCP UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] [flags] 将副本控制器、服务或 pod 作为新的 Kubernetes 服务暴露。
get kubectl get (-f FILENAME TYPE [NAME /NAME -l label]) [--watch] [--sort-by=FIELD] [[-o --output]=OUTPUT_FORMAT] [flags] 列出一个或多个资源。
kustomize kubectl kustomize <dir> [flags] [options] 列出从 kustomization.yaml 文件中的指令生成的一组 API 资源。参数必须是包含文件的目录的路径,或者是 git 存储库 URL,其路径后缀相对于存储库根目录指定了相同的路径。
label kubectl label (-f FILENAME TYPE NAME TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] 添加或更新一个或多个资源的标签。
logs kubectl logs POD [-c CONTAINER] [--follow] [flags] 在 pod 中打印容器的日志。
options kubectl options 全局命令行选项列表,适用于所有命令。
patch kubectl patch (-f FILENAME TYPE NAME TYPE/NAME) --patch PATCH [flags] 使用策略合并 patch 程序更新资源的一个或多个字段。
plugin kubectl plugin [flags] [options] 提供用于与插件交互的实用程序。
port-forward kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N] [flags] 将一个或多个本地端口转发到一个 pod。
proxy kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags] 运行 Kubernetes API 服务器的代理。
replace kubectl replace -f FILENAME 从文件或标准输入中替换资源。
rollout kubectl rollout SUBCOMMAND [options] 管理资源的部署。有效的资源类型包括:Deployments, DaemonSets 和 StatefulSets。
run kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server client none] [--overrides=inline-json] [flags] 在集群上运行指定的镜像。
scale kubectl scale (-f FILENAME TYPE NAME TYPE/NAME) --replicas=COUNT [--resource-version=version] [--current-replicas=count] [flags] 更新指定副本控制器的大小。
set kubectl set SUBCOMMAND [options] 配置应用程序资源。
taint kubectl taint NODE NAME KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N [options] 更新一个或多个节点上的污点。
top kubectl top [flags] [options] 显示资源(CPU/内存/存储)的使用情况。
uncordon kubectl uncordon NODE [options] 将节点标记为可调度。
version kubectl version [--client] [flags] 显示运行在客户端和服务器上的 Kubernetes 版本。
wait kubectl wait ([-f FILENAME] resource.group/resource.name resource.group [(-l label --all)]) [--for=delete --for condition=available] [options] 实验性:等待一种或多种资源的特定条件。

了解更多有关命令操作的信息,请参阅kubectl参考文档。

四、资源类型

下表列出所有受支持的资源类型及其缩写别名。

(以下输出可以通过 kubectl api-resources 获取,内容以 Kubernetes 1.25.0 版本为准。)

资源名 缩写名 API 版本 按命名空间 资源类型
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration
validatingwebhookconfigurations admissionregistration.k8s.io/v1 false ValidatingWebhookConfiguration
customresourcedefinitions crd,crds apiextensions.k8s.io/v1 false CustomResourceDefinition
apiservices apiregistration.k8s.io/v1 false APIService
controllerrevisions apps/v1 true ControllerRevision
daemonsets ds apps/v1 true DaemonSet
deployments deploy apps/v1 true Deployment
replicasets rs apps/v1 true ReplicaSet
statefulsets sts apps/v1 true StatefulSet
tokenreviews authentication.k8s.io/v1 false TokenReview
localsubjectaccessreviews authorization.k8s.io/v1 true LocalSubjectAccessReview
selfsubjectaccessreviews authorization.k8s.io/v1 false SelfSubjectAccessReview
selfsubjectrulesreviews authorization.k8s.io/v1 false SelfSubjectRulesReview
subjectaccessreviews authorization.k8s.io/v1 false SubjectAccessReview
horizontalpodautoscalers hpa autoscaling/v2 true HorizontalPodAutoscaler
cronjobs cj batch/v1 true CronJob
jobs batch/v1 true Job
certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest
leases coordination.k8s.io/v1 true Lease
endpointslices discovery.k8s.io/v1 true EndpointSlice
events ev events.k8s.io/v1 true Event
flowschemas flowcontrol.apiserver.k8s.io/v1beta2 false FlowSchema
prioritylevelconfigurations flowcontrol.apiserver.k8s.io/v1beta2 false PriorityLevelConfiguration
ingressclasses networking.k8s.io/v1 false IngressClass
ingresses ing networking.k8s.io/v1 true Ingress
networkpolicies netpol networking.k8s.io/v1 true NetworkPolicy
runtimeclasses node.k8s.io/v1 false RuntimeClass
poddisruptionbudgets pdb policy/v1 true PodDisruptionBudget
podsecuritypolicies psp policy/v1beta1 false PodSecurityPolicy
clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding
clusterroles rbac.authorization.k8s.io/v1 false ClusterRole
rolebindings rbac.authorization.k8s.io/v1 true RoleBinding
roles rbac.authorization.k8s.io/v1 true Role
priorityclasses pc scheduling.k8s.io/v1 false PriorityClass
csidrivers storage.k8s.io/v1 false CSIDriver
csinodes storage.k8s.io/v1 false CSINode
csistoragecapacities storage.k8s.io/v1 true CSIStorageCapacity
storageclasses sc storage.k8s.io/v1 false StorageClass
volumeattachments storage.k8s.io/v1 false VolumeAttachment

五、输出选项

1、格式化输出

所有 kubectl 命令的默认输出格式都是人类可读的纯文本格式。要以特定格式在终端窗口输出详细信息, 可以将 -o--output 参数添加到受支持的 kubectl 命令中。

1.1、语法

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

1.2、支持的输出格式

输出格式 描述
-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 对象。

六、kubectl 自动补全

1、检查/安装bash-completion包(BASH中)

kubectl 的 Bash 补全脚本可以用命令 kubectl completion bash 生成。 在 Shell 中导入(Sourcing)补全脚本,将启用 kubectl 自动补全功能。

然而,补全脚本依赖于工具 bash-completion, 所以要先安装它

1.1、检查是否安装

type _init_completion

1.2、安装bash-completion

yum install -y bash-completion
apt-get install bash-completion

上述命令将创建文件 /usr/share/bash-completion/bash_completion,它是 bash-completion 的主脚本。

2、在当前的bash会话中启用kubectl自动补全功能

source <(kubectl completion bash)

3、在bash shell中永久的添加自动补全

echo "source <(kubectl completion bash)" >> ~/.bashrc

4、设置别名

alias k=kubectl
complete -o default -F __start_kubectl k
  • 创建了一个别名 k,使其等同于 kubectl
  • -o default: 参数告诉 Bash 在补全选项时,除了特定的补全函数外,还应该包括默认的文件名补全
  • -F __start_kubectl: 指定补全函数 __start_kubectl,负责处理 kubectl 命令及其子命令、选项和资源的补全逻辑
  • k: 指定上述补全规则应用到的命令别名

image-20240620080025367

七、基本使用

官网kubectl快速使用参考

1、kubectl 创建对象

1.1、使用一个资源清单创建资源

[root@k8s-master ~]# cat httpdpod.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: httpd

---

apiVersion: v1
kind: Pod
metadata:
  name: httpdpod
  namespace: httpd
spec:
  containers:
  - name: httpd-containers
    image: nginx:latest
    
[root@k8s-master ~]# kubectl apply -f httpdpod.yaml
namespace/httpd created
pod/httpdpod created

image-20240620090315304

1.2、使用多个资源清单创建资源

[root@k8s-master ~]# cat dev2.yaml
---
apiVersion: v1
kind: Namespace
metadata:
  name: dev2
[root@k8s-master ~]# cat dev3.yaml
---
apiVersion: v1
kind: Namespace
metadata:
  name: dev3
[root@k8s-master ~]# kubectl apply -f ./dev2.yaml -f ./dev3.yaml
namespace/dev2 created
namespace/dev3 created

image-20240620090726748

1.3、使用目录下所有的资源清单创建资源

[root@k8s-master ~]# cat /tmp/svc-nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-nginx
  namespace: dev1
spec:
  clusterIP: 172.16.100.100 #固定svc的内网ip
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: ClusterIP
[root@k8s-master ~]# cat /tmp/svc-nginx2.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-nginx1
  namespace: dev1
spec:
  clusterIP: 172.16.200.200 #固定svc的内网ip
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: nginx
  type: NodePort
[root@k8s-master ~]# kubectl apply -f /tmp/
service/svc-nginx created
service/svc-nginx1 created

image-20240620091424048

1.4、使用url创建资源

https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.4/hack/testdata/recursive/pod/busybox.yaml

apiVersion: v1
kind: Pod
metadata:
  name: busybox0
  labels:
    app: busybox0
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always

[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.4/hack/testdata/recursive/pod/busybox.yaml
pod/busybox0 created

1.5、从标准输入创建多个YAML对象

kubectl apply -f - <<EOF
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

image-20240620101047268

1.6、启动一个nginx实例

[root@k8s-master ~]# kubectl run nginx --image=nginx
pod/nginx created

1.7、获取pod和svc的文档

kubectl explain pods 	

2、查看和查找资源

2.1、列出namespace中所有的pod

kubectl get pods -A
kubectl get pods --all-namespaces

2.2、列出pod并显示详细信息

kubectl get pods -o wide

image-20240620102557852

2.3、列出指定的deployment

[root@k8s-master ~]# kubectl create deploy nginx-deploy --image=nginx --port=8082 --replicas=5 -n dev1
deployment.apps/nginx-deploy created

[root@k8s-master ~]# kubectl get deploy nginx-deploy -n dev1
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   5/5     5            5           4m5s

image-20240620104423341

2.4、查看node节点信息

kubectl describe nodes

2.5、查看pod详细信息

kubectl describe pods

2.6、列出所有的Service并按照名称排列

kubectl get svc --sort-by=.metadata.name -A
kubectl get svc --sort-by=.metadata.name --all-namespaces

image-20240620110618192

2.7、根据重启次数排序列出pod

kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' --all-namespaces

image-20240620143600504

2.8、获取所有节点的ExternalIP

kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternlIP")].address}'

2.9、 列举所有 PV 持久卷,按容量排序

kubectl get pv --sort-by=.spec.capacity.storage

3、编辑资源

3.1、edit编辑

#编辑dev1命名空间下名称为svc-nginx1的Service
kubectl edit svc/svc-nginx1 -n dev1

image-20240620120115385

3.2、使用其他编辑器

#使用vim编辑API资源
KUBE_EDITOR="vim" kubectl edit svc/svc-nginx1 -n dev1

image-20240620120332561

4、对资源进行扩缩

4.1、对资源进行扩缩

#将名为nginx-deploy的deployment副本数缩为3个
kubectl scale --replicas=3 deploy/nginx-deploy -n dev1

image-20240620140758276

4.2、同时扩展多个资源

kubectl scale --replicas=5 rc/foo rc/bar rc/baz

4.3、根据判断条件扩展

#如果名为 mysql 的 Deployment 的副本当前是 2,那么将它扩缩到 3
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql

5、删除资源

5.1、删除指定的资源

#删除deploy-nginx控制器
[root@k8s-master ~]# kubectl delete deploy nginx-deploy -n dev1
deployment.apps "nginx-deploy" deleted

5.2、删除在资源清单指定的资源

[root@k8s-master ~]# kubectl delete -f dev3.yaml
namespace "dev3" deleted

image-20240620143033181

6、kubectl与运行中的pod交互

6.1、获取pod日志

#持续查看Pod kube-flannel-ds-mn2bs的日志
kubectl logs -f kube-flannel-ds-mn2bs -n kube-system

image-20240620145815113

6.2、获取含 name=myLabel 标签的 Pod 的日志(标准输出)

kubectl logs -l name=myLabel  

6.3、交互式的进入容器

kubectl exec -it pod1 -n dev1 -- /bin/bash

image-20240704105714736

6.4、显示默认命名空间中所有 Pod 的度量值

kubectl top pod

7、从容器中复制文件和目录

7.1、将本地/tmp/test文件复制到dev1命名空间中pod1的/tmp/下

image-20240704203716919

7.2、将/tmp/test从远程pod1复制到本地的/etc/bar

kubectl cp dev1/pod1:/tmp/test etc/bar

image-20240704205421736

kubectl cp 要求容器镜像中存在 “tar” 二进制文件。如果 “tar” 不存在,kubectl cp 将失败。

对于进阶用例,例如符号链接、通配符扩展或保留文件权限,需要考虑使用 kubectl exec

8、与Deployments进行交互

8.1、获取一个Deployment的Pod的日志

#获取dev2命名空间下nginx-deploy的Deployment的Pod日志
kubectl logs deploy/nginx-deploy -n dev2

8.2、获取一个 Deployment 的 Pod 的日志(多容器例子)

kubectl logs <pod-name> -c <container-name> -n namespace
kubectl logs nginx-deploy-66b77cb96d-49lcw -c nginx -n dev2

image-20240707101928723

9、与节点和集群进行交互

9.1、显示主控节点和服务的地址

kubectl cluster-info

image-20240707102500408

9.2、将当前集群状态转储到标准输出

kubectl clutser-info dump

9.3、将当前集群状态输出到指定位置

kubectl cluster-info dump --output-directory=/tmp/cluster-state

image-20240707103027186

9.4、显示所有节点的度量值

kubectl top node

9.5、查看当前节点上存在的现有污点

kubectl get nodes -o='custom-columns=NodeName:.metadata.name,TaintKey:.spec.taints[*].key,TaintValue:.spec.taints[*].value,TaintEffect:.spec.taints[*].effect'

image-20240707103443871

10、搜索API资源

10.1、列出所支持的全部资源类型

kubectl api-resources

image-20240707111417743

NAME、SHORTNAMES、APIVERSION、NAMESPACED、KIND

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

10.2、所有命名空间作用域的资源

kubectl api-resources --namespaced=true

image-20240707111846980

10.3、所有非命名空间作用域的资源

kubectl api-resources --namespaced=false

image-20240707112020067

10.4、用简单格式列举所有资源(仅显示资源名称)

kubectl api-resources -o name

image-20240707112354692

10.5、用扩展格式列举所有资源

kubectl api-resources -o wide

image-20240707112453906

10.6、支持 "list" 和 "get" 请求动词的所有资源

kubectl api-resources --verbs=list,get

image-20240707112652266

11、格式化输出

要以特定格式将详细信息输出到终端窗口,将 -o(或者 --output)参数添加到支持的 kubectl 命令中。

输出格式 描述
-o=custom-columns=<spec> 使用逗号分隔的自定义列来打印表格
-o=custom-columns-file=<filename> 使用 <filename> 文件中的自定义列模板打印表格
-o=go-template=<template> 打印在 golang 模板中定义的字段
-o=go-template-file=<filename> 打印在 <filename> 文件中由 golang 模板定义的字段
-o=json 输出 JSON 格式的 API 对象
-o=jsonpath=<template> 打印 jsonpath 表达式中定义的字段
-o=jsonpath-file=<filename> 打印在 <filename> 文件中定义的 jsonpath 表达式所指定的字段
-o=name 仅打印资源名称而不打印其他内容
-o=wide 以纯文本格式输出额外信息,对于 Pod 来说,输出中包含了节点名称
-o=yaml 输出 YAML 格式的 API 对象

以使用 -o=custom-columns 为例

11.1、查看集群中运行着的所有镜像

kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'

image-20240707113429112

11.2、列举 default 名字空间中运行的所有镜像,按 Pod 分组

kubectl get pods --namespace default --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image"

image-20240707114349805

11.3、输出 metadata 下面的所有字段

kubectl get pods -A -o=custom-columns='DATA:metadata.*'
posted @ 2024-07-07 12:09  misakivv  阅读(13)  评论(0编辑  收藏  举报