4 容器编排与Kubernetes作业管理

1、为什么需要Pod

  • 容器,就是未来云计算系统中的进程,容器镜像就是这个系统中的.exe安装包,k8s就是操作系统
  • 在真正的操作系统中,进程是以进程组的方式存在的,k8s就是将进程组的概念映射到了容器技术中
  • 如果没有组的概念,这样的运维关系会非常难以处理
  • pod是k8s里的原子调度单位,k8s的调度器,是统一按照pod而非容器的资源需求进行计算的
  • pod的实现原理:pod只是一个逻辑概念,pod是一组共享了某些资源的容器,pod里的所有容器,共享的是同一个network namespace,并且可以声明共享同一个volume。pod的实现需要一个中间容器,叫做infra容器,在pod中会第一个被创建。如下所示:

在这里插入图片描述

  • pod只有一个ip地址
  • 对于同一个Pod里面的所有用户容器来说,它们的进出流量,也可以认为都是通过infra容器完成的将来如果要为k8s开发一个网络插件时,应该重点考虑如何配置这个pod的network namspace。
  • pod容器的设计思想,就是希望当用户想在一个容器里跑多个功能并不相关的应用时,需要考虑是不是应该被描述成一个pod里的多个容器。
  • pod实际上是在扮演传统基础设施里虚拟机的角色,而容器,则是这个虚拟机里运行的用户程序。

2、pod的对象
因为可以将pod理解为虚拟机的角色,所以凡是调度、网络、存储,以及安全相关的属性,基本上是pod级别的。

  • NodeSelector:供用户将pod与Node进行绑定的字段
    在这里插入图片描述
  • NodeName:当pod这个字段被赋值,表示已经被调度器调度了。
  • HostAliases:定义了pod的hosts文件里的内容
  • Containers:容器
  • ImagePullPolicy:镜像拉取策略
  • Lifecycle:容器状态发生变化的时候触发什么操作

3、pod的生命周期

  • pending: pod的yaml文件已经提交给k8s
  • running: pod已经调度成功,跟一个具体的节点绑定
  • succeeded:pod里的所有容器都正常运行完毕,已经退出
  • failed:不正常方式退出
  • unknown: 异常了

4、projected volumn:
在k8s中,有几种特殊的volumn,存在的意义不是为了存放容器里的数据,也不是用来进行容器和主机之间的数据交换,这些特殊volumn的作用,是为容器提供预先定义好的数据。(配置文件里面的数据?类似)常见的有四种

  • Secret
  • ConfigMap
  • Downward API
  • ServiceAccountToken

5、Secret
secret的作用,是帮你把pod想要访问的加密数据保存到etcd中,然后就可以通过pod的容器里挂载volume的方式,访问者写secret中的数据了:如下所示
这里连接数据库的时候用了名为user和pass的Secret对象
在这里插入图片描述
那么如果将数据库的用户名和密码以secret的方式交给k8s呢?方法如下所示:
在这里插入图片描述
如果想要查看k8s中的secret,可以直接执行命令:kubectl get secrets

6、ConfigMap
和Secret的区别在于,保存的是不需要加密的、应用所需的配置信息,用法和secret基本相同

7、Downward API:
让pod里的容器能够直接获取到这个pod api对象本身的信息,配置文件如下所示:
在这里插入图片描述
在这里插入图片描述
这里声明了要保留pod的metadata.labels信息给容器。这样当前pod的labels字段的值,会被8s自动挂载成为容器里的/etc/podinfo/labels文件。 从而容器就可以根据需要从这里去获取了。

8、Service Account
Service Account对象的作用,就是K8s系统内置的一种服务账户,是k8s进行权限分配的对象。比如service account A只被运行对k8s api进行get操作,而service account b,则可以有所有查找。
这些信息保存到一个特殊的Secret中,叫做ServiceAccountToken

k8s为了方便,已经提供了一个默认的服务账号,default service account
在这里插入图片描述

9、pod的容器健康检查和恢复机制

  • 可以为Pod里的容器定义一个健康检查探针,根据这个来返回容器的状态。
  • pod的恢复机制,叫restartPolicy,pod的恢复过程,永远都是发生在当前节点上。除非node字段被修改。

10、k8s中的控制器
k8s中有很多控制器,都以独有的方式负责编排,这些控制器都遵循K8s项目中的一个通用编排模式,即控制循环。
比如有一种待编排的对象X,有一个对应的控制器,那么描述控制循环的代码如下所示:
在这里插入图片描述

11、常见的控制器

  • deployment: 无状态的应用编排
  • statefulSet:有状态的应用编排,主要作用,就是使用pod模板创建pod的时候,对它们进行编号,并且按照编号顺序逐一完成创建工作,而当statefulSet的控制循环发现pod的实际状态和期望状态不一致,需要新建或者删除pod进行调谐的时候,会严格按照这些pod编号的顺序,逐一完成这些操作。
  • DaemonSet: 这个pod运行在k8s集群的每个节点上,且只能有一个实例
  • job与cronJob

12、Headless Service
service 是k8s项目中用来将一组pod暴露给外界访问的一种机制,那么service又是如何被访问呢?

  1. service的VIP方式(虚拟IP) 将请求转发到该service代理的某个pod上
  2. service的DNS方式,比如只需要访问my-svc.my-namespace.svc.cluster.local这条dns记录,就可以访问到名为my-svc的service锁代理的某个pod。这种情况下也还有两种情况,第一种是normal service,此时访问这个dns的时候解析到的就是my-svc这样service的VIP,后面的流程就和vip方式一致了。而第二种方式则是headless service,这种方式下,访问的dns解析到的,直接就是my-svc代理的某一个pod的ip地址,可以看到,这里的区别在于,headless service不需要分配一个vip,而是可以直接以dns记录的方式解析出被代理的pod的IP地址。

13、PVC(Persistent Volumn Claim)
在一个pod声明volumn,只要在pod里加上spec.volumns字段即可,但是如果你并不知道有哪些volumn类型可以用,要怎么办?
而且还有一些安全方面的考虑,比如Pod中需要使用到volumn,但是这是远程的存储服务器,暴露给开发人员的话存在不安全星,因为这些是运维该管理的事情。因此有了pvc,使用步骤如下所示:

PVC其实就是一种特殊的volumn。

  1. 定义一个pvc,声明想要的volumn属性
    在这里插入图片描述

  2. 在应用的pod中,声明使用这个pvc
    在这里插入图片描述

  3. 运维人员创建pv对象
    在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值