本文转自:http://blog.csdn.net/xingwangc2014/article/details/51204224
官网命令介绍:http://kubernetes.io/docs/user-guide/kubectl/kubectl/

前言:kubernetes通过kube-apiserver作为整个集群管理的入口。Apiserver是整个集群的主管理节点,用户通过Apiserver配置和组织集群,同时集群中各个节点同etcd存储的交互也是通过Apiserver进行交互。Apiserver实现了一套RESTfull的接口,用户可以直接使用API同Apiserver交互。另外官方还提供了一个客户端kubectl随工具集打包,用于可直接通过kubectl以命令行的方式同集群交互。
由于博主水平有限,本文主要介绍一些博主在日常中经常使用到的命令,另外最近正式release的kubernetes 1.2中新加入的的一些feature,由于博主也还没有深入研究,所以不会太多涉及。


1. Help

类似于所有的命令行工具工具,kubectl也可以直接执行 kubectlkubectl help | kubectl --help 可获得命令的帮助信息。如下图所示,kubectl使用方式为:

Usage: kubectl [flags] kubectl [commond]

另外所有的命令选项都可以通过执行 --help获得特定命令的帮助信息。

help

2. get

get命令用于获取集群的一个或一些resource信息。使用--help查看详细信息。kubectl的帮助信息、示例相当详细,而且简单易懂。建议大家习惯使用帮助信息。kubectl可以列出集群所有resource的详细。resource包括集群节点、运行的pod,ReplicationController,service等。

Usage: kubectl get [(-o|--output=)json|yaml|wide|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...] (TYPE [NAME | -l label] | TYPE/NAME ...) [flags] [flags]
  • 1)例如获取pod信息,可以直接使用"kubectl get po“获取当前运行的所有pods的信息,或使用 kubectl get po -o wide 获取pod运行在哪个节点上的信息。注:集群中可以创建多个namespace,未显示的指定namespace的情况下,所有操作都是针对default namespace。如下图所示列出了default 和kube-system的pods:

  • 2)获取namespace信息
kubectl get namespace

  • 3)类似可以使用 kubectl get rc,kubectl get svc, kubectl get nodes等获取其他resource信息。
  • 4)获取一些更具体的信息,可以通过使用选项“-o”。如:

(1)kubectl get po <podname> -o yaml 以yawl格式输出pod的详细信息。

(2)kubectl get po <podname> -o json 以jison格式输出pod的详细信息。

(3)另外还可以使用”-o=custom-columns=“定义直接获取指定内容的值。如前面使用json和ymal格式的输出中,metadata.labels.app的值可以使用如下命令获取。

kubectl get po rc-nginx-2-btv4j -o=custom-columns=LABELS:.metadata.labels.app

其中LABELS为显示的列标题,”.metadata.labels.app”为查询的域名

(4)其他资源也可以使用类似的方式。

3. describe

describe类似于get,同样用于获取resource的相关信息。不同的是,get获得的是更详细的resource个性的详细信息,describe获得的是resource集群相关的信息。describe命令同get类似,但是describe不支持-o选项,对于同一类型resource,describe输出的信息格式,内容域相同。 注:如果发现是查询某个resource的信息,使用get命令能够获取更加详尽的信息。但是如果想要查询某个resource的状态,如某个pod并不是在running状态,这时需要获取更详尽的状态信息时,就应该使用describe命令。

kubectl describe po rc-nginx-2-btv4j

4. create

kubectl命令用于根据文件或输入创建集群resource。如果已经定义了相应resource的yaml或json文件,直接kubectl create -f filename即可创建文件内定义的resource。也可以直接只用子命令[namespace/secret/configmap/serviceaccount]等直接创建相应的resource。从追踪和维护的角度出发,建议使用json或yaml的方式定义资源。 如,前面get中获取的两个nginx pod的replication controller文件内容如下。文件名为:rc-nginx.yaml

apiVersion: v1
kind: ReplicationController
metadata:name: rc-nginx-2
spec:replicas: 2template:metadata:labels:app: nginx-2spec:containers:- name: nginx-2image: xingwangc.docker.rg/nginxports:- containerPort: 80

直接使用create则可以基于rc-nginx.yaml文件创建出ReplicationController(rc),rc会创建两个副本:

kubectl create -f rc-nginx.yaml

