Kubectl是一个用于操作kubernetes集群的命令行接口,通过利用kubectl的各种命令可以实现各种功能,是在使用kubernetes中非常常用的工具。

接下来我们会通过一些简单的实例来展现其中一些高频命令的使用方法,更为重要的是这些命令使用的场景以及能够解决什么样的问题。

环境构成

  • 集群:
类型主机名IP
Mastermaster192.168.30.128
Mastermaster2192.168.30.150
Nodenode1192.168.30.129
Nodenode2192.168.30.130
# kubectl get nodesNAME              STATUS                     ROLES     AGE        VERSION
192.168.30.129    Ready                      node      10d        v1.11.6
192.168.30.130    Ready                      node      10d        v1.11.6
192.168.30.128    Ready,SchedulingDisabled   master    10d        v1.11.6
192.168.30.150    Ready,SchedulingDisabled   master    10d        v1.11.6

  • 版本:
# kubectl versionClient Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.6", GitCommit:"b1d75deca493a24a2f87eb1efde1a569e52fc8d9", GitTreeState:"clean", BuildDate:"2018-12-16T04:39:52Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.6", GitCommit:"b1d75deca493a24a2f87eb1efde1a569e52fc8d9", GitTreeState:"clean", BuildDate:"2018-12-16T04:30:10Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}

部署命令

kubectl help可以查看kubectl相关的命令。

Basic Commands (Beginner):
  create         Create a resource from a file or from stdin.
  expose         使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的
Kubernetes Service
  run            在集群中运行一个指定的镜像  set            为 objects 设置一个指定的特征
 
Basic Commands (Intermediate):
  explain        查看资源的文档
  get            显示一个或更多 resources
  edit           在服务器上编辑一个资源
  delete         Delete resources by filenames, stdin, resources and names, or by resources and label selector
 
Deploy Commands:
  rollout        Manage the rollout of a resource
  scale          为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量
  autoscale      自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量
 
Cluster Management Commands:
  certificate    修改 certificate 资源.
  cluster-info   显示集群信息  top            Display Resource (CPU/Memory/Storage) usage.
  cordon         标记 node 为 unschedulable
  uncordon       标记 node 为 schedulable
  drain          Drain node in preparation for maintenance
  taint          更新一个或者多个 node 上的 taints
 
Troubleshooting and Debugging Commands:
  describe       显示一个指定 resource 或者 group 的 resources 详情
  logs           输出容器在 pod 中的日志
  attach         Attach 到一个运行中的 container  exec           在一个 container 中执行一个命令
  port-forward   Forward one or more local ports to a pod
  proxy          运行一个 proxy 到 Kubernetes API server  cp             复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
  auth           Inspect authorization
 
Advanced Commands:
  apply          通过文件名或标准输入流(stdin)对资源进行配置
  patch          使用 strategic merge patch 更新一个资源的 field(s)
  replace        通过 filename 或者 stdin替换一个资源  wait           Experimental: Wait for one condition on one or many resources
  convert        在不同的 API versions 转换配置文件
 
Settings Commands:
  label          更新在这个资源上的 labels
  annotate       更新一个资源的注解
  completion     Output shell completion code for the specified shell (bash or zsh)
 Other Commands:
  alpha          Commands for features in alpha
  api-resources  Print the supported API resources on the server
  api-versions   Print the supported API versions on the server, in the form of "group/version"
  config         修改 kubeconfig 文件
  plugin         Runs a command-line plugin
  version        输出 client 和 server 的版本信息

下面将会简单介绍一下如下命令,与部署相关:

命令说明
rollout管理资源的部署
scale为deployment、rs、rc或job设置新的副本数量
autoscale自动调整deployment、rs或者rc的副本数量

rollout

kubectl rollout对资源进行管理。可用资源包括:deployment、daemonset。

子命令:

命令说明
history查看历史版本
pause暂停资源
resume恢复暂停资源
status查看资源状态
undo回滚版本

DaemonSet保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:

  • 日志收集,比如fluentd,logstash等
  • 系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
  • 系统程序,比如kube-proxy, kube-dns, glusterd, ceph等

下面以Deployment “mysql”为例,对其进行升级/回滚。

# kubectl get deployNAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
mysql     1         1         1            1           18h# kubectl rollout history deploy/mysqldeployments "mysql"REVISION  CHANGE-CAUSE
1         <none># kubectl rollout pause  deploy/mysqldeployment.extensions/mysql paused# kubectl rollout resume deploy/mysqldeployment.extensions/mysql resumed

