zoukankan      html  css  js  c++  java
  • kubernetes基础

    发展历史
    Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S。

    K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久。

    K8S主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。

    2015年7月,Kubernetes v1.0正式发布,截止到2018年1月27日最新稳定版本是v1.9.2。Kubernetes目标是让部署容器化应用简单高效。

    官方网站:www.kubernetes.io

    主要功能
    数据卷
    Pod中容器之间共享数据,可以使用数据卷。

    应用程序健康检查
    容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性。

    复制应用程序实例
    控制器维护着Pod副本数量,保证一个Pod或一组同类的Pod数量始终可用。

    弹性伸缩
    根据设定的指标(CPU利用率)自动缩放Pod副本数。

    服务发现
    使用环境变量或DNS服务插件保证容器中程序发现Pod入口访问地址。

    负载均衡
    一组Pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部其他Pod可通过这个ClusterIP访问应用。

    滚动更新
    更新服务不中断,一次更新一个Pod,而不是同时删除整个服务。

    服务编排
    通过文件描述部署服务,使得应用程序部署变得更高效。

    资源监控
    Node节点组件集成cAdvisor资源收集工具,可通过Heapster汇总整个集群节点资源数据,然后存储到InfluxDB时序数据库,再由Grafana展示。

    提供认证和授权
    支持角色访问控制(RBAC)认证授权等策略。

    基本对象
    node
    K8s集群中的计算能力由Node提供,最初Node称为服务节点Minion,后来改名为Node。K8s集群中的Node也就等同于
    Mesos集群中的Slave节点,是所有Pod运行所在的工作主机,可以是物理机也可以是虚拟机。不论是物理机还是虚拟机,工作主机的统一特征是上面要运行kubelet管理节点上运行的容器。

    Pod
    Pod是最小部署单元,一个Pod有一个或多个容器组成,Pod中容器共享存储和网络,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。在同一台Docker主机上运行。

    K8s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(nodedaemon)和有状态应用型(stateful application);分别对应的小机器人控制器为Deployment、Job、DaemonSet和StatefulSet

    Service
    Service一个应用服务抽象,定义了Pod逻辑集合和访问这个Pod集合的策略。

    一个Pod只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP启动一个新的Pod,因此不能以确定的IP和端口号提供服务。

    Service代理Pod集合对外表现是为一个访问入口,分配一个集群IP地址,来自这个IP的请求将负载均衡转发后端Pod中的容器。

    Service通过Lable Selector选择一组Pod提供服务。

    Volume
    存储卷,共享Pod中容器使用的数据及持久化数据。K8s的存储卷的生命周期和作用范围是一个Pod。每个Pod中声明的存储卷由Pod中的所有容器共享。

    Namespace
    命名空间也称为虚拟集群。命名空间为K8s集群提供虚拟的隔离作用,K8s集群初始有两个命名空间,分别是默认命名空间default和系统命名空间kubesystem,除此以外,管理员可以创建新的命名空间满足需要。

    命名空间将对象逻辑上分配到不同Namespace,可以是不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。

    Lable
    标签用于区分对象(比如Pod、Service),键/值对存在;每个对象可以有多个标签,通过标签关联对象

    用户帐户(User Account)和服务帐户(Service Account)
    用户帐户为人提供账户标识,而服务账户为计算机进程和K8s集群中运行的Pod提供账户标识。用户帐户和服务帐户的一个区别是作用范围;用户帐户对应的是人的身份,人的身份与服务的namespace无关,所以用户账户是跨namespace的;而服务帐户对应的是一个运行中程序的身份,与特定namespace是相关的。

    基本对象的更高层次抽象
    ReplicaSet
    下一代Replication Controller。确保任何给定时间指定的Pod副本数量,并提供声明式更新等功能。

    RC与RS唯一区别就是lable selector支持不同,RS支持新的基于集合的标签,RC仅支持基于等式的标签。

    Deployment
    Deployment是一个更高层次的API对象,它管理ReplicaSet和Pod,并提供声明式更新等功能。

    官方建议使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,这就意味着可能永远不需要直接操作ReplicaSet对象。

    实际是创建一个新的RS,然后逐渐将新RS中副本数增加到理想状态,将旧RS中的副本数减小到0的复合操作;这样一个复合操作用一个RS是不太好描述的,所以用一个更通用的Deployment来描述。

    StatefulSet
    有状态服务集(StatefulSet)适合持久性的应用程序,有唯一的网络标识符(IP),持久存储,有序的部署、扩展、删除和滚动更新。

    StatefulSet中的每个Pod的名字都是事先确定的,不能更改。

    对于RC和RS中的Pod,一般不挂载存储或者挂载共享存储,保存的是所有Pod共享的状态,Pod像牲畜一样没有分别;对于StatefulSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续以它的状态提供服务。

    适合于StatefulSet的业务包括数据库服务MySQL和PostgreSQL,集群化管理服务Zookeeper、etcd等有状态服务

    DaemonSet
    后台支撑服务集(DaemonSet)确保所有(或一些)节点运行同一个Pod。当节点加入Kubernetes集群中,Pod会被调度到该节点上运行,当节点从集群中移除时,DaemonSet的Pod会被删除。删除DaemonSet会清理它所有创建的Pod。

    典型的后台支撑型服务包括,存储,日志和监控等在每个节点上支撑K8s集群运行的服务。

    Job
    Job是K8s用来控制批处理型任务的API对象,用于执行一次性任务,运行完成后Pod销毁,不再重新启动新容器。还可以任务定时运行。

    成功完成的标志根据不同的spec.completions策略而不同:单Pod型任务有一个Pod成功就标志完成;定数成功型任务保证有N个任务全部成功;工作队列型任务根据应用确认的全局成功而标志成功。

    RBAC
    相对于基于属性的访问控制(Attribute-based Access Control,ABAC),RBAC主要是引入了角色(Role)和角色绑定(RoleBinding)的抽象概念。在ABAC中,K8s集群中的访问策略只能跟用户直接关联;而在RBAC中,访问策略可以跟某个角色关联,具体的用户在跟一个或多个角色相关联。

    k8s集群架构图及组件功能
    架构图

     


    最上层是kubectl,用户通过这个工具来管理整个集群。用户通过kubectl来调用master上的kube api接口。

    在节点上主要跑kubelet、kube-proxy、docker组件。

    etcd用于保存集群的状态。

    基本组件及功能
    Master组件
    kube-apiserver
    Kubernetes API,集群的统一入口,各组件协调者,以HTTP API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。并提供认证、授权、访问控制、API 注册和发现等机制;

    kube-controller-manager
    负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

    kube-scheduler
    它监听apiserver,查询还未分配node的pod,然后根据调度算法为新创建的Pod选择一个Node节点。

    Node组件
    kubelet
    kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如负责 Volume(CVI)和网络(CNI)的管理、创建容器、下载secret、获取容器和节点状态等工作。

    kube-proxy
    负责为 Service 提供 cluster 内部的服务发现和负载均衡;

    docker或rocket/rkt
    负责镜像管理以及 Pod 和容器的真正运行(CRI);

    第三方服务
    etcd
    分布式键值存储系统。用于保持集群状态,比如Pod、Service等对象信息

    flannel
    提供跨主机的pod通信的功能。

    组件间通信
    apiserver 负责 etcd 存储的所有操作,且只有 apiserver 才直接操作 etcd 集群
    apiserver 对内(集群中的其他组件)和对外(用户)提供统一的 REST API,其他组件均通过 apiserver 进行通信

    controller manager、scheduler、kube-proxy 和 kubelet 等均通过 apiserver watch API 监测资源变化情况,并对资源作相应的操作

    所有需要更新资源状态的操作均通过 apiserver 的 REST API 进行

    apiserver 也会直接调用 kubelet API(如 logs, exec, attach 等),默认不校验 kubelet 证书,但可以通过 –kubeletcertificate-
    authority 开启(而 GKE 通过 SSH 隧道保护它们之间的通信)
    用户创建一个pod的过程


    用户通过 REST API 创建一个 Pod
    apiserver 将其写入 etcd
    scheduluer 检测到未绑定 Node 的 Pod,开始调度并更新 Pod 的 Node 绑定
    kubelet 检测到有新的 Pod 调度过来,通过 docker 运行该 Pod
    kubelet 通过 docker 取到 Pod 状态,并更新到 apiserver 中
    技术核心和API对象
    API对象
    API对象是K8s集群中的管理操作单元。K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作。例如副本集Replica Set对应的API对象是RS。

    每个API对象都有3大类属性:元数据metadata、规范spec和状态status。

    K8s中所有的配置都是通过API对象的spec去设置的,也就是用户通过配置系统的理想状态来改变系统

    元数据metadata
    元数据是用来标识API对象的,每个对象都至少有3个元数据:namespace,name和uid;除此以外还有各种各样的标签labels用来标识和匹配不同的对象

    例如用户可以用标签env来标识区分不同的服务部署环境,分别用env=dev、env=testing、env=production来标识开发、测试、生产的不同服务

    规范spec
    规范描述了用户期望K8s集群中的分布式系统达到的理想状态(Desired State)

    例如用户可以通过复制控制器Replication Controller设置期望的Pod副本数为3

    状态status
    status描述了系统实际当前达到的状态(Status)

    例如系统当前实际的Pod副本数为2;那么复制控制器当前的程序逻辑就是自动启动新的Pod,争取达到副本数为3。

  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/sea520/p/11388370.html
Copyright © 2011-2022 走看看