Kubernetes在企业中应用场景

  1. 自动化运维平台
    • 中小型企业,使用k8s构建一套自动化运维平台(降本增效)
    • 大型互联网公司更要使用
  2. 充分利用服务器资源
  3. 服务无缝迁移

服务部署模式变迁以及服务部署模式变化的问题思考

  1. 服务部署模式是如何变迁的?
    • 物理机部署(就是直接把服务部署在物理机上面)
    • 虚拟化方式(就是把服务部署在虚拟机中,虚拟机分割物理资源—-充分利用服务器资源)
    • 容器化方式进行部署
  2. 服务部署模式变化,带来哪些问题?
    • 前提条件:SOA架构,微服务架构模式下,服务拆分越来越多,部署维护的服务越来越多,如此多的服务如何去管理?
      • 虚拟机服务部署方式(openstack)
      • 容器化部署模式(k8s —- 管理容器)
    • 面临问题:SOA架构,微服务架构模式下,服务拆分越来越多,部署维护的服务越来越多,面临什么样的问题?
      • 如何对服务进行横向扩展
      • 容器宕机怎么办?数据怎么恢复
      • 重新发布新的版本如何更新,更新后不影响业务
      • 如何监控容器
      • 容器如何调度创建
      • 数据安全性如何保证
    • 解决方案:使用k8s管理容器,以上的问题,k8s都可以完美解决

云架构 & 云原生

  1. 云和k8s是什么关系?
    • 就是使用容器构建的一套服务集群网络,云由很多的大量容器构造
    • k8s就是用来管理云中的容器
  2. 云架构
    • iaas:基础设施即服务
      • 用户:租用(购买|分配权限)云主机,用户就不需要考虑网络,DNS,存储,硬件环境方面的问题。
      • 运营商:提供网络,存储,DNS,这样的服务就叫做基础设施服务
    • paas:平台即服务
      • 提供MYSQL\ES\MQ\……
    • saas:软件即服务
      • 比如钉钉,财务管理软件
    • serverless:无服务(不需要服务器)
      • 站在用户的角度考虑问题,用户只需要使用云服务器即可,在云服务器所有的基础环境,软件环境都不需要用户自己安装
      • 未来服务开发都是serverless,企业都构建了自己的私有云环境,或者是使用公有云环境
  3. 云原生
    • 就是为了让应用程序(项目,服务软件)都运行在云上的解决方案,这样的方案就叫做云原生
    • 特点:
      1. 容器化:所有的服务都必须部署在容器中
      2. 微服务:web服务架构是微服务架构
      3. CI/CD:可持续交付和可持续部署
      4. DevOps:开发和运维密不可分

kubernetes架构原理

  1. kubernetes是google公司使用go语言开发,前身是borg系统
  2. kubernetes架构
    • master 节点
      • api server:k8s网关,所有的指令请求都必须经过api server
      • scheduler:调度器,使用调度算法,把请求的资源调度到某一个node节点
      • controller:控制器,维护k8s资源对象
      • etcd:存储资源对象
    • node 节点
      • docker:运行容器的基础环境,容器引擎
      • kubelet:在每一个node节点都存在一份,在node节点上的资源操作指令由kubelet来执行,负责本地pod的维护
      • kube-proxy:代理服务,负载均衡。在多个pod之间来做负载均衡。
      • fluentd:日志收集服务
      • pod:是k8s管理的基本单元(最小单元),pod内部是容器。k8s不直接管理容器,而是管理pod。pod内部可以有一个容器,或者是多个容器。
    • 关系:一个master对应一群node节点

kubernetes核心组件原理