升级:

# kubectl set image deploy/mysql mysql=mysql:5.7deployment.extensions/mysql image updated# kubectl rollout history deploy/mysqldeployments "mysql"REVISION  CHANGE-CAUSE
1         <none>2         <none># kubectl rollout status deploy/mysqldeployment "mysql" successfully rolled out# kubectl rollout history deploy mysql --revision=2             #查看对应历史版本详情deployments "mysql" with revision #2Pod Template:
  Labels:	app=mysql
	pod-template-hash=2226664987
  Containers:
   mysql:
    Image:	mysql:5.7
    Port:	3306/TCP
    Host Port:	0/TCP
    Environment:
      MYSQL_ROOT_PASSWORD:	123456
    Mounts:	<none>
  Volumes:	<none>

回滚:

# kubectl rollout undo deploy mysql                 #回滚版本deployment.extensions/mysql# kubectl rollout history deploy/mysqldeployments "mysql"REVISION  CHANGE-CAUSE
2         <none>3         <none># kubectl rollout history deploy mysql --revision=3             deployments "mysql" with revision #3Pod Template:
  Labels:	app=mysql
	pod-template-hash=1962730642
  Containers:
   mysql:
    Image:	mysql:5.6
    Port:	3306/TCP
    Host Port:	0/TCP
    Environment:
      MYSQL_ROOT_PASSWORD:	123456
    Mounts:	<none>
  Volumes:	<none>

scale

kubectl scale用于横向扩展,扩容或缩容 Deployment、ReplicaSet、Replication Controller或Job 中Pod数量。

scale可以指定多个前提条件,如:当前副本数量--current-replicas或资源版本--resource-version,进行伸缩比例设置前,系统会先验证前提条件是否成立。

例如,将mysql的副本数设置为3。

# kubectl get podNAME                     READY     STATUS    RESTARTS   AGE
mysql-5fb6c74b86-d9qzg   1/1       Running   0          9m# kubectl scale --replicas=3 deploy/mysqldeployment.extensions/mysql scaled# kubectl get podNAME                     READY     STATUS    RESTARTS   AGE
mysql-5fb6c74b86-4nr59   1/1       Running   0          3s
mysql-5fb6c74b86-d9qzg   1/1       Running   0          10m
mysql-5fb6c74b86-gwn9r   1/1       Running   0          3s

或者,将由“mysql-deploy.yaml”配置文件中指定的资源对象和名称标识的pod副本数设为3。

# kubectl scale --replicas=2 -f mysql-deploy.yamldeployment.apps/mysql scaled# kubectl get podNAME                     READY     STATUS    RESTARTS   AGE
mysql-5fb6c74b86-d9qzg   1/1       Running   0          14m
mysql-5fb6c74b86-gwn9r   1/1       Running   0          4m

autoscale

kubectl autoscale自动设置在kubernetes集群中运行的pod数量(水平自动伸缩)。

指定Deployment、ReplicaSet或ReplicationController,并创建已经定义好资源的自动伸缩器。使用自动伸缩器可以根据需要自动增加或减少系统中部署的pod数量。

例如,使用Deployment “mysql”设定,使用默认的自动伸缩策略,指定目标CPU使用率,使其Pod数量在3到10之间。

# kubectl autoscale deploy mysql --min=3 --max=10horizontalpodautoscaler.autoscaling/mysql autoscaled# kubectl get horizontalpodautoscalers.autoscaling NAME      REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
mysql     Deployment/mysql   <unknown>/80%   3         10        3          2m# kubectl get podNAME                     READY     STATUS    RESTARTS   AGE
mysql-5fb6c74b86-4jl98   1/1       Running   0          2m
mysql-5fb6c74b86-d9qzg   1/1       Running   0          22m
mysql-5fb6c74b86-gwn9r   1/1       Running   0          12m

或者,使用Deployment “mysql”设定,使其Pod的数量介于1和10之间,CPU使用率维持在80%。

# kubectl delete horizontalpodautoscalers.autoscaling mysql             #先删除之前的autoscaling,否则提示已存在horizontalpodautoscaler.autoscaling "mysql" deleted# kubectl autoscale deploy mysql --max=10 --cpu-percent=80horizontalpodautoscaler.autoscaling/mysql autoscaled# kubectl get horizontalpodautoscalers.autoscaling mysqlNAME      REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
mysql     Deployment/mysql   <unknown>/80%   1         10        3          35s


集群管理命令

下面将会简单介绍一下如下命令,与集群的管理相关:

