kubectl概述

祭出一张图,转载至 kubernetes-handbook/kubectl命令概述 ,可以对命令族有个整体的概念。

环境准备

允许master节点部署pod,使用命令如下:

kubectl taint nodes --all node-role.kubernetes.io/master-

kubectl安装后,默认是没有比如自动补全等功能的,频繁使用比较不方便。目前已经有各类kubectl小 工具 可以提高效率,还有kubectl专用的shell了。个人感觉比较好用有以下这些:

  • 自动补全

kubectl 命令在bash中默认是没有自动补全的,需要安装bash_completion,添加自动补全脚本。这里以CentOS为例,其他操作系统配置可以参看 Install and Set Up kubectl

  1. # 安装bash-completion
  2. yum install -y epel-release.noarch
  3. yum install -y bash_completion
  4. # 添加补全脚本
  5. kubectl completion bash >/etc/bash_completion.d/kubectl复制代码

重新登录shell,可以发现kubectl的子命令,包括资源名称都可以用Tab键自动补全了:

  • 快速切换集群和Namespace

生产环境一般是多集群,至少也是多NS的环境,免不了经常在不同集群和不同NS间切换。切换集群要修改环境变量、切换NS要在命令跟上 -n namespace,都不是太方便。而用kubectx和kubens两个小工具可以实现快速切换。这俩在同一项目里: ahmetb/kubectx

  1. # 安装
  2. sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
  3. sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
  4. sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens
  5. # 使用kubectx
  6. # kubectx : 列出所有上下文
  7. # kubectx <NAME> : 切换到某个上下文
  8. $ kubectx minikube
  9. Switched to context "minikube".
  10. # kubectx - : 切换回上一个上下文
  11. $ kubectx -
  12. Switched to context "oregon".
  13. # kubectx <NEW_NAME>=<NAME> : 重命名一个集群上下文
  14. $ kubectx dublin=gke_ahmetb_europe-west1-b_dublin
  15. Context "dublin" set.
  16. Aliased "gke_ahmetb_europe-west1-b_dublin" as "dublin".
  17. # kubectx <NEW_NAME>=. : 重命名当前上下文
  18. # kubectx -d <NAME> : 删除上下文
  19. # 使用kubens
  20. # kubens : 列出所有的NS
  21. # kubens <NS-NAME> : 切换当前NS
  22. $ kubens kube-system
  23. Context "test" set.
  24. Active namespace is "kube-system".
  25. # kubens - : 切换回上一个NS
  26. $ kubens -
  27. Context "test" set.
  28. Active namespace is "default".复制代码

关于多集群切换的配置和上下文的概念可以参看 官方文档 ,有中文。

  • kubectl shell

kubectl已经有比较成熟的专用shell了,优化了自动补全,模糊匹配等功能:

但实际使用过程中,偶尔还是会各种小问题。推荐两个比较热门的,有需要可以尝试一下:

kube-shell

kube-prompt

常用命令详解

上面的概述图很全面,为了方便说吗,这里把Kubectl常用子命令大概分为以下几类:

语法

  1. $ kubectl [command] [TYPE] [NAME] [flags]复制代码

command:子命令

TYPE:资源类型

NAME:资源名称

flags:命令参数

命令帮助

kubectl命令的帮助很详细,

kubectl -h

会列出所有的子命令,在任何子命令后跟 -h,都会输出详细的帮助以及用例,遇到问题可以随时查看帮助。

资源对象

kubectl大部分子命令后都可以指定要操作的资源对象,可以用

kubectl api-resources

命令参考

全局参数

kubectl options

命令可以列出可以全局使用的命令参数,比较重要的有:

  1. --cluster='': 指定命令操作对象的集群
  2. --context='': 指定命令操作对象的上下文
  3. -n, --namespace='': 指定命令操作对象的Namespace复制代码

资源字段

kubectl explain

命令可以输出资源对应的属性字段及定义,在定义资源配置文件时候非常有用。

  1. # Usage:
  2. kubectl explain RESOURCE [options]
  3. # Examples:
  4. $ kubectl explain deployment.spec.selector
  5. KIND: Deployment
  6. VERSION: extensions/v1beta1
  7. RESOURCE: selector <Object>
  8. DESCRIPTION:
  9. Label selector for pods. Existing ReplicaSets whose pods are selected by
  10. this will be the ones affected by this deployment.
  11. A label selector is a label query over a set of resources. The result of
  12. matchLabels and matchExpressions are ANDed. An empty label selector matches
  13. all objects. A null label selector matches no objects.
  14. FIELDS:
  15. matchExpressions <[]Object>
  16. matchExpressions is a list of label selector requirements. The requirements
  17. are ANDed.
  18. matchLabels <map[string]string>
  19. matchLabels is a map of {key,value} pairs. A single {key,value} in the
  20. matchLabels map is equivalent to an element of matchExpressions, whose key
  21. field is "key", the operator is "In", and the values array contains only
  22. "value". The requirements are ANDed.复制代码

