目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

Kubernetes

DevOps

  • CI:持续集成。Continuous Integration
  • CD:持续交付。Delivery
  • CD:持续部署。Deployment

DevOps、MicroServices、Container

  • 微服务可以充分利用容器技术本身的特性(分发、构建、部署)
  • 容器技术弥补了DevOps中的交付环节部署环节的裂缝,使得DevOps可以落地。DevOps又进一步推动了容器编排技术。
  • DevOps思想落地于容器编排技术之上。

IaaS、PaaS、SaaS

IAAS区别

器化部署存在的问题

  • 问题
    • 10个物理机发布100个容器,怎么快速发布和管理
    • 用户请求过来,怎么分配请求到100个容器里面
    • 突发海量请求过来,如何根据情况进行快速扩容
    • 应用发布上线出现问题,需要进行回滚历史版本,如何进行回滚
    • 某个容器故障了,如何快速启动新容器去替代

上面容器管理的问题称为容器编排 ,为了解决这些问题,产生了一些容器编排的软件

  • Docker Swarm :Docker自己的容器编排工具
  • Mesos :Apache的资源管控的工具,结合Marathon使用
  • Kubernetes :Google开源的的容器编排工具, 基于内部Borg系统的开源版本

Kubernetes简介

  • Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。

  • k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。

  • Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。

  • Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,简称 K8S

  • 官方文档https://kubernetes.io/zh-cn/docs/home/

  • 不说那么多废话了

    • K8S的本质是一组服务器集群,可以在对应服务器集群的每个节点上运行程序,来对节点中的容器进行管理。
    • 类似Master-Work方式,每个服务器上安装特定的k8s组件,就可以形成集群,然后部署对应的应用即可。
  • k8s常见的功能:

    • 服务发现和负载均衡
      • Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。
      • 如果进入容器的流量很大, Kubernetes 能够自动实现请求的负载均衡分配网络流量,从而使部署稳定
    • 存储编排
      • Kubernetes 允许自动挂载选择的存储系统,例如本地存储、云提供商存储等。
    • 自动部署和回滚
      • 可以用k8s自动化部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
      • 当版本发布错误,可以立刻回退到之前的版本
    • 自我修复
      • 如果某个容器宕机了,K8S 可以快速重新启动新的的容器,替换旧的容器
    • 密钥与配置管理
      • K8S允许存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥

K8S整体架构

  • K8S整体架构,也是Client-Server模型
    • 控制节点Master-Node,负责集群的管理
    • 工作节点Worker-Node,负责为集群提供运行环境

image-20220623003956893

  • kubernetes常见概念

    • Master

      • 指的是集群控制节点(相当于整个集群的指挥中心),在每个Kubernetes集群里都需要有一个Master来负责整个集群的管理和控制
    • Node

      • 除了master,k8s集群中的其他机器被称为Node节点,Node节点才是kubernetes集群中的工作负载节点
      • 每个Node节点都会被master分配一些工作负载(docker容器),node节点上的docker负责容器的运行
    • Pod

      • Pod是一组容器, 在K8S中,最小的单位是Pod, 一个Pod可以包含多个容器,但通常情况下我们在每个Pod中仅使用一个容器
      • 可以把Pod理解成豌豆荚, Pod内的每个容器是一颗颗豌豆
      • 分类
        • 自主创建:直接创建出来的Pod,这种pod删除后就没有了,也不会自动重建
        • 控制器创建:通过控制器创建的pod,这类Pod删除了之后还会自动重建

      image-20220623135636981

    • Pod Controller

      • 控制器是管理pod的中间层,只需要告诉Pod控制器,想要创建多少个什么样的Pod,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod在运行中出现故障,它会基于指定策略重新编排Pod
      • 通过它来实现对pod的管理,比如启动pod、停止pod、扩展pod的数量等等
      • 类型
        • ReplicaSet、Deployment、Horizontal Pod Autoscaler、DaemonSet等
    • Service

      • 在k8s里面,每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失
      • Service (服务)就是用来解决这个问题的, 对外服务的统一入口,用于为一组提供服务的Pod 抽象一个稳定的网络访问地址
      • 一个Service可以看作一组提供相同服务的Pod的对外访问接口,作用于哪些Pod是通过标签选择器来定义的
    • Label

      • K8S提供了一种机制来为Pod进行分类,那就是Label(标签),同一类pod会拥有相同的标签

      • Label的具体形式是key-value的标记对,可以在创建资源的时候设置,也可以在后期添加和修改

      • 给某个资源对象定义一个Label,就相当于给它打了一个标签,可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,K8S通过这种方式实现了类似SQL的对象查询机制

      • 应用场景

        • 未使用前,分散难管理,如果需要部署不同版本的应用到不同的环境中,难操作

        image-20220623114058392

        • 为Pod打上不同标签,使用Label组织的Pod,轻松管理

        image-20220623165837869

    • Label选择器

      • 对应的资源打上标签后,可以使用标签选择器过滤指定的标签
      • 标签选择器目前有两个
        • 基于等值关系(等于、不等于)
        • 基于集合关系(属于、不属于、存在)
    • NameSpace:

      • 可以在一个物理集群上运行多个虚拟集群,这种虚拟集群被称作 命名空间,用来隔离pod的运行环境
      • 同一个名字空间中的资源名称必须唯一,而不同名字空间之间则没有这个要求
      • NameSpace是不能嵌套的,每一个 Kubernetes 的资源都只能在一个NameSpace内
      • 名字空间是在多个用户之间划分集群资源的一种方法(通过资源配额)
      • 不必使用多个名字空间来分隔轻微不同的资源,例如同一软件的不同版本: 应该使用标签 来区分同一名字空间中的不同资源
      • Kubernetes 会创建四个初始NameSpace名称空间:
        • default 没有指明使用其它名字空间的对象所使用的默认名字空间
        • kube-system Kubernetes 系统创建对象所使用的名字空间
        • kube-public
        • kube-node-lease
  • 应用分类

    • 有状态应用
      • 不能简单的实现负载均衡的服务,有数据产生的服务,Redis、MySql、RabbitMQ等
      • 相关服务须通过一些较复杂的配置才能做到负载均衡。
      • 有状态的应用,建议直接在物理机部署,方便维护管理
    • 无状态应用
      • 没有对应业务数据的应用,可以简单的实现负载均衡,复制一个节点即可快速扩容,如SpringCloud中的业务服务
      • 无状态的应用适合部署在 Kubernetes(K8s)中或者容器中。

作者:Soulboy