命令说明
certificate修改证书资源
cluster-info显示集群信息
top显示资源(CPU/内存/存储)使用情况
cordon将node标记为不可调度
uncordon将node标记为可调度的
drain维护期间排除节点
taint更新一个或多个节点上的taint

certificate

kubectl certificate用来修改证书资源。该命令不常用。

子命令:

命令说明
approve批准证书签名请求
deny拒绝证书签名请求

cluster-info

kubectl cluster-info可以显示集群信息。

# kubectl cluster-info Kubernetes master is running at https://192.168.30.150:8443
Heapster is running at https://192.168.30.150:8443/api/v1/namespaces/kube-system/services/heapster/proxy
CoreDNS is running at https://192.168.30.150:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
kubernetes-dashboard is running at https://192.168.30.150:8443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
monitoring-grafana is running at https://192.168.30.150:8443/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
monitoring-influxdb is running at https://192.168.30.150:8443/api/v1/namespaces/kube-system/services/monitoring-influxdb/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

要进一步调试和诊断集群问题,可以使用 kubectl cluster-info dump 命令查看信息。

top

kubectl top用于显示资源(CPU/内存/存储)使用情况。可用资源包括:node、pod。

例如,显示集群中node的资源使用情况。

# kubectl top nodeNAME             CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%   
192.168.30.129   117m         2%        3164Mi          15%       
192.168.30.130   125m         3%        4206Mi          26%       
192.168.30.128   180m         4%        4089Mi          20%       
192.168.30.150   576m         14%       4431Mi          22%

或者,显示集群中pod的资源使用情况。

# kubectl top podNAME                     CPU(cores)   MEMORY(bytes)   mysql-5fb6c74b86-4jl98   1m           465Mi           
mysql-5fb6c74b86-d9qzg   1m           465Mi           
mysql-5fb6c74b86-gwn9r   1m           460Mi

cordon

kubectl cordon将node标记为不可调度的状态,这样就不会让新创建的pod在此node上运行。

例如,将192.168.30.130这个node标记为不可调度状态。

# kubectl get nodeNAME             STATUS                     ROLES     AGE       VERSION
192.168.30.129   Ready                      node      10d       v1.11.6
192.168.30.130   Ready                      node      10d       v1.11.6
192.168.30.128   Ready,SchedulingDisabled   master    10d       v1.11.6
192.168.30.150   Ready,SchedulingDisabled   master    10d       v1.11.6# kubectl get pod -o wideNAME                     READY     STATUS    RESTARTS   AGE       IP            NODE             NOMINATED NODE
mysql-5fb6c74b86-4jl98   1/1       Running   0          1h        172.20.2.22   192.168.30.129   <none>mysql-5fb6c74b86-d9qzg   1/1       Running   0          1h        172.20.2.21   192.168.30.129   <none>mysql-5fb6c74b86-gwn9r   1/1       Running   0          1h        172.20.3.15   192.168.30.130   <none># kubectl cordon 192.168.30.130              #将node标记为不可调度状态node/192.168.30.130 cordoned# kubectl get nodeNAME             STATUS                     ROLES     AGE       VERSION
192.168.30.129   Ready                      node      10d       v1.11.6
192.168.30.130   Ready,SchedulingDisabled   node      10d       v1.11.6                 #该node已经显示为SchedulingDisabled状态192.168.30.128   Ready,SchedulingDisabled   master    10d       v1.11.6
192.168.30.150   Ready,SchedulingDisabled   master    10d       v1.11.6# kubectl get pod -o wideNAME                     READY     STATUS    RESTARTS   AGE       IP            NODE             NOMINATED NODE
mysql-5fb6c74b86-4jl98   1/1       Running   0          1h        172.20.2.22   192.168.30.129   <none>mysql-5fb6c74b86-d9qzg   1/1       Running   0          1h        172.20.2.21   192.168.30.129   <none>mysql-5fb6c74b86-gwn9r   1/1       Running   0          1h        172.20.3.15   192.168.30.130   <none>

可以看到,即使192.168.30.130这个node是不可调度状态,其下还是有pod在运行。

uncordon

kubectl uncordon将node标记为可调度的状态。

下面,我们将192.168.30.130这个node恢复为可调度的状态。

# kubectl uncordon 192.168.30.130           #将node标记为可调度的状态node/192.168.1.253 uncordoned# kubectl get nodeNAME             STATUS                     ROLES     AGE       VERSION
192.168.30.129   Ready                      node      10d       v1.11.6
192.168.30.130   Ready                      node      10d       v1.11.6
192.168.30.128   Ready,SchedulingDisabled   master    10d       v1.11.6
192.168.30.150   Ready,SchedulingDisabled   master    10d       v1.11.6