pod核心原理

  1. pod是什么?
    pod也是一个容器(这个容器装的是docker创建的容器,pod是一个用来封装容器的容器),pod是一个虚拟化分组(pod有自己的IP地址,主机名),相当于一台独立沙箱环境。pod相当于独立主机,可以封装一个或者多个容器。
  2. pod用来干什么?
    通常情况下,在服务部署时候,使用pod来管理一组相关的服务。(一个pod中要么部署一个服务,要么部署一组有关系的服务)
    一组相关的服务:在链式调用的调用链路上的服务,叫做一组相关的服务。
  3. web服务集群如何实现?

    只需要复制多份pod的副本即可,这也是k8s管理的先进之处,k8s如果进行扩容或者缩容,只需控制pod的数量即可。
  4. pod底层网络,数据存储是如何进行的?
    1. pod内部容器创建之前,必须先创建pause容器
    2. 服务容器之间访问使用localhost访问,相当于访问本地服务一样,性能非常高。

ReplicaSet副本控制器

副本控制器有2种:ReplicaSetReplicationController

  1. 副本控制器作用:
    控制pod副本(服务集群)的数量,永远与预期设定的数量保持一致。例如:当副本设置为3的时候,副本控制器将会永远保证副本数量为3,当有pod服务宕机的时候,副本控制器会立即重新创建一个新的pod,永远保证副本数量为3。
  2. ReplicaSetReplicationController有什么区别?
    • ReplicaSet可以单选复合选择
    • ReplicationController只能单选
      副本控制器通过标签选择器维护它关联的pod副本

      在新版的k8s中,建议使用ReplicaSet作为副本控制器,ReplicationController不再使用了。

Deployment部署对象

  • 服务部署结构模型
  • 滚动更新

ReplicaSet副本控制器控制pod副本的数量。但是:项目的需求在不断迭代,不断的更新,项目版本将会不停的发版,版本的变化,如何做到服务更新?

ReplicaSet不支持滚动更新,Deployment对象支持滚动更新。通常和ReplicaSet一起使用。

StatefulSet有状态服务部署对象

为了解决有状态服务使用容器化部署的问题

  • 部署模型
  • 有状态服务
  1. 思考:MYSQL使用容器化部署,存在什么样的问题?
    • 容器是有生命周期的,一旦宕机,数据丢失
    • pod部署,pod有生命周期,数据丢失
  2. 总结:
    k8s来说,不能使用deployment部署有状态服务。通常情况下,deployment被用来部署无状态服务。那么对于有状态服务的部署,使用StatefulSet进行有状态服务的部署。
  3. 状态服务的解释:
    • 有状态服务:
      • 实时的数据需要存储
      • 有状态服务集群中,把某一个服务抽离出去,一段时间后再加入集群网络,集群网络将无法使用
    • 无状态服务:
      • 没有实时的数据需要存储
      • 无状态服务集群中,把某一个服务抽离出去,一段时间后再加入集群网络,对集群服务没有任何影响
  4. StatefulSet部署模型:

    StatefulSet保证pod重新建立后,hostname不会发生变化,pod就可以通过hostname来关联数据。

kubernetes服务的注册与发现

pod核心结构

  1. pod相当于一个容器,pod有独立ip地址,也有自己的hostname,利用namespace进行资源隔离,独立沙箱环境
  2. pod内部封装的是容器,可以封装一个,或者多个容器(通常是一组相关的容器)
  3. pod内部容器之间采用localhost访问。
  4. pod如何对外提供服务访问:
    • pod是虚拟的资源对象(进程),没有对应实体(物理机,物理网卡)与之对应,无法直接对外提供服务访问。
    • pod如果要对外提供服务,必须绑定物理机端口(在物理机上开启端口,让这个端口和pod的端口进行映射),这样可以通过物理机进行数据包的转发。

Service实现负载均衡

  1. 什么是service资源对象?
    • pod IP:pod的ip地址
    • node IP:物理机的ip地址
    • cluster IP:虚拟ip,是由k8s抽象出来的service对象,这个service对象就是一个vip(虚拟ip)的资源对象
  2. service vip转发原理
    1. service和pod都是一个进程,service也不能对外提供服务
    2. sercie和pod之间可以直接进行通信,它们的通信属于局域网通信
    3. 把请求交给service后,service使用(iptables,ipvs)做数据包的分发
    4. service和一组pod副本通过标签选择器进行关联
    5. 通过kube-proxy监听pod,一旦pod宕机或者更新,kube-proxy会通知service更新pod的映射关系