创建后,使用“kubectl get rc”可以看到一个名为rc-nginx-2的ReplicationController将被创建,同时“kubectl get po”的结果中会多出两个前缀为“rc-nginx-2-”的pod。关于kubernetes集群中resource,pod, ReplicationController…等后续会新开博文详细介绍。

5. replace

replace命令用于对已有资源进行更新、替换。如前面create中创建的nginx,当我们需要更新resource的一些属性的时候,如果修改副本数量,增加、修改label,更改image版本,修改端口等。都可以直接修改原yaml文件,然后执行replace命令。 注:名字不能被更新。另外,如果是更新label,原有标签的pod将会与更新label后的rc断开联系,有新label的rc将会创建指定副本数的新的pod,但是默认并不会删除原来的pod。所以此时如果使用get po将会发现pod数翻倍,进一步check会发现原来的pod已经不会被新rc控制,此处只介绍命令不详谈此问题,好奇者可自行实验。

kubectl replace -f rc-nginx.yaml

6. patch

如果一个容器已经在运行,这时需要对一些容器属性进行修改,又不想删除容器,或不方便通过replace的方式进行更新。kubernetes还提供了一种在容器运行时,直接对容器进行修改的方式,就是patch命令。 如前面创建pod的label是app=nginx-2,如果在运行过程中,需要把其label改为app=nginx-3,这patch命令如下:

kubectl patch pod rc-nginx-2-kpiqt -p '{"metadata":{"labels":{"app":"nginx-3"}}}'

7. edit

edit提供了另一种更新resource源的操作,通过edit能够灵活的在一个common的resource基础上,发展出更过的significant resource。例如,使用edit直接更新前面创建的pod的命令为:

kubectl edit po rc-nginx-btv4j

上面命令的效果等效于:

kubectl get po rc-nginx-btv4j -o yaml >> /tmp/nginx-tmp.yaml
vim /tmp/nginx-tmp.yaml
/*do some changes here */
kubectl replace -f /tmp/nginx-tmp.yaml

8. Delete

根据resource名或label删除resource。

kubectl delete -f rc-nginx.yaml
kubectl delete po rc-nginx-btv4j
kubectl delete po -lapp=nginx-2

9. apply

apply命令提供了比patch,edit等更严格的更新resource的方式。通过apply,用户可以将resource的configuration使用source control的方式维护在版本库中。每次有更新时,将配置文件push到server,然后使用kubectl apply将更新应用到resource。kubernetes会在引用更新前将当前配置文件中的配置同已经应用的配置做比较,并只更新更改的部分,而不会主动更改任何用户未指定的部分。 apply命令的使用方式同replace相同,不同的是,apply不会删除原有resource,然后创建新的。apply直接在原有resource的基础上进行更新。同时kubectl apply还会resource中添加一条注释,标记当前的apply。类似于git操作。

10. logs

logs命令用于显示pod运行中,容器内程序输出到标准输出的内容。跟docker的logs命令类似。如果要获得tail -f 的方式,也可以使用-f选项。

kubectl logs rc-nginx-2-kpiqt

11. rolling-update

rolling-update是一个非常重要的命令,对于已经部署并且正在运行的业务,rolling-update提供了不中断业务的更新方式。rolling-update每次起一个新的pod,等新pod完全起来后删除一个旧的pod,然后再起一个新的pod替换旧的pod,直到替换掉所有的pod。rolling-update需要确保新的版本有不同的name,Version和label,否则会报错 。

kubectl rolling-update rc-nginx-2 -f rc-nginx.yaml

如果在升级过程中,发现有问题还可以中途停止update,并回滚到前面版本

kubectl rolling-update rc-nginx-2 —rollback

rolling-update还有很多其他选项提供丰富的功能,如—update-period指定间隔周期,使用时可以使用-h查看help信息

12. scale

scale用于程序在负载加重或缩小时副本进行扩容或缩小,如前面创建的nginx有两个副本,可以轻松的使用scale命令对副本数进行扩展或缩小。 扩展副本数到4:

kubectl scale rc rc-nginx-3 —replicas=4

重新缩减副本数到2:

kubectl scale rc rc-nginx-3 —replicas=2

