kubectl 常用命令指南
Kubectl 命令是操作 kubernetes 集群的最直接的方式,特别是运维人员,需要对这些命令有一个详细的掌握
Kubectl 自动补全
#setupautocompleteinbash,bash-completionpackageshouldbeinstalledfirst.$source<(kubectlcompletionbash)#setupautocompleteinzsh$source<(kubectlcompletionzsh)
Kubectl 上下文和配置
#显示合并后的kubeconfig配置$kubectlconfigview#同时使用多个kubeconfig文件并查看合并后的配置$KUBECONFIG=~/.kube/config:~/.kube/kubconfig2kubectlconfigview#获取e2e用户的密码$kubectlconfigview-ojsonpath='{.users[?(@.name=="e2e")].user.password}'#显示当前的上下文$kubectlconfigcurrent-context#设置默认上下文为my-cluster-name$kubectlconfiguse-contextmy-cluster-name#向kubeconf中增加支持基本认证的新集群$kubectlconfigset-credentialskubeuser/foo.kubernetes.com--username=kubeuser--password=kubepassword#使用指定的用户名和namespace设置上下文$kubectlconfigset-contextgce--user=cluster-admin--namespace=foo\&&kubectlconfiguse-contextgce
创建对象
.yaml
、
.yml
、或者
.json
为扩展名。#创建资源$kubectlcreate-f./my-manifest.yaml#使用多个文件创建资源$kubectlcreate-f./my1.yaml-f./my2.yaml#使用目录下的所有清单文件来创建资源$kubectlcreate-f./dir#使用url来创建资源$kubectlcreate-f启动一个nginx实例$kubectlrunnginx--image=nginx#获取pod和svc的文档$kubectlexplainpods,svc#从stdin输入中创建多个YAML对象$cat<<EOF|kubectlcreate-f-apiVersion:v1kind:Podmetadata:name:busybox-sleepspec:containers:-name:busyboximage:busyboxargs:-sleep-"1000000"---apiVersion:v1kind:Podmetadata:name:busybox-sleep-lessspec:containers:-name:busyboximage:busyboxargs:-sleep-"1000"EOF#创建包含几个key的Secret$cat<<EOF|kubectlcreate-f-apiVersion:v1kind:Secretmetadata:name:mysecrettype:Opaquedata:password:$(echo"s33msi4"|base64)username:$(echo"jane"|base64)EOF
显示和查找资源
# Get commands with basic output
# 列出所有 namespace 中的所有 service
$ kubectl get services
# 列出所有 namespace 中的所有 pod
$ kubectl get pods --all-namespaces
# 列出所有 pod 并显示详细信息
$ kubectl get pods -o wide
# 列出指定 deployment
$ kubectl get deployment my-dep
# 列出该 namespace 中的所有 pod 包括未初始化的
$ kubectl get pods --include-uninitialized
# 使用详细输出来描述命令
$ kubectl describe nodes my-node
$ kubectl describe pods my-pod
# List Services Sorted by Name
$ kubectl get services --sort-by=.metadata.name
# 根据重启次数排序列出 pod
$ kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
# 获取所有具有 app=cassandra 的 pod 中的 version 标签
$ kubectl get pods --selector=app=cassandra rc -o \
jsonpath='{.items[*].metadata.labels.version}'
# 获取所有节点的 ExternalIP
$ kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
# 列出属于某个 PC 的 Pod 的名字
# “jq”命令用于转换复杂的 jsonpath,参考
$ sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}
$ echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})
# 查看哪些节点已就绪
$ JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \
&& kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"
# 列出当前 Pod 中使用的 Secret
$ kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq
更新资源
$kubectlrolling-updatefrontend-v1-ffrontend-v2.json#滚动更新podfrontend-v1$kubectlrolling-updatefrontend-v1frontend-v2--image=image:v2#更新资源名称并更新镜像$kubectlrolling-updatefrontend--image=image:v2#更新frontendpod中的镜像$kubectlrolling-updatefrontend-v1frontend-v2--rollback#退出已存在的进行中的滚动更新$catpod.json|kubectlreplace-f-#基于stdin输入的JSON替换pod#强制替换,删除后重新创建资源。会导致服务中断。$kubectlreplace--force-f./pod.json#为nginxRC创建服务,启用本地80端口连接到容器上的8000端口$kubectlexposercnginx--port=80--target-port=8000#更新单容器pod的镜像版本(tag)到v4$kubectlgetpodmypod-oyaml|sed's/\(image:myimage\):.*$/\1:v4/'|kubectlreplace-f-#添加标签$kubectllabelpodsmy-podnew-label=awesome#添加注解$kubectlannotatepodsmy-podicon-url=自动扩展deployment“foo”$kubectlautoscaledeploymentfoo--min=2--max=10
修补资源
使用策略合并补丁并修补资源。
#部分更新节点kubectlpatchnodek8s-node-1-p'{"spec":{"unschedulable":true}}'#更新容器镜像;spec.containers[*].name是必须的,因为这是合并的关键字$kubectlpatchpodvalid-pod-p'{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"newimage"}]}}'#使用具有位置数组的json补丁更新容器镜像$kubectlpatchpodvalid-pod--type='json'-p='[{"op":"replace","path":"/spec/containers/0/image","value":"newimage"}]'#使用具有位置数组的json补丁禁用deployment的livenessProbe$kubectlpatchdeploymentvalid-deployment--typejson-p='[{"op":"remove","path":"/spec/template/spec/containers/0/livenessProbe"}]'
编辑资源
在编辑器中编辑任何 API 资源。
#编辑名为docker-registry的service$kubectleditsvc/docker-registry#使用其它编辑器$KUBE_EDITOR="nano"kubectleditsvc/docker-registry
Scale 资源
#Scaleareplicasetnamed'foo'to3$kubectlscale--replicas=3rs/foo#Scalearesourcespecifiedin"foo.yaml"to3$kubectlscale--replicas=3-ffoo.yaml#Ifthedeploymentnamedmysql'scurrentsizeis2,scalemysqlto3$kubectlscale--current-replicas=2--replicas=3deployment/mysql#Scalemultiplereplicationcontrollers$kubectlscale--replicas=5rc/foorc/barrc/baz
删除资源
#删除pod.json文件中定义的类型和名称的pod$kubectldelete-f./pod.json#删除名为“baz”的pod和名为“foo”的service$kubectldeletepod,servicebazfoo#删除具有name=myLabel标签的pod和serivce$kubectldeletepods,services-lname=myLabel#删除具有name=myLabel标签的pod和service,包括尚未初始化的$kubectldeletepods,services-lname=myLabel--include-uninitialized#删除my-nsnamespace下的所有pod和serivce包$kubectl-nmy-nsdeletepo,svc--all
与运行中的 Pod 交互
#dump输出pod的日志(stdout)$kubectllogsmy-pod#dump输出pod中容器的日志(stdout,pod中有多个容器的情况下使用)$kubectllogsmy-pod-cmy-container#流式输出pod的日志(stdout)$kubectllogs-fmy-pod#流式输出pod中容器的日志(stdout,pod中有多个容器的情况下使用)$kubectllogs-fmy-pod-cmy-container#交互式shell的方式运行pod$kubectlrun-i--ttybusybox--image=busybox--sh#连接到运行中的容器$kubectlattachmy-pod-i#转发pod中的6000端口到本地的5000端口$kubectlport-forwardmy-pod5000:6000#在已存在的容器中执行命令(只有一个容器的情况下)$kubectlexecmy-pod--ls/#在已存在的容器中执行命令(pod中有多个容器的情况下)$kubectlexecmy-pod-cmy-container--ls/#显示指定pod和容器的指标度量$kubectltoppodPOD_NAME--containers
与节点和集群 的交互
#标记my-node不可调度$kubectlcordonmy-node#清空my-node以待维护$kubectldrainmy-node#标记my-node可调度$kubectluncordonmy-node#显示my-node的指标度量$kubectltopnodemy-node$kubectlcluster-info#将当前集群状态输出到stdout$kubectlcluster-infodump#将当前集群状态输出到/path/to/cluster-state$kubectlcluster-infodump--output-directory=/path/to/cluster-state#如果该键和影响的污点(taint)已存在,则使用指定的值替换$kubectltaintnodesfoodedicated=special-user:NoSchedule
set 命令
kubectl set --help
查看,它的子命令,
env
,
image
,
resources
,
selector
,
serviceaccount
,
subject
。kubectl set resources 命令
可用资源对象包括(支持大小写):replicationcontroller、deployment、daemonset、job、replicaset。
例如:
#将deployment的nginx容器cpu限制为“200m”,将内存设置为“512Mi”$kubectlsetresourcesdeploymentnginx-c=nginx--limits=cpu=200m,memory=512Mi#设置所有nginx容器中Requests和Limits$kubectlsetresourcesdeploymentnginx--limits=cpu=200m,memory=512Mi--requests=cpu=100m,memory=256Mi#删除nginx中容器的计算资源值$kubectlsetresourcesdeploymentnginx--limits=cpu=0,memory=0--requests=cpu=0,memory=0
kubectl set selector 命令
selector
(选择器)。如果在调用”set selector”命令之前已经存在选择器,则新创建的选择器将覆盖原来的选择器。
selector
必须以字母或数字开头,最多包含63个字符,可使用:字母、数字、连字符” - “ 、点”.”和下划线” _ “。如果指定了—resource-version,则更新将使用此资源版本,否则将使用现有的资源版本。语法:selector (-f FILENAME | TYPE NAME) EXPRESSIONS [—resource-version=version]
kubectl set image 命令
用于更新现有资源的容器镜像。
可用资源对象包括:
pod (po)
、
replicationcontroller (rc)
、
deployment (deploy)
、
daemonset (ds)
、
job
、
replicaset (rs)
。
语法:image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 … CONTAINER_NAME_N=CONTAINER_IMAGE_N
#将deployment中的nginx容器镜像设置为“nginx:1.9.1”$kubectlsetimagedeployment/nginxbusybox=busyboxnginx=nginx:1.9.1#所有deployment和rc的nginx容器镜像更新为“nginx:1.9.1”$kubectlsetimagedeployments,rcnginx=nginx:1.9.1--all#将daemonsetabc的所有容器镜像更新为“nginx:1.9.1”$kubectlsetimagedaemonsetabc*=nginx:1.9.1#从本地文件中更新nginx容器镜像$kubectlsetimage-fpath/to/file.yamlnginx=nginx:1.9.1--local-oyaml
资源类型
格式化输出
kubectl
命令中添加
-o
或者
-output
标志。
-v
或
--v
标志跟着一个整数来指定日志级别。