27.6 使用kubectl
kubectl是Kubernetes自带的客户端,封装了对Kubernetes API的调用,可以用它直接通过高级命令跟Kubernetes集群进行便捷的交互。掌握了kubectl命令,就掌握了对Kubernetes集群进行使用和管理的绝大部分操作。
27.6.1 获取kubectl
kubectl在发行版的二进制包中带有,位于kubernetes/server/kubernetes/server/bin/目录下。用户也可以自行下载编译好的文件使用。
例如下载1.2.0版本的kubectl,可以用下面的命令。其他版本注意修改URL中的版本信息:
- $ wget http://storage.googleapis.com/kubernetes-release/release/v1.2.0/bin/
- linux/amd64/kubectl
27.6.2 命令格式
可以通过kubectl help[subcommand]命令查看命令格式和支持的子命令信息。
使用的主要格式为:
- kubectl [global-flags] [subcommand] [RESOURCE_TYPE] [NAME...] [subcommand-flags...]
其中,subcommand为要执行的动作,如get、describe、create、delete等,NAME为某个资源类型下面的若干对象名称。
RESOURCE_TYPE为要操作的资源的类型,见表27-6。
表27-6 kubectl命令资源类型说明

通过kubectl可以对这些资源进行生命周期管理,包括创建、删除、修改、查看等操作。
27.6.3 全局参数
这些参数主要是配置命令执行的环境信息,可以在执行具体子命令时候使用,参见表27-7。
表27-7 kubectl全局参数


27.6.4 子命令
子命令参见表27-8。
表27-8 kubect1子命令及其说明


