一:pod核心原理

1:pod是什么
  • Pod 是一组容器和卷(目录和文件)的集合,同一个Pod里的容器共享同一个网络命名空间,可以使用 localhost 互相通信
  • pod是k8s管理的最小的单位
  • pod也是一个容器,这个容器装的是docker创建的容器
  • 容器本质是进程,K8S是操作系统,pod就是类似进程组
  • pod有自己的ip地址,主机名,pod相当于独立主机,可以封装一个容器或者多个容器
2:pod是用来干什么
  • 通常相关情况下,在服务部署得时候,使用pod来管理一组相关的服务(一个pod中要么部署一个服务,要么部署一组有关系的服务)
  • 一组相关的服务:在链式调用的调用链路上的服务,叫做一组相关的服务。
3:服务集群如何实现
  • 实现服务集群:只需要复制多个pod副本即可,这个是k8s的管理的先进之处,k8s如何继续扩容,只需要控制pod数量即可
4:pod底层网络,数据存储如何进行
  • 一个pod结构图如下:
  • pod结构图
  • 在单个pod中,可能有一组相关的服务,nginx,商品服务,商品数据库三个容器
  • 当一个微服务请求过来之后,会先经过nginx,再去访问服务,服务再去访问商品库,每个容器相当于单个沙箱环境,有单独的ip和port,这样的不同的容器之间的访问就相当于远程访问,这样的访问的效率就会降低。所以每个pod容器就有一个pause容器。
  • pause容器有两个作用:1:共享网络 2:共享存储。
  • pause容器相当于一个网卡,一个pod的不同容器之间的访问就相当于本地localhost访问。
  • 不同的容器也会将存储的东西都放到pause中,这样不同容器的访问存储就相当于访问本地文件,这样效率就会大幅提高

二:副本控制器-ReplicaSet

1:副本控制器的功能
  • 控制pod副本(服务集群)的数量,永远与预期设定的数量保持一致。
  • 例如 设置ReplicaSet = 3 ,就会创建三个pod,如果一个pod服务宕机,副本控制器会立马创建一个新的pod,永远保证副本数量为3,如下:
  • 副本控制器
2:ReplicaSet和ReplicationController区别
2.1:什么是ReplicationController
  • 在旧版本的K8S中,只有ReplicationController对象,主要确保pod按照指定的副本数量进行运行,如果有容器退出,就会自动创建新的pod来替代。异常多出来的容器也会自动回收,通过Replicationcontroller,K8S实现了集群的高可用性。
2.2:ReplicaSet和ReplicationController区别
  • ReplicaSet是k8s官网强烈建议推荐的。是ReplicationController的代替物,两者的用法基本相同,区别就是ReplicaSet支持复合式的标签选择器(Label-Selector)
2.3 Label-Selector(标签选择器)的作用
  • 上个图中我们看到一个副本控制器设置三个pod,如果前两个pod在一个机器中,另外一个pod在另一台机器中,ReplicaSet是如何通过标签选择器控制pod的数量,我们可以看下图
  • 标签选择器
  • 前两个pod属于server1,后一个pod属于server2,对于三个pod都打了同样的复合标签
selector:
    app = webService
    release = 1.0
  • 这样副本控制器ReplicaSet对于不同的服务器上的相同的pod我们都可以通过标签控制器进行控制
  • ReplicationController只能通过单标签对pod进行管理,所以尽量用ReplicaSet替代ReplicationSet来管理pod

三:资源部署对象-Deployment

1:什么是deployment
  • deployment是一个创建和更新副本应用(多个副本pod)的对象。
2:为何有deployment的存在
  • 1:在我们的集群服务中,如果一个pod挂掉,对应的服务也会挂掉,所以k8s提供了一个deployment对象用来监控这些实例,如果托管实例的节点关闭或被删除,则Deployment 控制器会将该实例替换为群集中另一个节点上的实例
  • 2:我们在平时业务开发中会经常有版本的迭代。如何保证我们一个创建一个新pod后而停用一个旧个pod,而我们的副本控制器ReplicaSet是不支持滚动更新,Deployment对象可以满足我们的的滚动更新操作
3:部署模型
  • 在我们整个的项目版本发布更新操作中,我们用到的一个K8S部署模型如下,Deploymet控制着ReplicaSet实现滚动更新,Replicaset控制着pod,如下图步骤 部署模型
  • 当我们从V1版本要更新到V2版本,首先要生产一个新的RS对象,发布一个pod后,就会替代一个旧的pod,新的pod由新的RS对象控制。
4:deployment和replicaset的区别
  • ReplicaSet的主要用途是被Deployment对象用于pod的创建,更新,删除,RS是Deployment的一部分,Deployment控制的是RS对象
  • Deployment在实例运行后,会持续监控rs和pod的数量和状态的变化。

四:有状态服务部署组件-StatefulSet

1:什么是StatefulSet
  • StatefulSet是为了部署有状态服务而设计的组件。
2: 无状态服务 & 有状态服务
  • 无状态服务:没有实时数据要存储,各个请求对于服务器来说统一无差别处理。我们现在的微服务和一些中间件服务(mq)之类的就属于无状态服务。如果把一个服务抽离出去,一段时间再加入机器网络,集群网络可以继续使用
  • 有状态服务:有实时的数据进行存储,用于处理业务请求。比如我们的数据库mysql,redis,有状态服务集群中,如果把一个服务抽离出去,一段时间再加入机器网络,集群网络无法使用
3:为什么使用StatefulSet
  • 如果我们容器部署有状态服务mysql 我们就会发现问题:
  • 1:容器是有生命周期的,一旦宕机,数据就会丢失。
  • 2:如果pod部署,pod也是有生命周期,数据也会丢失。
  • 所以k8s不能使用deployment部署模型来部署有状态服务。通常情况下,deployment被用来部署无状态服务,那么对于有状态服务的部署,使用statefulSet有状态服务部署。
4:StatefulSet部署模型



k8s deployment redis 容器设置密码_Deployment

StatefulSet部署模型

  • 通过模型,对于有数据存储的有状态的服务,我们会有个一个pvc文件系统来存储持久化的数据,如果pod重新建立,StatefulSet可以保证pod对应的持久化的数据的pvc文件系统的hostname不变,这样就可以保证有状态服务的部署。