Kubectl是一个用于操作kubernetes集群的命令行接口,通过利用kubectl的各种命令可以实现各种功能,是在使用kubernetes中非常常用的工具。
接下来我们会通过一些简单的实例来展现其中一些高频命令的使用方法,更为重要的是这些命令使用的场景以及能够解决什么样的问题。
环境构成
- 集群:
类型 | 主机名 | IP |
---|---|---|
Master | master | 192.168.30.128 |
Master | master2 | 192.168.30.150 |
Node | node1 | 192.168.30.129 |
Node | node2 | 192.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 的节点上。