声明式资源对象管理

对集群资源的声明式管理,是Kubernetes最主要的特性之一,而kubectl apply命令是最能体现这个特性的命令。apply命令最主要的参数有两个:

  1. # Usage:
  2. kubectl apply (-f FILENAME | -k DIRECTORY) [options]复制代码

-f 参数后跟yaml或 json 格式的资源配置文件,-k 参数后跟kustomization.yaml配置文件的位置。

为什么说apply是声明式管理呢,因为所有对集群的增改操作,都能用apply命令完成,一切取决于后面的配置文件:

  • 如果配置文件中的资源找集群中不存在,则创建这个资源。
  • 如果配置文件中的资源在集群中已存在,则根据配置对资源字段进行更新

举个例子:

  1. # 部署一个goweb应用,配置pod数为4个:
  2. [root@master-1 ~]# grep replicas deployment-goweb.yaml
  3. replicas: 4
  4. # 使用 apply 创建资源
  5. [root@master-1 ~]# kubectl apply -f deployment-goweb.yaml
  6. deployment.apps/goweb created
  7. [root@master-1 ~]# kubectl get po
  8. NAME READY STATUS RESTARTS AGE
  9. goweb-6b5d559869-4x5mb 1/1 Running 0 14s
  10. goweb-6b5d559869-77lbz 1/1 Running 0 14s
  11. goweb-6b5d559869-9ztkh 1/1 Running 0 14s
  12. goweb-6b5d559869-ccjtp 1/1 Running 0 14s
  13. # 修改pod数量为2个:
  14. [root@master-1 ~]# sed -ri 's/4$/2/g' deployment-goweb.yaml
  15. [root@master-1 ~]# grep replicas deployment-goweb.yaml
  16. replicas: 2
  17. # 使用apply更新资源
  18. [root@master-1 ~]# kubectl apply -f deployment-goweb.yaml
  19. deployment.apps/goweb configured
  20. [root@master-1 ~]# kubectl get po
  21. NAME READY STATUS RESTARTS AGE
  22. goweb-6b5d559869-4x5mb 1/1 Running 0 8m21s
  23. goweb-6b5d559869-77lbz 1/1 Running 0 8m21s
  24. # pod数已更新为2个复制代码

可以看到,同一个

kubectl apply -f deployment-goweb.yaml

命令,可以用来创建资源也可以更新资源。

简单来说,apply命令的作用就是一个:使集群的实际状态朝用户声明的期望状态变化,而用户不用关心具体要进行怎样的增删改操作才能呢达到这个期望状态,也即Kubernetes的声明式资源管理。

命令式资源对象管理

命令式管理类就是直接通过命令执行增删改的操作,除了删除资源外,下面的命令能用apply代替,kubernetes也建议尽量使用apply命令。

创建资源

  1. kubectl create deployment my-dep --image=busybox # 创建一个deplpyme
  2. kubectl expose rc nginx --port=80 --target-port=8000 # 创建一个svc,暴露 nginx 这个rc复制代码

更新资源

  1. kubectl scale --replicas=3 -f foo.yaml # 将foo.yaml中描述的对象扩展为3个
  2. kubectl annotate pods foo description='my frontend' # 增加description='my frontend'备注,已有保留不覆盖
  3. kubectl label --overwrite pods foo status=unhealthy # 增加status=unhealthy 标签,已有则覆盖复制代码

删除资源

  1. kubectl delete -f xxx.yaml # 删除一个配置文件对应的资源对象
  2. kubectl delete pod,service baz foo # 删除名字为baz或foo的pod和service
  3. kubectl delete pods,services -l name=myLabel # -l 参数可以删除包含指定label的资源对象
  4. kubectl delete pod foo --grace-period=0 --force # 强制删除一个pod,在各种原因pod一直terminate不掉的时候很有用复制代码

查看资源状态

get

最常用的查看命令,显示一个或多个资源的详细信息

  1. # Usage:
  2. kubectl get
  3. [(-o|--output=)](TYPE[.VERSION][.GROUP] [NAME | -l label] | TYPE[.VERSION][.GROUP]/NAME ...) [flags]
  4. [options]
  5. # Examples:
  6. kubectl get services # 列出当前NS中所有service资源
  7. kubectl get pods --all-namespaces # 列出集群所有NS中所有的Pod
  8. kubectl get pods -o wide # -o wide也比较常用,可以显示更多资源信息,比如pod的IP等
  9. kubectl get deployment my-dep # 可以直接指定资源名查看
  10. kubectl get deployment my-dep --watch # --watch 参数可以监控资源的状态,在状态变换时输出。在跟踪服务部署情况时很有用
  11. kubectl get pod my-pod -o yaml # 查看yaml格式的资源配置,这里包括资实际的status,可以用--export排除
  12. kubectl get pod my-pod -l app=nginx # 查看所有带有标签app: nginx的pod复制代码