scale虽然能够很方便的对副本数进行扩展或缩小,但是仍然需要人工介入,不能实时自动的根据系统负载对副本数进行扩、缩。autoscale命令提供了自动根据pod负载对其副本进行扩缩的功能。 autoscale命令会给一个rc指定一个副本数的范围,在实际运行中根据pod中运行的程序的负载自动在指定的范围内对pod进行扩容或缩容。如前面创建的nginx,可以用如下命令指定副本范围在1~4

kubectl autoscale rc rc-nginx-3 —min=1 —max=4

14. cordon, drain, uncordon

这三个命令是正式release的1.2新加入的命令,三个命令一起介绍,是因为三个命令配合使用可以实现节点的维护。在1.2之前,因为没有相应的命令支持,如果要维护一个节点,只能stop该节点上的kubelet将该节点退出集群,是集群不在将新的pod调度到该节点上。如果该节点上本生就没有pod在运行,则不会对业务有任何影响。如果该节点上有pod正在运行,kubelet停止后,master会发现该节点不可达,而将该节点标记为notReady状态,不会将新的节点调度到该节点上。同时,会在其他节点上创建新的pod替换该节点上的pod。这种方式虽然能够保证集群的健壮性,但是任然有些暴力,如果业务只有一个副本,而且该副本正好运行在被维护节点上的话,可能仍然会造成业务的短暂中断。 1.2中新加入的这3个命令可以保证维护节点时,平滑的将被维护节点上的业务迁移到其他节点上,保证业务不受影响。如下图所示是一个整个的节点维护的流程(为了方便demo增加了一些查看节点信息的操作):

1)首先查看当前集群所有节点状态,可以看到共四个节点都处于ready状态;
2)查看当前nginx两个副本分别运行在d-node1和k-node2两个节点上;
3)使用cordon命令将d-node1标记为不可调度;
4)再使用kubectl get nodes查看节点状态,发现d-node1虽然还处于Ready状态,但是同时还被禁能了调度,这意味着新的pod将不会被调度到d-node1上。再查看nginx状态,没有任何变化,两个副本仍运行在d-node1和k-node2上;
5)执行drain命令,将运行在d-node1上运行的pod平滑的赶到其他节点上;
6)再查看nginx的状态发现,d-node1上的副本已经被迁移到k-node1上;这时候就可以对d-node1进行一些节点维护的操作,如升级内核,升级Docker等;
7)节点维护完后,使用uncordon命令解锁d-node1,使其重新变得可调度;

8)检查节点状态,发现d-node1重新变回Ready状态。

command

15. attach

attach命令类似于docker的attach命令,可以直接查看容器中以daemon形式运行的进程的输出,效果类似于logs -f,退出查看使用ctrl-c。如果一个pod中有多个容器,要查看具体的某个容器的的输出,需要在pod名后使用-c containers name指定运行的容器。如下示例的命令为查看kube-system namespace中的kube-dns-v9-rcfuk pod中的skydns容器的输出。

kubectl attach kube-dns-v9-rcfuk -c skydns —namespace=kube-system

16. exec

exec命令同样类似于docker的exec命令,为在一个已经运行的容器中执行一条shell命令,如果一个pod容器中,有多个容器,需要使用-c选项指定容器。

17. port-forward

 转发一个本地端口到容器端口,博主一般都是使用yaml的方式编排容器,所以基本不使用此命令。

18. proxy

博主只尝试过使用nginx作为kubernetes多master HA方式的代理,没有使用过此命令为kubernetes api server运行过proxy

19. run

类似于docker的run命令,直接运行一个image。

20. label

为kubernetes集群的resource打标签,如前面实例中提到的为rc打标签对rc分组。还可以对nodes打标签,这样在编排容器时,可以为容器指定nodeSelector将容器调度到指定lable的机器上,如如果集群中有IO密集型,计算密集型的机器分组,可以将不同的机器打上不同标签,然后将不同特征的容器调度到不同分组上。 在1.2之前的版本中,使用kubectl get nodes则可以列出所有节点的信息,包括节点标签,1.2版本中不再列出节点的标签信息,如果需要查看节点被打了哪些标签,需要使用describe查看节点的信息。

21. 其他

其他还有如cluster-info信息可以查看当前集群的一些信息,Version查看集群版本信息等,还有一些集群配置相关的命令等。

