kubectl简介

kubectl是操作k8s的命令行工具,能连接到apiserver上实现k8s中各种资源的增删改查

kubectl命令

kubectl  --help  

#查看kubectl的帮助命令,有哪些参数,常用的如下:

1)get


列举资源信息,如pod,service,deployment等kubectl  get pods kubectl  get deploymentkubectl  get service

2)describe

列举资源的详细信息

3)logs

查看pod输出的日志信息

4)edit

编辑服务器上定义的资源

5)delete

删除指定的资源

6)exec

可以交互式的登录到pod中的容器

7)apply

对资源做配置

8)explain

显示资源文档信息,可以查看某个资源的具体用法

9)run

运行一个pod实例如:kubectl  run nginx --image=nginx   #可以创建一个nginx应用,实际创建pod应用都是通过编写资源清单文件进行创建

kubernetes中的资源对象pod

(1)什么是pod?

pod翻译成中文是豌豆荚的意思,它是kubernetes中的最小调度单元,由一个或者多个容器组成,这些容器共享存储、网络和命名空间,pod中的容器总是被同时调度,它们有共同的运行环境,运行在同一个共享上下文中,一个pod相当于一个逻辑主机--比方说我们想要部署一个tomcat应用,如果不用容器,我们可能会部署到物理机,虚拟机或者云主机上,那么出现k8s之后,我们就可以把应用部署到pod中,所以pod充当的是一个逻辑主机的角色;

pod的共享上下文是一组linux命名空间,cgroup,以及其他可能隔离的方面;Pod中的容器共享IP地址和端口空间,并且可以通过localhost相互访问。他们还可以使用标准的进程间通信(如SystemV信号量或POSIX共享内存)相互通信,不同Pod中的容器具有不同的IP地址,无需特殊配置即可通过IPC进行通信;在一个Pod中的应用可以访问共享的存储卷,它被认为是Pod的一部分,可以被挂接至每一个应用文件系统;与独立的应用容器一样,Pod是一个临时的实体,它有着自己的生命周期。在Pod被创建时,会被指派一个唯一的ID,并被调度到Node中,直到Pod被终止或删除。如果Pod所在的Node宕机,给定的Pod(即通过UID定义)不会被重新调度。相反,它将被完全相同的Pod所替代。这所说的具有和Pod相关生命周期的情况,例如存储卷,是说和Pod存在的时间一样长。如果Pod被删除,即使完全相同的副本被创建,则相关存储卷等也会被删除,并会为Pod创建一个新的存储卷等。Pod本身就没有打算作为持久化的实体,在调度失败、Node失败和获取其它退出(缺少资源或者Node在维护)情况下,Pod都会被删除。一般来说,用户不应该直接创建Pod,即使创建单个的Pod也应该通过控制器创建。在集群范围内,控制器为Pod提供自愈能力,以及副本和部署管理。

(2)pod是如何管理多个容器的?

Pod中可以同时运行多个容器。同一个Pod中的容器会自动的分配到同一个 node上。同一个Pod中的容器共享资源、网络环境,它们总是被同时调度,在一个Pod中同时运行多个容器是一种比较高级的用法,只有当你的容器需要紧密配合协作的时候才考虑用这种模式。例如,你有一个容器作为web服务器运行,需要用到共享的volume,有另一个“sidecar”容器来从远端获取资源更新这些文件,如下图所示:

(3)和pod相关的api对象

kubectl  explain  pods 

可以看到和pod相关的api对象有哪些,也就是通过资源清单部署一个pod时需要哪些字段

apiVersion

apiVersion定义了此对象表示的版本化模式,服务器应将已识别的模式转换为最新的内部值,并可能拒绝无法识别的值。更多信息参考 https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

kind

Kind是表示此对象表示的REST资源的字符串值。服务器可以从客户端提交请求的端点推断出这一点

metadata

标准对象的元数据。更多信息参考https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata

spec

指定容器的所需行为。更多信息参考https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

status

最近观察到了pod的状态。更多信息:https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

(4)通过定义一个pod资源清单yaml创建pod

查看定义资源清单需要哪些字段

kubectl explain pods.apiVersion

kubectl explain pods.kind

kubectl explain pods.metadata

kubectl explain pods.spec

cat  pod.yaml


apiVersion: v1kind: Podmetadata:  name: web  namespace: default  labels:    web1: tomcat    web2: nginxspec:  containers:  - name: tomcat1    image: tomcat:latest  - name:  nginx    image:  nginx:latest