kubectl 可用JSONPATH来过滤字段,JSON Path的语法可参考 这里

  1. kubectl get pods --selector=app=cassandra rc -o jsonpath='{.items[*].metadata.labels.version}' # 获取所有具有 app=cassandra 的 pod 中的 version 标签复制代码

describe

describe命令同样用于查看资源信息,但相比与get只输出资源本身的信息,describe聚合了相关资源的信息并输出。比如,在describe node信息时,同时会输出该node下的pod的资源利用情况。所以describe命令在排错和调试时非常有用。

  1. # Usage:
  2. kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME) [options]
  3. # Examples:
  4. kubectl describe nodes my-node # 查看节点my-node的详细信息
  5. kubectl describe pods my-pod # 查看pod my-pod的详细信息复制代码

容器管理

虽然逻辑上,Kubernetes的最小管理单位是Pod,但是实际上还是免不了与容器直接交互,特别是对于多容器的Pod,任意容器有问题,都会导致Pod不可用。

日志查看

  1. # Usage:
  2. kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER] [options]
  3. # Examples:
  4. kubectl logs my-pod
  5. # 输出一个单容器pod my-pod的日志到标准输出
  6. kubectl logs nginx-78f5d695bd-czm8z -c nginx
  7. # 输出多容器pod中的某个nginx容器的日志
  8. kubectl logs -l app=nginx
  9. # 输出所有包含app-nginx标签的pod日志
  10. kubectl logs -f my-pod
  11. # 加上-f参数跟踪日志,类似tail -f
  12. kubectl logs my-pod -p
  13. # 输出该pod的上一个退出的容器实例日志。在pod容器异常退出时很有用
  14. kubectl logs my-pod --since-time=2018-11-01T15:00:00Z
  15. # 指定时间戳输出日志
  16. kubectl logs my-pod --since=1h
  17. # 指定时间段输出日志,单位s/m/h复制代码

执行命令

命令作用和参数基本与docker exec一致

  1. # Usage:
  2. kubectl exec POD [-c CONTAINER] -- COMMAND [args...] [options]
  3. # Examples:
  4. kubectl exec my-pod ls # 对my-pod执行ls命令
  5. kubectl exec -t -i nginx-78f5d695bd-czm8z bash # 进入pod的shell,并打开伪终端和标准输入复制代码

文件传输

在排错和测试服务的时候,时不时需要和容器互相交互文件,比如传输容器内存的dump到宿主机,或从宿主机临时拷贝个新配置文件做调试,这时就可以用*kubectl cp命令。要注意的是,cp命令需要容器里已安装有tar程序

  1. # Usage:
  2. kubectl cp <file-spec-src> <file-spec-dest> [options]
  3. # Examples:
  4. kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir # 拷贝宿主机本地文件夹到pod
  5. kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar # 指定namespace的拷贝pod文件到宿主机本地目录
  6. kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container> # 对于多容器pod,用-c指定容器名复制代码

集群管理

除了和具体的资源打交道,在对集群进行维护时,也经常需要查看集群信息和对节点进行管理,集群管理有以下这些常用的命令:

集群信息查看

  1. kubectl cluster-info # 查看master和集群服务的地址
  2. kubectl cluster-info dump # 查看集群详细日志
  3. kubectl version # 查看Kubernetes集群和客户端版本复制代码

节点管理

在集群节点出问题时,可能希望把一个节点不再被调度pod,或把节点目前的pod都驱逐出去

  1. kubectl cordon my-node
  2. # 标记 my-node 为 unschedulable,禁止pod被调度过来。注意这时现有的pod还会继续运行,不会被驱逐。
  3. kubectl uncordon my-node
  4. # 与cordon相反,标记 my-node 为 允许调度。
  5. kubectl drain my-node
  6. # drain字面意思为排水,实际就是把my-node的pod平滑切换到其他node,同时标记pod为unschedulable,也就是包含了cordon命令。
  7. # 但是直接使用命令一般不会成功,建议在要维护节点时,加上以下参数:
  8. kubectl drain my-node --ignore-daemonsets --force --delete-local-data
  9. # --ignore-daemonsets 忽略daemonset部署的pod
  10. # --force 直接删除不由workload对象(Deployment、Job等)管理的pod
  11. # --delete-local-data 直接删除挂载有本地目录(empty-dir方式)的pod
  12. 复制代码