作者:撸大师
链接:https://www.jianshu.com/p/258539db000a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Kubernetes之kubectl常用命令相关推荐

  1. Kubernetes之kubectl常用命令使用指南:3:故障对应

    kubectl是一个用于操作kubernetes集群的命令行接口,通过利用kubectl的各种命令可以实现各种功能,是在使用kubernetes中非常常用的工具.这里我们会通过一些简单的实例来展现其中 ...

  2. kubernetes基础介绍及kubectl常用命令

    kubernetes基础介绍及kubectl常用命令 k8s的pod分类 自主式pod 控制器管理的pod 核心主键 HPA service 网络模型 同节点Pod之间的通信 不同节点上的Pod通信 ...

  3. k8s pod分类、核心组件、网络模型、kubectl常用命令

    k8s的pod分类.核心组件.网络模型.kubectl常用命令 K8s基本概念 pod分类 核心组件 K8s的三种网络模型 kubectl常用操作 kubeconfig配置文件 kubectl管理命令 ...

  4. Kubectl 常用命令, 开发人员常用k8s命令

    Kubectl 常用命令: 什么是常用,我用的,就是常用的

  5. kubectl常用命令_《蹲坑学kubernetes》之十五:kubectl命令详解

    kubectl用于运行Kubernetes集群命令的管理工具.本章节主要讲了kubectl基本语法和使用方法.在以后的实际工作中,使用越来越多,也会越来越熟悉. 1.kubectl语法 kubectl ...

  6. 容器技术之kubectl常用命令

    kubectl用于运行Kubernetes集群命令的管理工具.本文概述涵盖了kubectl语法,对命令操作的描述,并列举了常用命令. Kubectl命令详细列表请查看:Kubernetes kubec ...

  7. Kubectl常用命令(三)

    Kubectl是一个用于操作kubernetes集群的命令行接口,通过利用kubectl的各种命令可以实现各种功能,是在使用kubernetes中非常常用的工具. 接下来我们会通过一些简单的实例来展现 ...

  8. kubectl常用命令大全详解

    文章目录 说明 基础命令详解:create.delete.get.run.expose.set.explain.edit create 命令:根据文件或者输入来创建资源 创建Deployment和Se ...

  9. Kubectl 常用命令大全(*)

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

最新文章

  1. python可以自学吗需要什么基础-python自学行吗?给编程初学者零基础入门的建议...
  2. “中能融合杯”线下赛感悟
  3. MZOJ 1134: 二叉苹果树
  4. dfs中return回溯问题
  5. 持续集成工具集之三 Jenkins配置
  6. LeetCode Python实现 二叉树简单部分
  7. C语言进程的内存地址空间分配
  8. C语言auto、register、static、extern关键字
  9. 2020-09-09
  10. Win10+Python+Django+Nginx+MySQL开发教程及实例(2)——Python连通操作MySQL
  11. linux网络适配器驱动程序怎么安装,英特尔?服务器适配器 — Linuxixgbe* 基础驱动程序概述和安装...
  12. Oracle 11.2.4.0 ACTIVE DATAGUARD 单实例安装(COPY创建备库)
  13. win7x64 连接oracle 客户端 vs 2010调试 提示“ORA-12154: TNS: 无法解析指定的连接标识符 ”
  14. 《东周列国志》第十九回 擒傅瑕厉公复国 杀子颓惠王反正
  15. 常用的6个跨品种套利组合
  16. 新版本itunes如何设置iphone铃声
  17. 转载maven版本更新
  18. 条件随机场(Conditional random field,CRF)
  19. 使用Python读取网易邮箱大师客户端的所有邮件
  20. Android Studio-开发少年强国App(一)

热门文章

  1. java会员卡的绑定和解绑_SpringMVC源码之参数解析绑定原理
  2. 运用java语言提取数据库信息
  3. 系统安全及应用(账户安全控制,系统引导和登录,弱口令检测和登录控制,PAM认证,端口扫描,用户切换和提权)
  4. Linux使用parted进行分区及拓展实验
  5. 等级考试文件服务器,内核级 Samba 文件共享服务器 CIFSD 正式开始测试
  6. 苹果电脑适合python吗_m1的MacBook pro适合python开发吗?
  7. python爬虫之urllib,伪装,超时设置,异常处理
  8. python笔记之序列(dict的基本使用和常用操作)
  9. python顺序控制语句_Python学习之 流程控制语句
  10. 0分配不到地址_前端学习计算机网络——IP地址的划分及其分类