kubectl   apply  -f   pod.yaml    

#通过yaml文件创建一个pod应用

kubectl delete -f pod.yaml       

#yaml文件里定义的资源都会被删除

我们上面创建的pod是一个自主式pod,也就是通过pod创建一个应用程序,如果pod出现故障停掉,那么我们通过pod部署的应用也就会停掉,不安全,所以还有一种pod,还有一种通过控制器管理的pod,通过控制器创建pod,可以对pod的生命周期做管理,如定义pod的副本数,如果有一个pod意外停掉,那么会自动起来一个pod替代之前的pod。

(5)pod生命周期

同一个pod中可以运行多个容器,我们在创建一个pod时可以通过创建多个容器来实现pod的整个生命周期,一个pod创建包含如下过程

Init容器

Init容器就是做初始化工作的容器。可以有一个或多个,如果多个按照定义的顺序依次执行,只有所有的执行完后,主容器才启动。由于一个Pod里的存储卷是共享的,所以Init Container里产生的数据可以被主容器使用到,Init Container可以在多种K8S资源里被使用到,如Deployment、DaemonSet, StatefulSet、Job等,但都是在Pod启动时,在主容器启动前执行,做初始化工作。

主容器

1)容器钩子

初始化容器启动之后,开始启动主容器,在主容器启动之前有一个post start hook(容器启动后钩子)和pre stop hook(容器结束前钩子)

PostStart

该钩子在容器被创建后立刻触发,通知容器它已经被创建。如果该钩子对应的hook handler执行失败,则该容器会被杀死,并根据该容器的重启策略决定是否要重启该容器,这个钩子不需要传递任何参数

PreStop

该钩子在容器被删除前触发,其所对应的hook handler必须在删除该容器的请求发送给Docker daemon之前完成。在该钩子对应的hook handler完成后不论执行的结果如何,Docker daemon会发送一个SGTERN信号量给Docker daemon来删除该容器,这个钩子不需要传递任何参数

2)容器探针

livenessProbe(存活性探测)

指示容器是否正在运行。如果存活性探测失败,则kubelet会杀死容器,并且容器将受到其重启策略的影响。如果容器不提供存活探针,则默认状态为Success。

readinessProbe(就绪性探测)

指示容器是否准备好服务请求。如果就绪性探测失败,端点控制器将从与 Pod匹配的所有Service的端点中删除该Pod的IP地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success

整个图如下:

从上面可以看出,我们pod在从创建到结束之前,会一直处于某种状态之中,有一些状态:

(6)常见的pod状态

Pending

挂起,我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件,比如像我们刚才定义的pod-demo,一定要有node的节点标签是ssd,那么创建的pod才可以调度到这个标签的节点上,如果没有这个node标签的节点,那么就挂起了,已经创建了但是没有适合它运行的节点叫做挂起,调度没有完成

Running

运行状态

Failed

表示失败

Succeeded

表示成功了

Unknown

未知状态,所谓pod什么状态是apiserver和运行在pod节点的kubelet进行通信获取状态信息的,如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息了

(7)创建pod时大概经历哪些阶段

初始化容器-->主容器

(8)pod重启策略

Always:只要容器挂了就重启

OnFailure:只有容器状态为错误的时候才重启

Never:从不重启容器

默认重启策略就是Always


©著作权归作者所有:来自51CTO博客作者mob604756e5d059的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. SQL基础知识V2——索引
  2. Docker容器实战之数据持久化+网络模式+资源限制
  3. Kubernetes中部署MySQL高可用集群
  4. 小技巧 | 如何在SQL Server中快速创建测试数据?
  5. 3.14 为vCenter Server服务器添加外部DSN连接
  6. kubernetes中其他控制器之PodSecurityPolicy
  7. kubernetes常用控制器之StatefulSet
  8. 在kubernetes中用Glusterfs做持久化存储
  9. kubernetes中用NFS做后端存储支不支持PVC扩容?

随机推荐

  1. 获取Android设备上的详细的摄像头信息
  2. ListView setOnItemClickListener无效原
  3. Android笔记二十三.Android基于事件监听
  4. Bitmap and DrawPoint
  5. Android笔试(一)
  6. Android 学习笔记1:基本架构
  7. Android开发入门教程1-初试Android
  8. js判断浏览器所在的客户端类型
  9. Android解析服务器端发来的xml数据示例
  10. Android Adapter详解(1)