k8s中Pod重启方法

有最新的 yaml 文件

kubectl replace --force -f xxxx.yaml

没有 yaml 文件,但是使用的是 Deployment 对象。

kubectl scale deployment esb-admin --replicas=0 -n {namespace}

kubectl scale deployment esb-admin --replicas=1 -n {namespace}

由于 Deployment 对象并不是直接操控的 Pod 对象,而是操控的 ReplicaSet 对象,而 ReplicaSet 对象就是由副本的数目的定义和Pod 模板组成的。所以这条命令分别是将ReplicaSet 的数量 scale 到 0,然后又 scale 到 1,那么 Pod 也就重启了。

Kubernetes,kubectl常用命令详解的更多相关文章

  1. hbase shell基础和常用命令详解(转)

    HBase shell的基本用法 hbase提供了一个shell的终端给用户交互.使用命令hbase shell进入命令界面.通过执行 help可以看到命令的帮助信息. 以网上的一个学生成绩表的例子来 ...

  2. samtools常用命令详解(转)

    转自:samtools常用命令详解 samtools的说明文档:http://samtools.sourceforge.net/samtools.shtml samtools是一个用于操作sam和ba ...

  3. cisco常用命令详解

    cisco常用命令详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用命令用法展示 1.命令行模式的来回切换 yinzhengjie>enable #从用户模式切换到 ...

  4. H3C常用命令详解

    H3C常用命令详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1.关闭后台日志输出 <yinzhengjie>sys [yinzhengjie]undo info- ...

  5. hbase shell基础和常用命令详解

    HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服 ...

  6. Tmux 的常用命令详解

    Tmux 的常用命令详解  常用命令: tmux #开启tmux tmux ls #显示已有tmux列表(C-b s) tmux attach-session -t 数字 #选择tmux C-b c ...

  7. Hexo系列(三) 常用命令详解

    Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...

  8. 【转载】windbg 常用命令详解

    windbg 常用命令详解 https://blog.csdn.net/chenyujing1234/article/details/7743460 vertarget 显示当前进程的大致信息 lmv ...

  9. DOS常用命令详解

    DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘 edit ...

随机推荐

  1. Vue SSR in Action

    Vue SSR in Action https://ssr.vuejs.org/ https://ssr.vuejs.org/api/ https://ssr.vuejs.org/guide/data ...

  2. 华盛顿金融等多家媒体报道VAST超高价值!

    近日,华盛顿金融时报联合洛杉矶商业报等多家媒体就即将推出的VAST进行了专题报道. 华盛顿金融时报专栏记者福吉瑞斯问到,之前有报道称NGK官方将全力支持算力市场,那么现在官方有什么计划可以透露一下吗? ...

  3. JUnit5学习之四:按条件执行

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. vue版本一直是2.9.6版本,卸载也卸载不掉,更新也更新不了

    原文链接:https://blog.csdn.net/zlzbt/article/details/110136755 主要是找到本地文件 E:\StudyFile\VueStudy λ where v ...

  5. JS输出为[object object]

    问题描述:在控制台打印时应输出对象,但是却输出[object object] 解决办法:先将数据转换为json格式,然后再转换为json对象 JSON.parse(JSON.stringify(use ...

  6. RocketMQ基础概念剖析,并分析一下Producer的底层源码

    由于篇幅原因,本次的源码分析只限于Producer侧的发送消息的核心逻辑,我会通过流程图.代码注释.文字讲解的方式来对源码进行解释,后续应该会专门开几篇文章来做源码分析. 这篇博客聊聊关于Rocket ...

  7. ubuntu系统共享桌面的使用和配置

    内容转载自我的博客 目录 1. ubuntu共享桌面 2. 局域网登录远程桌面 2.1 ubuntu使用remmina登录远程桌面 2.2 在windows登录远程桌面 2.3 Android使用RD ...

  8. 后端程序员之路 14、NumPy

    NumPy - NumPyhttp://www.numpy.org/ NumPy-快速处理数据 - 用Python做科学计算http://old.sebug.net/paper/books/scipy ...

  9. 数据结构-PHP 线段树的实现

    转: 数据结构-PHP 线段树的实现 1.线段树介绍 线段树是基于区间的统计查询,线段树是一种 二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.使用线段树可以快速的查 ...

  10. 如何使用python爬取网页动态数据

    我们在使用python爬取网页数据的时候,会遇到页面的数据是通过js脚本动态加载的情况,这时候我们就得模拟接口请求信息,根据接口返回结果来获取我们想要的数据. 以某电影网站为例:我们要获取到电影名称以 ...