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中的版本信息:


  1. $ wget http://storage.googleapis.com/kubernetes-release/release/v1.2.0/bin/
  2. linux/amd64/kubectl

27.6.2 命令格式

可以通过kubectl help[subcommand]命令查看命令格式和支持的子命令信息。

使用的主要格式为:


  1. kubectl [global-flags] [subcommand] [RESOURCE_TYPE] [NAME...] [subcommand-flags...]

其中,subcommand为要执行的动作,如get、describe、create、delete等,NAME为某个资源类型下面的若干对象名称。

RESOURCE_TYPE为要操作的资源的类型,见表27-6。

表27-6 kubectl命令资源类型说明

27.6 使用kubectl - 图1

通过kubectl可以对这些资源进行生命周期管理,包括创建、删除、修改、查看等操作。

27.6.3 全局参数

这些参数主要是配置命令执行的环境信息,可以在执行具体子命令时候使用,参见表27-7。

表27-7 kubectl全局参数

27.6 使用kubectl - 图2

27.6 使用kubectl - 图3

27.6.4 子命令

子命令参见表27-8。

表27-8 kubect1子命令及其说明

27.6 使用kubectl - 图4

27.6 使用kubectl - 图5

下面详细介绍部分子命令。

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:持续监测输出对象的变化。

例如,获取集群中节点的列表:


  1. $ kubectl get nodes
  2. NAME LABELS STATUS
  3. 127.0.0.1 kubernetes.io/hostname=127.0.0.1 Ready

获取集群中Pod的列表:


  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. 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:


  1. $ kubectl describe po -l name=myLabel

3.create

创建一个资源。

命令格式为kubectl create-f FILENAME[flags]。

支持的参数主要有-f,—filename=[],创建资源的模板文件所在的路径或URL。例如,创建一个test_pod.yml文件,内容为:


  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx
  5. labels:
  6. name: nginx
  7. spec:
  8. containers:
  9. - name: nginx
  10. image: nginx
  11. ports:
  12. - containerPort: 80

然后执行如下命令创建Pod资源。


  1. $ kubectl create -f test_pod.yml
  2. pods/nginx

27.6 使用kubectl - 图6提示

这里直接操作Pod仅为了演示命令,一般情况下推荐通过复制控制器来操作Pod。

查看多出来一个新的Pod:


  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. k8s-master-127.0.0.1 3/3 Running 0 2d
  4. nginx 1/1 Running 0 7s

通过describe命令来查看具体信息,检查结果跟模板中定义一致:


  1. $ kubectl describe po -l name=nginx
  2. Name: nginx
  3. Namespace: default
  4. Image(s): nginx
  5. Node: 127.0.0.1/127.0.0.1
  6. Labels: name=nginx
  7. Status: Running
  8. Reason:
  9. Message:
  10. IP: 172.17.0.1
  11. Replication Controllers: <none>
  12. Containers:
  13. nginx:
  14. Image: nginx
  15. State: Running
  16. Started: Mon, 07 Mar 2016 11:04:52 +0800
  17. Ready: True
  18. Restart Count: 0
  19. Conditions:
  20. Type Status
  21. Ready True
  22. Events:
  23. FirstSeen LastSeen Count From SubobjectPath Reason Message
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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:


  1. $ kubectl replace -f test_pod.yml

5.patch

更新一个资源的域信息,即给资源打补丁。

命令格式为kubectl patch RESOURCE NAME-p PATCH[flags]。

支持的参数主要有-p,—patch="",补丁内容。例如,用户可以修改一个节点的spec值:


  1. $ 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:


  1. $ 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信息:


  1. $ 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中定义内容:


  1. $ 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不可调度资源:


  1. $ 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恢复到可调度状态:


  1. $ 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,可以用:


  1. $ 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端口:


  1. $ 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,可以用:


  1. $ kubectl run --image=nginx --replicas=2 nginx-app --port=80 --env="DOMAIN=cluster"
  2. replicationcontroller "nginx-app" created

此时,可以查看自动创建的复制控制器,保证始终有2个Nginx Pod在运行。


  1. $ kubectl get rc
  2. CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE
  3. 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服务:


  1. $ 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。


  1. $ 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]:执行命令前对输入进行校验。