kubectl 用法概述
[root@server1 ~]# kubectl [command] [TYPE] [NAME] [flags]
#command: 子命令,用于操作资源对象,例如:create,get,describe,delete等
#TYPE:资源对象类型,区分大小写,能以单数、复数或者简写形式表示
#NAME:资源对象名称,区分大小写
#flags: kubectl 子命令可选参数,例如:-s或者--server
- 在一个命令行中也可以同时对多个资源对象进行操作,以多个TYPE和NAME的组合表示,例如
#获取多个相同类型资源的信息
$kubectl get pod example-pod1 example-pd2
#获取多个不同类型对象的信息
$kubectl get pod/example-pod1 replicationcontroller/example-rc1
#同时应用多个YAML文件,以多个-f file参数表示
$kubectl get pod -f pod1.yaml -f pod2.yaml
$kubectl create -f pod1.yaml -f rc1.yaml -f servicel.yaml
kubectl 常用子命令详解
- kubectl的子命令非常丰富,涵盖了对kubenetes集群的主要操作,包括资源对象的创建、删除、查看、修改、配置、运行等
子命令 |
语法 |
说明 |
annotate |
kubectl annotate (-f filename / TYPE NAME / TYPE/NAME) KEY_1=VAL_1 [--overwrite] [--all] |
添加或更新资源对象的annotation信息 |
api-versions |
kubectl api-versions [flags] |
列出当前系统支持的API版本列表 |
apply |
kubectl apply -f FILENAME [flags] |
从配置文件或stdin中对资源对象进行配置更新 |
auth |
kubectl auth [flags] [options] |
检测RBAC权限设置 |
attach |
kubectl attach POD -c container [flags] |
附着到一个正在运行的容器上 |
autosccale |
kubectl autosccale (-f filename type name type/name) [--min=] --max=maxpods [--cpu-percent=CPU] |
对Deployment、ReplicaSet 或ReplicationController 进行水平自动扩容和缩容操作的设置 |
cluster-info |
kubectl cluster-info [flags] |
显示集群master和内置服务的信息 |
completion |
kubectl completion shell [flags] |
输出shell命令的执行结果码(bash或zsh) |
config |
kubectl config SUBCOMMAND [flags] |
修改kubeconfig文件 |
rollout |
content2 |
content3 |
rolling-update |
content2 |
content3 |
scale |
content2 |
content3 |
autoscale |
content2 |
content3 |
apply |
content2 |
content3 |
describe |
content2 |
content3 |
kubectl格式化输出
- kubectl 命令可以对结果进行多种格式化显示,输出的格式通过-o参数指定
$ kubectl [command] [TYPE] [NAME] -o=<output_format>
输出格式 |
说明 |
-o=custom-columns=<spec> |
根据自定义列名进行输出,以逗号分隔 |
-o=custom-columns-file=<filename> |
设置自定义列名的配置文件名称 |
-o=json |
输出 JSON 格式的 API 对象 |
-o=jsonpath=<template> |
打印 jsonpath 表达式中定义的字段 |
-o=jsonpath-file=<filename> |
打印由 文件中的 jsonpath 表达式定义的字段 |
-o=name |
仅打印资源名称 |
-o=wide |
以纯文本格式输出任何附加信息,对于 Pod ,包含节点名称 |
-o=yaml |
输出 YAML 格式的 API 对象 |
#显示pod的更多信息
$ kubecrl get pod <pod-name> -o wide
#以yaml格式显示Pod信息
$ kubecrl get pod <pod-name> -o yaml
#以自定义列名显示Pod信息
$ kubecrl get pod <pod-name> -o custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
#基于自定义列名配置文件进行输出
$ kubecrl get pod <pod-name> -o=custom-columns-file=template.txt
#关闭服务端列名
$ kubecrl get pod <pod-name> --server-print=false
#将输出结果按照某字段排序
$ kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>
#例如:
$ kubecrl get pod <pod-name> --sort-by=.metadata.name
kubectl 常用操作示例
1.1 kubectl apply
- 对现有对象进行增量更改,根据yaml文件里面列出来的内容,升级现有的资源对象,yaml文件的内容可以只写需要升级的属性
#语法
$ kubectl apply -f FILENAME
#创建资源对象
$ kubectl apply -f service.yaml
$ kubectl apply -f controller.yaml
#使用目录下所有的yaml、json、yml文件
$ kubectl apply -f <dir>
1.2 kubectl get
#要对所有类型相同的资源进行分组,请执行以下操作:TYPE1 name1 name2 name
$ kubectl get pod example-pod1 example-pod2
#分别指定多个资源类型:TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE/name
#获取所有资源信息
$ kubectl get all
#显示所有命名空间
$ kubectl get namespace
#显示指定命名空间的pods
$ kubectl get pods --namespace=default
$ kubectl get pods -n default
#同时获取所有的rc和service
$ kubectl get rc,services
#查看节点 labels
$ kubectl get node --show-labels
#列出节点server01上运行的多有Pod
$ kubectl get pods --field-selector=spec.nodeName=server01
1.3 kubectl describe
#显示所有Node的详细信息
$ kubectl describe nodes
#显示所有Pod的详细信息
$ kubectl describe pod webapp-77d76fbbfb-mj6nq -n test-nginx
#显示一个node的详细信息
$ kubectl describe nodes k8s-minion
#显示所有包含label name=myLabel的pod
$ kubectl describe po -l name=myLabel
#显示pod.json中的资源类型和名称指定的pod
$ kubectl describe -f pod.json
1.4 kubectl delete
- 按文件名、stdin、资源和名称或按资源和标签选择器删除资源
#通过yaml文件删除
$ kubectl delete -f rc-nginx.yaml
#使用 pod.json中指定的资源类型和名称删除pod
$ kubectl delete -f ./pod.json
#删除 Label name = myLabel的pod和Service
$ kubectl delete pods,services -l name=myLabel
#强制删除dead node上的pod
$ kubectl delete pod foo --grace-period=0 --force
1.5 kubectl exec
exec
命令docker
的exec
命令差不多,为在一个已经运行的容器中执行一条shell命令,如果一个pod容器中,有多个容器,需要使用-c
选项指定容器
- 常用格式
$ kubectl exec -it podName -c containerName -n namespace -- shell comand
#shell命令前,要加-- 号,否则shell命令中的参数,不能识别
#通过kubectl exec在容器中创建目录
$ kubectl exec -it nginx-master-asjl -c nginx-master -n nginx -- mkdir -p /usr/local/nginx
#在 pod 外执行容器中echo 命令
$ kubectl exec -n my-namespace my-pod -- echo hello
#在 pod 外查看容器中的进程信息
$ kubectl exec my-pod --bash -c 'ps -ef| grep hello'
#获取命名空间下的POD,进行批量执行
kubectl get pods -o name -n your-namespace |grep -v "demo\|hello" | xargs -I{} kubectl -n your-namespace exec {} -- bash -c 'ps ux|grep ng'
#进入交互式终端界面
$ kubectl exec my-pod -- /bin/bash
1.6 kubectl logs
- 输出pod中一个容器的日志。如果pod只包含一个容器则可以省略容器名。容器内程序输出到标准输出的内容。与docker的logs命令类似。如要获得
tail -f
的方式,也可以使用-f
选项。
#返回仅包含一个容器的pod nginx的日志快照
$ kubectl logs nginx
#持续输出pod java中的容器web-m的日志
$ kubectl logs -f -c java web-m
#查看指定pod的日志
$ kubectl logs <pod_name>
$ kubectl logs -f <pod_name> #类似tail -f的方式查看(tail -f 实时查看日志文件 tail -f 日志文件log)
#查看指定pod中指定容器的日志
$ kubectl logs <pod_name> -c <container_name>
#一次性查看
$ kubectl logs pod_name -c container_name -n namespace
#tail -f方式实时查看
$ kubectl logs -f <pod_name> -n namespace
1.7 在线编辑运行中的资源对象
- 使用默认编辑器 编辑服务器上定义的资源。使用命令行工具获取的任何资源都可以使用edit命令编辑。edit命令会打开使用
KUBE_EDITOR
,GIT_EDITOR
或者EDITOR
环境变量定义的编辑器,可以同时编辑多个资源,但所编辑过的资源只会一次性提交。edit除命令参数外还接受文件名形式
- 文件默认输出格式为YAML。要以JSON格式编辑,请指定“
-o json
”选项
#编辑deployment
$ kubectl edit deployment nginx
#以YAML格式输出编辑deployment“mydeployment”,并将修改的配置保存在annotation中
$ kubectl edit deployment/mydeployment -o yaml --save-config
1.8 将Pod端口映射到宿主机
#将Pod 80端口映射到宿主机8888端口
$ kubectl port-forward --address 0.0.0.0 pod/nginx-xxxx-xxxx 8888:80
1.9 在容器和node质检复制文件
$ kubectl cp nginx-xxxx-xxxx:/etc/passwd /tmp/123
1.10 设置资源对象标签
#将名为“default”的命名空间设置 “testing=true” 标签
$ kubectl label namespace default testing=true
1.11 创建和使用命令行插件
- 用户自定义插件的可执行文件名需要以 “kubectl-” 开头,复制到$PATH 中的某个目录下,然后就可以通过kubectl<plugin-name> 运行自定义插件了
- 示例
#通过shell实现输出hello,创建名为 kubectl-hello的shell脚本
#!/bin/bash
echo "hello"
# 未脚本添加权限
$ chmod a+x ./kubectl-hello
#复制到/bin/执行
$kubectl-hello
hello