下面详细介绍部分子命令。
1.get
显示给定资源的信息。
命令格式为kubectl get(-o|—output=)json|yaml|template|wide|…[flags]。
支持的参数主要包括:
·—all-namespaces=false:是否列出所有的命名空间中的资源;
·-L,—label-columns=[]:通过标签来过滤显示的资源;
·-o,—output="":输出信息的格式,包括json|yaml|template|templatefile|wide;
·-l,—selector="":通过selector来过滤输出;
·-t,—template="":模板字符串或golang模板文件路径;
·-w,—watch=false:持续监测输出对象的变化。
例如,获取集群中节点的列表:
- $ kubectl get nodes
- NAME LABELS STATUS
- 127.0.0.1 kubernetes.io/hostname=127.0.0.1 Ready
获取集群中Pod的列表:
- $ kubectl get pods
- NAME READY STATUS RESTARTS AGE
- k8s-master-127.0.0.1 3/3 Running 0 2d
2.describe
显示给定资源(组)的详细信息。
命令格式为kubectl describe(RESOURCE NAME_PREFIX|RESOURCE/NAME)[flags]。
支持的参数主要有:-l,—selector="",通过selector来过滤输出。例如,仅显示带有name=myLabel标签的Pod:
- $ kubectl describe po -l name=myLabel
3.create
创建一个资源。
命令格式为kubectl create-f FILENAME[flags]。
支持的参数主要有-f,—filename=[],创建资源的模板文件所在的路径或URL。例如,创建一个test_pod.yml文件,内容为:
- apiVersion: v1
- kind: Pod
- metadata:
- name: nginx
- labels:
- name: nginx
- spec:
- containers:
- - name: nginx
- image: nginx
- ports:
- - containerPort: 80
然后执行如下命令创建Pod资源。
- $ kubectl create -f test_pod.yml
- pods/nginx
提示
这里直接操作Pod仅为了演示命令,一般情况下推荐通过复制控制器来操作Pod。
查看多出来一个新的Pod:
- $ kubectl get pods
- NAME READY STATUS RESTARTS AGE
- k8s-master-127.0.0.1 3/3 Running 0 2d
- nginx 1/1 Running 0 7s
通过describe命令来查看具体信息,检查结果跟模板中定义一致:
- $ kubectl describe po -l name=nginx
- Name: nginx
- Namespace: default
- Image(s): nginx
- Node: 127.0.0.1/127.0.0.1
- Labels: name=nginx
- Status: Running
- Reason:
- Message:
- IP: 172.17.0.1
- Replication Controllers: <none>
- Containers:
- nginx:
- Image: nginx
- State: Running
- Started: Mon, 07 Mar 2016 11:04:52 +0800
- Ready: True
- Restart Count: 0
- Conditions:
- Type Status
- Ready True
- Events:
- FirstSeen LastSeen Count From SubobjectPath Reason Message
- Mon, 07 Mar 2016 11:04:51 +0800 Mon, 07 Mar 2016 11:04:51 +0800 1 {scheduler } Scheduled Successfully assigned nginx to 127.0.0.1
- Mon, 07 Mar 2016 11:04:51 +0800 Mon, 07 Mar 2016 11:04:51 +0800 1 {kubelet 127.0.0.1} implicitly required container POD Pulled Container image "gcr.io/google_containers/pause:0.8.0" already present on machine
- Mon, 07 Mar 2016 11:04:51 +0800 Mon, 07 Mar 2016 11:04:51 +0800 1 {kubelet 127.0.0.1} implicitly required container POD Created Created with docker id 38680508227d
- Mon, 07 Mar 2016 11:04:52 +0800 Mon, 07 Mar 2016 11:04:52 +0800 1 {kubelet 127.0.0.1} implicitly required container POD Started Started with docker id 38680508227d
- Mon, 07 Mar 2016 11:04:52 +0800 Mon, 07 Mar 2016 11:04:52 +0800 1 {kubelet 127.0.0.1} spec.containers{nginx} Pulled Container image "nginx" already present on machine
- Mon, 07 Mar 2016 11:04:52 +0800 Mon, 07 Mar 2016 11:04:52 +0800 1 {kubelet 127.0.0.1} spec.containers{nginx} Created Created with docker id 6fcb35ff2000
- Mon, 07 Mar 2016 11:04:52 +0800 Mon, 07 Mar 2016 11:04:52 +0800 1 {kubelet 127.0.0.1} spec.containers{nginx} Started Started with docker id 6fcb35ff2000
4.replace|update
替代/更新一个资源。
命令格式为kubectl replace-f FILENAME[flags]。
支持的参数主要有:
·-f,—filename=[]:用来替代资源的模板文件所在的路径或URL;
·—grace-period=-1:资源平缓终止的等待时间;
·—force=false:删除并重建指定资源。
例如,用户可以修改test_pod.yml中容器镜像后,用新的Pod替代原来Pod:
- $ kubectl replace -f test_pod.yml
5.patch
更新一个资源的域信息,即给资源打补丁。
命令格式为kubectl patch RESOURCE NAME-p PATCH[flags]。
支持的参数主要有-p,—patch="",补丁内容。例如,用户可以修改一个节点的spec值:
- $ kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
6.delete
删除一个资源。
命令格式为kubectl delete([-f FILENAME]|(RESOURCE[(NAME|-l label|—all)][flags]。
支持的参数主要有:
·—all=false:选取所有指定资源;
·-f,—filename=[]:资源模板文件所在的路径或URL;
·—grace-period=-1:资源平缓终止的等待时间;
·—ignore-not-found=false:忽略没找到资源情况下的报警信息;
·-l,—selector="":通过selector来过滤资源;
·—timeout=0:等待超时,0表示从删除对象的大小来计算超时。
例如,删除刚创建的Pod:
- $ kubectl delete -f test-pod.yml
7.edit
调用本地编辑器,直接编辑API资源,十分便利的功能。
命令格式为kubectl edit(RESOURCE/NAME|-f FILENAME)[flags]。
支持的参数主要有:
·-f,—filename=[]:资源模板文件所在路径、目录或者URL;
·-o,—output="yaml":输出资源格式,包括yaml|json;
·—output-version="":输出指定版本的API资源;
·—record[=false]:记录kubectl命令到资源的注解中;
·—save-config[=false]:保存配置信息到资源注解中;
·—windows-line-endings[=false]:使用Windows格式的换行符。
8.apply
应用配置到给定资源,资源如果不存在会自动创建。可以用来修改资源的信息。
命令格式为kubectl apply-f FILENAME[flags]。
支持的参数主要有:
·-f,—filename=[]:资源模板文件所在路径、目录或者URL;
·-o,—output="":输出模式,用来过滤输出信息等;
·—record[=false]:记录kubectl命令到资源的注解中;
·—schema-cache-dir="~/.kube/schema":API的scheme文件路径;
·—validate[=true]:执行命令前是否使用scheme对输入进行校验。
9.logs|log
打印一个Pod中某个容器的logs信息(docker logs命令的输出信息)。
命令格式为kubectl logs[-f][-p]POD[-c CONTAINER][flags]。
支持的参数主要有:
·-c,—container="":容器名称,如果Pod中仅有一个容器则可以忽略;
·-f,—follow=false:是否持续跟踪输出信息,类似tail命令的-f选项;
·—interactive=true:是否支持交互;
·-p,—previous=false:输出此前(已停止)容器实例的信息。
例如,输出myPod中容器test_container的logs信息:
- $ kubectl logs myPod test_container
10.rolling-update|rollingupdate
对某个复制控制器进行滚动升级,即通过每次仅更新一个Pod的方式来平滑的过渡到新的部署上。
命令格式为kubectl rolling-update OLD_CONTROLLER_NAME([NEW_CONTROLLER_NAME]—image=NEW_CONTAINER_IMAGE|-f NEW_CONTROLLER_SPEC)[flags]。
支持的参数主要有:
·—deployment-label-key="deployment":默认用于进行区分的标签;
·—dry-run=false:输出模拟执行的改动,但实际上不执行;
·-f,—filename="":创建新的复制控制器的模板文件所在路径、目录或URL;
·—image="":升级使用的新的容器镜像;
·-o,—output="":输出格式,包括json|yaml|template|templatefile|wide;
·—poll-interval="3s":检查更新状态的时间间隔;
·—rollback=false:回滚上上次版本;
·-t,—template="":golang模板字符串或文件路径;
·—timeout="5m0s":超时时间;
·—update-period="1m0s":升级多个Pod的时间间隔。
例如,更新rc-v1复制控制器为rc-v2.json中定义内容:
- $ kubectl rolling-update rc-v1 -f rc-v2.json
11.scale
对某个复制控制器的份数进行调整。
命令格式为kubectl scale[—resource-version=version][—current-replicas=count]—replicas=COUNT(-f FILENAME|TYPE NAME)[flags]。
支持的参数主要有:
·—current-replicas=-1:对当前的复制份数进行检查,匹配则执行scale命令;
·-f,—filename=[]:复制控制器的模板文件所在路径、目录或URL;
·-o,—output="":输出格式;
·—replicas=-1:新的份数,必备项;
·—resource-version="":对当前的资源版本进行检查,匹配则执行scale命令;
·—timeout=0:命令执行超时时间。
12.cordon
标记一个节点为不可调度状态。当节点出现故障时候,可以避免调度资源上去。
命令格式为kubectl cordon NODE[flags]。
例如让节点n1不可调度资源:
- $ kubectl cordon n1
13.drain
将节点资源从节点上迁移出去(删除掉Pod,并不可调度资源)。可以用于在对节点进行维护前让工作资源从节点上调度出去。
命令格式为kubectl drain NODE[flags]。
支持的参数主要有:
·—force[=false]:删除不被ReplicationController、Job或DaemonSet管理的Pod;
·—grace-period=-1:指定允许被删除Pod平缓退出的时间;
·—ignore-daemonsets[=false]:忽略DaemonSet所管理的Pod。
14.uncordon
恢复节点为可调度状态,可以分配工作负载过来了。
命令格式为kubectl uncordon NODE[flags]。
例如让节点n1恢复到可调度状态:
- $ kubectl uncordon n1
15.attach
贴附到某个容器上,类似Docker的attach命令。
命令格式为kubectl attach POD-c CONTAINER[flags]。
支持的参数主要有:
·-c,—container="":Pod中的容器名,忽略则默认为第一个;
·-i,—stdin[=false]:挂载当前的标准输入到容器;
·-t,—tty[=false]:标准输入为TTY类型。
16.exec
在给定Pod中执行命令,类似Docker的exec指令。
命令格式为kubectl exec POD[-c CONTAINER]—COMMAND[args…][flags]。
支持的参数主要有:
·-c,—container="":Pod中执行命令的容器名称,默认会选取第一个;
·-p,—pod="":Pod名称;
·-i,—stdin[=false]:将标准输入接通到容器;
·-t,—tty[=false]:标准输入是TTY类型。
例如,在nginx Pod中打开一个bash,可以用:
- $ kubectl exec -it nginx -- bash
17.port-forward
映射本地端口到Pod。
命令格式为kubectl port-forward POD[LOCAL_PORT:]REMOTE_PORT[…[LOCAL_PORT_N:]REMOTE_PORT_N][flags]。
支持的参数主要有-p,—pod="",Pod名称。
例如,映射本地端口8080到test_pod的80端口:
- $ kubectl port-forward test_pod 8080:80
18.proxy
本地创建一个访问Kubernetes API服务的代理。
命令格式为kubectl proxy[—port=PORT][—www=static-dir][—www-prefix=prefix][—api-prefix=prefix][flags]。
支持的参数主要有:
·—accept-hosts="^localhost$,^127.0.0.1$,^[::1]$":允许访问的地址,正则表达式格式;
·—accept-paths="^/.*":允许访问的路径,正则表达式格式;
·—address="127.0.0.1":服务的IP地址;
·—api-prefix="/":映射API到指定URL路径下;
·—disable-filter[=false]:是否过滤请求,打开该选项将导致安全风险;
·-p,—port=8001:代理的监听端口,默认将随机选取;
·—reject-methods="POST,PUT,PATCH":拒绝访问的HTTP方法;
·—reject-paths="^/api/./exec,^/api/./run,^/api/.*/attach":拒绝访问的路径;
·-u,—unix-socket="":监听在指定的Unix套接字上;
·-w,—www="":在给定前缀路径下提供静态HTTP服务;
·-P,—www-prefix="/static/":静态服务的资源所在路径。
19.run|run-container
运行容器(默认在后台),类似Docker的run-d指令。默认会自动创建一个部署或者任务来管理创建的容器。
命令格式为kubectl run NAME—image=image[—env="key=value"][—port=port][—replicas=replicas][—dry-run=bool][—overrides=inline-json][flags]。
支持的参数主要有:
·—attach[=false]:是否挂载到运行的容器;
·—command[=false]:如果配置该选项,flag作为运行命令传给容器;
·—dry-run[=false]:模拟运行过程,打印命令,但实际上不执行;
·—env=[]:传递给容器的环境变量;
·—generator="":API生成器名称,指定—restart=Always情况下默认为'run/v1',否则为'run-pod/v1';
·—hostport=-1:映射到容器端口的节点主机端口;
·—image="":要运行的容器镜像名称;
·-l,—labels="":设置Pod的标签;
·—leave-stdin-open[=false]:保持标准输入挂载到Pod;
·—limits="":容器的资源限制,例如'cpu=200m,memory=512Mi';
·—no-headers[=false]:输出不打印标题栏;
·-o,—output="":输出格式,可以为json|yaml|wide|name|go-template=…|go-template-file=…|jsonpath=…|jsonpath-file=…;
·—output-version="":按照给定版本输出格式化数据,默认为api-version;
·—port=-1:容器声明开放的端口号;
·-r,—replicas=1:容器复制的份数,默认为1;
·—requests="":容器请求的资源,例如'cpu=100m,memory=256Mi';
·—restart="Always":Pod的重启策略,可以为Always(默认值),OnFailure,Never。如果是'Always',则自动创建一个部署来管理Pod,否则—replicas必须设为1;
·-a,—show-all[=false]:打印所有的Pod,包括已经终止的;
·—sort-by="":按照给定域来对输出结果进行排序;
·-i,—stdin[=false]:保持Pod中容器的标准输入处于打开状态;
·—template="":使用的模板字符串或文件路径;
·—tty[=false]:为Pod中的每一个容器分配一个TTY。
例如,启动nginx Pod,并通过一个复制控制器来自动管理它,保证复制为2,可以用:
- $ kubectl run --image=nginx --replicas=2 nginx-app --port=80 --env="DOMAIN=cluster"
- replicationcontroller "nginx-app" created
此时,可以查看自动创建的复制控制器,保证始终有2个Nginx Pod在运行。
- $ kubectl get rc
- CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE
- nginx-app nginx-app nginx run=nginx-app 2 <invalid>
20.expose
使用给定的复制控制器、Pod或者服务等资源的选择器,发布为新的服务。
命令格式为kubectl expose(-f FILENAME|TYPE NAME)[—port=port][—protocol=TCP|UDP][—target-port=number-or-name][—name=name][——external-ip=external-ip-of-service][—type=type][flags]。
支持的参数主要有:
·—container-port="":等价于—target-port,指定Pod的端口;
·—dry-run[=false]:模拟输出发送命令,但不执行;
·—external-ip="":指定外部可以访问服务的地址;
·-f,—filename=[]:资源模板文件所在路径、目录或URL;
·—generator="service/v2":使用哪个API生成器;
·-l,—labels="":给生成服务添加标签;
·—load-balancer-ip="":绑定到负载均衡器的地址,不指定则自动获取生成(需要外部平台支持);
·—name="":创建服务的名称;
·—no-headers[=false]:输出不打印头部信息;
·-o,—output="":输出格式,包括json|yaml|wide|name|go-template=…|go-template-file=…|jsonpath=…|jsonpath-file=…等;
·—output-version="":输出格式化对象依照的版本信息;
·—overrides="":覆盖生成对象的给定域;
·—port="":服务端口;
·—protocol="TCP":服务监听类型;
·—record[=false]:记录当前kubectl操作为服务的注解信息;
·—save-config[=false]:保存配置为服务的注解信息;
·—selector="":标签选择器;
·—session-affinity="":指定服务的会话的关联性,可以为'None'(简单轮换)或'ClientIP'(同一个客户端的请求分发到同一个后端);
·-a,—show-all[=false]:显示所有资源信息,包括处于终止状态的Pod;
·—show-labels[=false]:显示标签信息;
·—sort-by="":指定输出的排序域;
·—target-port="":Pod上的端口,不给定则默认跟服务端口相同;
·—template="":指定使用模板文件时,模板文件的路径;
·—type="ClusterIP":服务的类型,包括ClusterIP、NodePort或LoadBalancer。
例如,将某个Pod test-pod,发布为监听在80端口的Web服务:
- $ kubectl expose pod test-pod --port=80 --name=web
21.autoscale
自动根据需求来扩展一个部署(或复制控制器)中的Pod数目。类似AWS中自动扩展组的概念。
命令格式为kubectl autoscale(-f FILENAME|TYPE NAME|TYPE/NAME)[—min=MINPODS]—max=MAXPODS[—cpu-percent=CPU][flags]。
支持的参数参见前一小节的expose参数,部分参数说明如下:
·—cpu-percent=-1:所有Pod上的CPU平均使用比例;
·—generator="horizontalpodautoscaler/v1beta1":指定API生成器;
·—max=-1:自动扩展Pod的上限值,必备项;
·—min=-1:自动扩展Pod的下限值;
·—name="":自动扩展的名字,默认采用操作资源的名字。
22.rollout
对一个部署进行操作。
命令格式为kubectl rollout SUBCOMMAND(TYPE NAME|TYPE/NAME)[flags]。
支持的子命令包括:
·history:查看rollout的历史记录;
·pause:标记给定资源为暂停状态;
·resume:继续一个暂停状态的资源;
·undo:撤销,回到之前的rollout。
参数主要为-f,—filename=[],资源模板文件路径、目录或URL。
23.label
更新一个资源的标签信息。
命令格式为kubectl label—overwriteKEY_1=VAL_1…KEY_N=VAL_N[—resource-version=version][flags]。
支持的参数参见前面expose参数,部分参数说明如下:
·—all[=false]:选择指定类型的所有资源;
·—overwrite[=false]:是否允许覆盖已有标签的值;
·—resource-version="":检查资源版本信息是否匹配给定值,不匹配则拒绝修改;
·-l,—selector="":标签选择器。
例如,为test_pod资源添加标签release=beta。
- $ kubectl label -f test_pod.json release=beta
24.annotate
自更新一个资源的注解信息。
命令格式为kubectl annotate—overwriteKEY_1=VAL_1…KEY_N=VAL_N[—resource-version=version][flags]。
支持的参数参见前面的expose和label参数。
25.config
修改kubeconfig文件。
命令格式为kubectl config SUBCOMMAND[flags]。
支持子命令包括:
·current-context:显示当前的上下文;
·set-context:配置上下文信息;
·use-context:切换当前上下文到指定上下文;
·set-cluster:配置一个集群的信息,名字不存在则新创建;
·set:配置kubeconfig文件中的键值;
·unset:取消kubeconfig文件中的键值;
·view:查看kubeconfig文件信息;
·set-credentials:配置kubeconfig文件中的用户认证信息。
支持的参数主要有—kubeconfig="",指定kubeconfig文件。
26.explain
显示资源类型的说明文档。可以快速查看某个资源的解释。
命令格式为kubectl explain RESOURCE。
27.convert
转换配置文件到其他API版本。
命令格式为kubectl convert-f FILENAME[flag]。
支持的参数参见前面的expose的参数,部分参数说明如下:
·—local[=true]:不跟API服务交互,仅本地运行;
·—schema-cache-dir="~/.kube/schema":API schemas所在目录;
·—validate[=true]:执行命令前对输入进行校验。