drain

kubectl drain可以让node在维护期间排除节点。drain本意排水,意思是将出问题的node下的pod转移到其它node下运行。

下面新建deployment “nginx”,对192.168.30.130这个node进行drain。

# kubectl run nginx --image=nginx --expose --port=80 --replicas=5service/nginx created
deployment.apps/nginx created# kubectl get pod -o wideNAME                     READY     STATUS    RESTARTS   AGE       IP            NODE             NOMINATED NODE
mysql-5fb6c74b86-4jl98   1/1       Running   0          3h        172.20.2.22   192.168.30.129   <none>mysql-5fb6c74b86-d9qzg   1/1       Running   0          3h        172.20.2.21   192.168.30.129   <none>mysql-5fb6c74b86-gwn9r   1/1       Running   0          3h        172.20.3.15   192.168.30.130   <none>nginx-6f858d4d45-4r9b5   1/1       Running   0          24s       172.20.2.25   192.168.30.129   <none>nginx-6f858d4d45-b98dj   1/1       Running   0          24s       172.20.2.24   192.168.30.129   <none>nginx-6f858d4d45-m7q9m   1/1       Running   0          24s       172.20.3.18   192.168.30.130   <none>nginx-6f858d4d45-q42l7   1/1       Running   0          24s       172.20.2.23   192.168.30.129   <none>nginx-6f858d4d45-vmxq9   1/1       Running   0          24s       172.20.3.19   192.168.30.130   <none># kubectl drain 192.168.30.130 --ignore-daemonsets --delete-local-data                #排除192.168.30.130这个nodenode/192.168.30.130 cordoned
WARNING: Ignoring DaemonSet-managed pods: kube-flannel-ds-amd64-mkxld; Deleting pods with local storage: metrics-server-75df6ff86f-dwphq, monitoring-grafana-c797777db-qtpsx
pod/monitoring-grafana-c797777db-qtpsx evicted
pod/nginx-6f858d4d45-vmxq9 evicted
pod/nginx-6f858d4d45-m7q9m evicted
pod/mysql-5fb6c74b86-gwn9r evicted
pod/metrics-server-75df6ff86f-dwphq evicted
pod/coredns-695f96dcd5-hc8hx evicted
pod/heapster-56c9dc749-t96kf evicted# kubectl get pod -o wideNAME                     READY     STATUS    RESTARTS   AGE       IP            NODE             NOMINATED NODE
mysql-5fb6c74b86-4jl98   1/1       Running   0          3h        172.20.2.22   192.168.30.129   <none>mysql-5fb6c74b86-d9qzg   1/1       Running   0          3h        172.20.2.21   192.168.30.129   <none>mysql-5fb6c74b86-h7f4j   1/1       Running   0          13s       172.20.2.26   192.168.30.129   <none>nginx-6f858d4d45-4r9b5   1/1       Running   0          9m        172.20.2.25   192.168.30.129   <none>nginx-6f858d4d45-5b2lv   1/1       Running   0          13s       172.20.2.28   192.168.30.129   <none>nginx-6f858d4d45-b98dj   1/1       Running   0          9m        172.20.2.24   192.168.30.129   <none>nginx-6f858d4d45-q42l7   1/1       Running   0          9m        172.20.2.23   192.168.30.129   <none>nginx-6f858d4d45-zj2cv   1/1       Running   0          13s       172.20.2.27   192.168.30.129   <none>                #这里的pod全部运行在192.168.30.129上# kubectl get nodeNAME             STATUS                     ROLES     AGE       VERSION
192.168.30.129   Ready                      node      10d       v1.11.6
192.168.30.130   Ready,SchedulingDisabled   node      10d       v1.11.6
192.168.30.128   Ready,SchedulingDisabled   master    10d       v1.11.6
192.168.30.150   Ready,SchedulingDisabled   master    10d       v1.11.6

执行drain命令,发现这条命令做了两件事情:

  • 设定此node为不可调度状态(cordon)
  • evict(回收)了其上的三个pod

taint

kubectl taint用来更新一个或多个节点上的taint。该命令不常用。

节点亲和性是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。taint 则相反,它使节点能够排斥一类特定的pod。

taint和toleration相互配合,可以用来避免pod被分配到不合适的节点上。每个节点上都可以应用一个或多个taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。
如果将 toleration 应用于 pod 上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上。