精选列表

搜索[K8s],共3897篇文章
优秀的个人博客,低调大师

容器平台选型的十大模式:Docker、DC/OS、K8S 谁与当先?【转】

网易企业服务2017-10-13 无论是在社区,还是在同客户交流的过程中,总会被问到到底什么时候该用 Docker?什么时候用虚拟机?如果使用容器,应该使用哪个容器平台? 显而易见,我不会直接给大家一个答案,而是希望从技术角度进行分析具体的场景。例如客户是大公司还是小公司,将部署小集群还是大集群,倾向于私有云还是公有云,已经采购了 IaaS 还是没有 IaaS,IT 运维能力强还是弱,是否需要物理机、虚拟机、容器的混合部署,是一般的并发系统还是高并发,这里面所应该做的技术选型都不一样。举个例子,如果你是一个初创型的主营业务非 IT 的小公司,自然不应该花大力气在数据中心里面自己搭建一套大规模、高并发、高性能的容器平台。 接下来,首先,我们来谈下什么情况下应该使用 Docker 的问题。 如上图所示,左面是我们经常挂在嘴边的所谓容器的优势,但是虚拟机都能一一怼回去。 如果部署的是一个传统的应用,这个应用启动速度慢,进程数量少,基本不更新,那么虚拟机完全能够满足需求。 应用启动慢:应用启动 15 分钟,容器本身秒级,虚拟机很多平台能优化到十几秒,两者几乎看不出差别; 内存占用大:动不动 32G,64G 内存,一台机器跑不了几个; 基本不更新:半年更新一次,虚拟机镜像照样能够升级和回滚; 应用有状态:停机会丢数据,如果不知道丢了什么,就算秒级启动也没有用,照样恢复不了,而且还有可能因为丢数据,在没有修复的情况下,盲目重启带来数据混乱; 进程数量少:两三个进程相互配置一下,不用服务发现,配置不麻烦 如果是一个传统应用,根本没有必要花费精力去容器化,因为白花了力气,享受不到好处。 那么什么情况下,才应该考虑做一些改变呢: 传统业务突然被互联网业务冲击了,应用老是变,三天两头要更新,而且流量增大了,原来支付系统是取钱刷卡的,现在要互联网支付了,流量扩大了 N 倍。 这种情况下就只能:拆。 拆开了,每个子模块独自变化,相互影响变少。 拆开了,原来一个进程扛流量,现在多个进程一起扛。 这被称为微服务。 微服务场景下,进程多,更新快,于是出现 100 个进程,每天一个镜像。 容器乐了,每个容器镜像小,没什么问题,虚拟机哭了,因为虚拟机每个镜像太大了。 所以微服务场景下,可以开始考虑用容器了。 这时虚拟机又怒了,我不用容器了,微服务拆分之后,用 Ansible 自动部署是一样的。 这从技术角度来讲没有任何问题,问题是从组织角度出现的。一般的公司,开发会比运维多得多,开发写完代码就不用管了,环境的部署完全是运维负责,运维为了自动化,写 Ansible 脚本来解决问题。 然而这么多进程,又拆又合并的,更新这么快,配置总是变,Ansible 脚本也要常改,每天都上线,不得累死运维。 所以在如此大的工作量情况下,运维很容易出错,哪怕通过自动化脚本。这时,容器就可以作为一个非常好的工具运用起来。 除了容器从技术角度,能够使得大部分的内部配置可以放在镜像里面之外,更重要的是从流程角度,将环境配置这件事情,往前推了,推到了开发这里,要求开发完毕之后,就需要考虑环境部署的问题,而不能当甩手掌柜。 这样做的好处就是,虽然进程多,配置变化多,更新频繁,但是对于某个模块的开发团队来讲,这个量是很小的,因为 5-10 个人专门维护这个模块的配置和更新,不容易出错。 如果这些工作量全交给少数的运维团队,不但信息传递会使得环境配置不一致,部署量也会大非常多。 容器是一个非常好的工具,就是让每个开发仅仅多做 5% 的工作,就能够节约运维 200% 的工作量,并且不容易出错。 然而原来运维该做的事情开发做了,开发的老大愿意么?开发的老大会投诉运维的老大么? 这就不是技术问题了,其实这就是 DevOps,DevOps 不是不区分开发和运维,而是公司从组织到流程能够打通,看如何合作,边界如何划分,对系统的稳定性更有好处。 所以微服务、DevOps、容器是相辅相成,不可分割的。不是微服务,根本不需要容器,虚拟机就能搞定,不需要 DevOps,一年部署一次,开发和运维沟通再慢都能搞定。 所以,容器的本质是基于镜像的跨环境迁移。 镜像是容器的根本性发明,是封装和运行的标准,其它什么 namespace,cgroup,早就有了,这是技术方面。 在流程方面,镜像是 DevOps 的良好工具。 容器是为了跨环境迁移的,第一种迁移的场景是开发、测试、生产环境之间的迁移。如果不需要迁移,或者迁移不频繁,虚拟机镜像也行,但总是要迁移,带着几百 G 的虚拟机镜像,太大了。 第二种迁移的场景是跨云迁移,跨公有云,跨 Region,跨两个 OpenStack 的虚拟机迁移都是非常麻烦,甚至不可能的,因为公有云不提供虚拟机镜像的下载和上传功能,而且虚拟机镜像太大了,一传传一天。 所以跨云场景下,混合云场景下,容器也是很好的使用场景。这也同时解决了仅仅私有云资源不足,扛不住流量的问题。 所以这是我认为的容器的本质,是最终应该使用容器的正确姿势,当然一开始你不一定完全按照这个来。 模式一:公有云虚拟机 适合场景:初创公司,无信息安全担忧 如果您是一家初创公司,人员少,IT 运维能力不足,要部署的系统很少,能够花在 IT 系统上的资金有限,当然应该选择公有云的虚拟机部署,它能够解决您的如下问题: 基层 IT 资源的管理交给公有云平台,公司自身运维人员仅需要基本的 Linux 能力; 少量的部署系统,例如 10 台以下的虚拟机,往往替换一个 war,重启 Tomcat 就能解决,如果稍微虚拟机多一点 10 到 20 台,Ansible 脚本可以很好地解决这个问题; 公有云按量按时收费,可以在花费很少的情况下启动,并且在业务飞速扩展的时候,迅速申请大量虚拟机; 这里所说的信息安全担忧,真的仅仅是心理的担忧,公有云往往有大量的安全机制来保证每个租户的安全隔离,只要用好了这些机制,公有云的安全性绝对大于一般公司自己搭建的数据中心,当客户在说要安全的时候,客户在想什么? 这篇文章讲到了绝对的端到端解决方案。 这里贴张图说明公有云的安全性: (点击图片放大查看) 公有云为支撑自身高并发业务积累了更强的安全防护能力和更多的安全防护经验: 多线 BGP,外网线路冗余 高吞吐量的 DDoS 外网防护 更完善的防火墙,入侵检测,WAF 更完善的流量清洗规则 公有云为支撑自身高并发业务推出了更安全、更高可靠、更高可用的 PaaS 服务: 数据库: 高可用:主备切换数据零丢失 高可靠:同城双活,异地备份 安全性:访问控制,IP 白名单 对象存储: 高可靠:超大容量,三份备份,异地同步 安全性:访问控制,防盗链 公有云为支撑自身高并发业务推出更完善的监控运维的系统,流程,经验: 完善的监控系统,保障大促期间系统故障的快速定位和排障 保障大促能够极大的提升和训练一支有经验的运维团队 大促的业务层面的数据对运维也是机密的,需要流程保障 道高一尺魔高一丈,公有云为保证自身业务的安全性对云平台不断升级: 越来越强的 DDoS 防护 越来越完善的防火墙规则 最新的云平台安全功能和机制 不断更新的虚拟机和容器镜像建设漏洞 不断更新的病毒库 模式二:无 IaaS,裸用容器 适用场景:初创公司无 IaaS,有信息安全担忧 但是即便如此,还是有初创公司或者初创项目,也许因为心理方面,也许因为合规方面,非常担心信息安全问题,还是希望采取部署在自己机房的方式。 但由于是初创公司,在机房里面一般是不能部署 IaaS,因为 IaaS 平台的运维难度,优化难度更大,没有一个 50 人的团队根本玩不起来,所以一般在使用容器之前,采用的是物理机部署的方式,当物理机数目非常小,比如部署 5 到 10 个应用的时候手动部署或者简单脚本部署就可以,但是一旦到了 20 个应用,手动部署和简单脚本就非常麻烦了: 运维人员比例低,而应用相对较多 部署在同一个物理机上的应用多,配置冲突,端口冲突,互相连接,运维需要一个 excel 去管理,还容易出错 物理机容器被脚本和 Ansible 改的乱七八糟,难以保证环境一致性,重装物理机更加麻烦 不同的应用依赖不同的操作系统和底层包,千差万别 这个时候,可以试一下裸用容器,即在原来的脚本,或者 Ansible 里面,将启动进程,改为使用 Docker run,可以有以下的作用: 配置,端口隔离,冲突减少 基于容器部署,使得环境一致性,安装和删除干干净净 不同的操作系统和底层包,都可以用容器镜像搞定 在这个阶段,最简单的方式就是把容器当做虚拟机来使用,也即先启动容器,然后在里面下载 war 包等,当然也可以更进一步,将 war 包和配置直接打在容器镜像里面,这样需要一个持续集成的流程了,不仅仅是运维的事情,开发也要参与其中。 在这个阶段,网络的模式可以使用桥接打平的方式。 这种方式好处是访问 Docker 和访问物理机一样,可很方便地实现 Docker 里面和物理机里面的互通,兼容原来部署在物理机上的应用。 当然 Bridge 的性能一般,如果性能要求比较高,可使用 SR-IOV 网卡嵌入容器内。 模式三:有 IaaS,裸用容器 适用场景:创新项目,引入 DevOps 流程 有一些公司规模大一些,已经采购了 IaaS,只不过有一些创新的项目需要部署,这种状态下,基本虚拟机已经能够满足需求,而且由于能够运维 IaaS,IT 能力比较强,一般也采用了 Ansible 等部署工具。 这种情况下,使用容器的动力相对比较少,然而容器也是能够带来一定好处的,就是 DevOps。 创新项目迭代速度比较快,如果有比较多的创新项目,对运维的压力也是非常大的,这里的裸用容器和模式二的裸用容器不同的是,不是拿容器当做虚拟机来用,而是将容器当做交付物来用。 虽然容器化对于运维的整个过程来讲改进有限,但是关键就是要开发写一个 Dockerfile,这一点非常重要,意味着运行环境的配置提前到开发,而非直接交到运维,也即上面说的,开发 5% 的工作量增加减少大量运维工作,容器环境原子性升级回滚使得停服时间变短,可以保持开发、测试、运维环境的一致性。 模式四:使用 Docker Swarm Mode 适用场景:发展中公司,中等规模集群 当集群规模超过 50 台时,裸用容器已经非常难受了,因为网络、存储、编排、服务发现等全部要靠自己的脚本或 Ansible 来搞定,是时候引入容器平台了。 当容器平台规模不是很大时,Docker Swarm Mode 还是比较好用的: 集群的维护不需要 Zookeeper,不需要 Etcd,自己内置 命令行和 Docker 是一样的,用起来顺手 服务发现和 DNS 是内置的 Docker Overlay 网络是内置的 总之 docker 帮你料理好了一切,你不用太关心细节,很容易就能够将集群运行起来。 而且可以通过 docker 命令,像在一台机器上使用容器一样使用集群上的容器,可以随时将容器当虚拟机来使用,这样对于中等规模集群,以及运维人员还是比较友好的。 当然内置的太多了也有缺点,就是不好定制化,不好 Debug,不好干预。当你发现有一部分性能不行时,你需要改整个代码,全部重新编译,当社区更新了,合并分支是很头疼的事情。当出现问题时,由于 Manager 大包大揽干了很多活,不知道哪一步出错了,反正就是没有返回,停在那里,如果重启整个 Manager,影响面又很大。 模式五:使用 Marathon 和 Mesos 使用场景:万节点集群,多定制 当集群规模大一些,几百个节点时,很多人就不愿意使用 Docker Swarm Mode 了,很多的选择是既没有用 DC/OS,也没有用 Kubernetes,而是仅仅用了 Marathon 和 Mesos。 因为 Mesos 是一个非常优秀的调度器,它的双层调度机制可以使得集群规模大很多。 Mesos 的调度过程如图所示: Mesos 有 Framework、Master、Agent、Executor、Task 几部分组成。这里面有两层的 Scheduler,一层在 Master 里面,allocator 会将资源公平的分给每一个 Framework,二层在 Framework 里面,Framework 的 scheduler 将资源按规则分配给 Task。 其它框架的调度器是直接面对整个集群,Mesos 的优势在于,第一层调度先将整个 Node 分配给一个 Framework,然后 Framework 的调度器面对的集群规模小很多,然后在里面进行二次调度,而且如果有多个 Framework,例如有多个 Marathon,则可以并行调度不冲突。 详细的调度机制非常复杂,可以看 号称了解 mesos 双层调度的你,先来回答下面这五个问题!这篇文章。 而且 Mesos 的架构相对松耦合,有很多可以定制化的地方,从而运维人员可以根据自己的需要开发自己的模块。详细的定制方式看文章 定制化 Mesos 任务运行的几种方法。 这也是很多优秀的公司使用 Marathon 和 Mesos 的原因。 例如爱奇艺、去哪儿、携程、当当等都选择了使用 Mesos,需要提一下的是,大家如果参加社区,能发现裸用 Marathon 和 Mesos 的很多,但是整个 DC/OS 都用得比较少,而用 Marathon 和 Mesos 往往不能解决一些问题,因而这些 IT 能力非常强的互联网公司做了大量的自己的定制化,增加了 Marathon 和 Mesos 的外围模块。 模式六:使用开源 Kubernetes 使用场景:千节点集群,少定制 Kubernetes 模块划分得更细,模块比较多,比起裸 Marathon 和 Mesos 来讲功能丰富,而且模块之间完全的松耦合,可以非常方便地进行定制化。 而且 Kubernetes 的数据结构的设计层次比较细,非常符合微服务的设计思想。例如从容器->Pods->Deployment->Service,本来简单运行一个容器,被封装为这么多的层次,每个层次有自己的作用,每一层都可以拆分和组合,这样带来一个很大的缺点,就是学习门槛高,为了简单运行一个容器,需要先学习一大堆的概念和编排规则。 但是当需要部署的业务越来越复杂时,场景越来越多时,你会发现 Kubernetes 这种细粒度设计的优雅,使得你能够根据自己的需要灵活的组合,而不会因为某个组件被封装好了,从而导致很难定制。例如对于 Service 来讲,除了提供内部服务之间的发现和相互访问外,还灵活设计了 headless service,这使得很多游戏需要有状态的保持长连接有了很好的方式,另外访问外部服务时,例如数据库、缓存、headless service 相当于一个 DNS,使得配置外部服务简单很多。很多配置复杂的大型应用,更复杂的不在于服务之间的相互配置,可以有 Spring Cloud 或者 Dubbo 去解决,复杂的反而是外部服务的配置,不同的环境依赖不同的外部应用,External Name 这个提供了很好的机制。 包括统一的监控 cadvisor,统一的配置 confgMap,都是构建一个微服务所必须的。 然而 Kubernetes 当前也有一个瓶颈——集群规模还不是多么大,官方说法是几千个节点,所以超大规模的集群,还是需要有很强的 IT 能力进行定制化,这个在模式七中会说一下我们在网易云上做的事情。但是对于中等规模的集群也足够了。 而且 Kubernetes 社区的热度,可以使得使用开源 Kubernetes 的公司能够很快地找到帮助,等待到新功能的开发和 Bug 的解决。 模式七:深入掌握使用 Kubernetes 使用场景:万节点集群,IT 能力强 随着 Kubernetes 使用规模的越来越大,大型的公司可以对 Kubernetes 进行一定的定制化,从而可以实现万节点甚至更大规模的支撑,当然需要 IT 能力比较强,网易在这方面有很多的实践。 从 APIServer 看集群的规模问题 随着集群规模的扩大,apiserver 的压力越来越大。 因为所有的其他组件,例如 Controller、Scheduler、客户端、Kubelet 等都需要监听apiserver,来查看 etcd 里面的变化,从而执行一定的操作。 很多人都将容器和微服务联系起来,从 Kubernetes 的设计可以看出,Kubernetes 的模块设计时非常的微服务化,每个进程都仅仅干自己的事情,而通过 apiserver 的松耦合关联起来。 而 apiserver 则很像微服务中的 api 网关,是一个无状态的服务,可以很好地弹性伸缩。 为了应对 listwatch,apiserver 用了 watchcache 来缓解压力,然而最终的瓶颈还是在 etcd 上。 最初用的是 etcd2,这时候 listwatch 每次只能接受一个事件,所以压力很大。为了继续使用 etcd2,则需要使用多个 etcd2 的集群来解决这个问题,通过不同的租户分配到不同的 etcd2 集群来分担压力。 将来会迁移到 etcd3 有了事件的批量推送,但是从 etcd2 到 etcd3 需要一定的迁移工作。 通过优化 Scheduler 解决并行调度的问题 大的资源池的调度也是一个很大的问题,因为同样一个资源只能被一个任务使用,如果并行调度,则存在两个并行的调度器同时认为某个资源空闲,于是同时将两个任务调度到同一台机器,结果出现竞争的情况。 为了租户隔离,不同的租户是不共享虚拟机的,这样不同的租户是可以参考 Mesos 机制进行并行调度的。因为不同的租户即便进行并行调度,也不会出现冲突的现象,每个租户不是在几万个节点中进行调度,而仅仅在属于这个租户的有限的节点中进行调度,大大提高了调度策略。 并且通过预过滤无空闲资源的 Node,调整 predicate 算法进行预过滤,进一步减少调度规模。 通过优化 Controller 加快新任务的调度速度 Kubernetes 采用的是微服务常使用的基于事件的编程模型。 当有增量事件产生时,则 controller 根据事件进行添加、删除、更新等操作。 但基于事件模型的一个缺点是,总是通过 delta 进行事件触发,过了一段时间,就不知道是否同步了,因而需要周期性地 Resync 一下,保证全量的同步之后,然后再进行增量的事件处理。 然而问题来了,当 Resync 时,正好遇到一个新容器的创建,则所有的事件在一个队列里面,拖慢了新创建容器的速度。 通过保持多个队列,并且队列的优先级 ADD 优于 Update 优于 Delete 优于 Sync,保证相应的实时性。 模式八:深入掌握使用 DC/OS 使用场景:万节点集群,IT 能力强 前面说过 Mesos 由于本身独特的调度机制,从而支撑的集群规模比较大,但是大多数使用 Mesos 的公司都没有使用 DC/OS,而是裸使用 Marathon 和 Mesos 外加自己定制开发的一些组件。 Mesos 可以支持当集群规模非常大,单个 Marathon 的性能不足以支撑时,可以使用自己的 Framework 机制,使得不同的租户使用单独的 Marathon 来解决问题。 后来 DC/OS 在最基础的 Marathon 和 Mesos 之上添加了很多的组件,如图所示,现在已经非常丰富,例如 DCOS 的客户端 (kubectl)、API 网关 admin router (类似 apiserver)、服务发现 minuteman(类似 kube-proxy)、Pod 的支持、CNI 插件的支持、存储插件的支持等,和 Kubernetes 已经非常像了。 很多公司裸用 Marathon 和 Mesos 而没有进一步使用 DC/OS,可能是因为和核心组件 Mesos 已经经过大规模生产性支撑不同,这些外围的组件也是新的,对其稳定性也是有一定的顾虑,所以需要比较长的学习曲线,并且对于这些新的组件有非常好的把控,才敢上生产。 所以从这个角度来讲,虽然 Mesos 的稳定性和大规模无容置疑,但就整个 DC/OS 来讲,和 Kubernetes 从功能和稳定性来讲,在伯仲之间,都需要使用者有强大的 IT 能力,对于开源软件的各个模块非常熟悉,甚至能够做一定的代码修改和 Bug fix,才敢在大规模集群中使用。 模式九:部署大数据,Kubernetes vs. Mesos Mesos 还有一个优势,就是 Mesos 可以通过开发 Framework,构建大数据平台,例如 Spark 就有基于 Mesos 的部署方式。 基于 Mesos 的 Spark 有两种方式,粗粒度和细粒度。 粗粒度模式(Coarse-grained Mode):应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源,即使不用,最后程序运行结束后,回收这些资源。组粒度的方式浪费资源。 细粒度模式(Fine-grained Mode):按需分配,应用程序启动时,先会启动 executor,但每个 executor 占用资源仅仅是自己运行所需的资源,不需要考虑将来要运行的任务,之后,mesos 会为每个 executor 动态分配资源,每分配一些,便可以运行一个新任务,单个 Task 运行完之后可以马上释放对应的资源。细粒度的缺点是性能有问题。 其实细粒度模式才是真正能够发挥 Mesos 动态资源调度最有效的方式,但是考虑到有大幅度的性能降低,https://issues.apache.org/jira/browse/SPARK-11857,很可惜这种方式在 Spark 2.0.0 被 deprecated 掉了。 如果使用 kubernetes 部署大数据,其实和部署一个普通的应用思路差不多,和 Mesos 不同,kubernetes 不会干预到大数据运行的上下文中,Kubernetes 启动的容器仅仅作为资源预留方式存在,容器内的资源分配则大数据平台自己解决。这样的利用率就降低了,相当于粗粒度模式。 基于容器部署大数据平台,也是建议部署计算部分,例如 Map-Reduce,或者 Spark,对于数据部分 HDFS,应当另行部署。 模式十:容器和虚拟化混合部署 使用场景:大型公司,逐步容器化 对于很多大公司但是非互联网公司,使用容器还是需要小心对待的,因而需要逐步容器化,所以存在有 IaaS 平台,并且虚拟机和容器混合使用的状态,这种状态可能会持续相当长的时间。 在这种情况下,建议容器套在虚拟机里面使用。 使用 Flannel 和 Calico 都仅仅适用于裸机容器,而且仅仅用于容器之间的互通。 一旦有 IaaS 层,就会存在网络二次虚拟化的问题。 虚拟机之间的互联是需要通过一个虚拟网络的,例如 vxlan 的实现,而使用 Flannel 或者 Calico 相当于在虚拟机网络虚拟化的上面再做一次虚拟化,使得网络性能大幅度降低。 而且如果使用 Flannel 或者 Calico,那容器内的应用和虚拟机上的应用相互通信时,则需要出容器平台,多使用 node port,通过 NAT 的方式访问,或者通过外部负载均衡器的方式进行访问。在现实应用中,不可能一下子将所有的应用全部容器化,只是部分应用容器化,部分应用部署在虚拟机里面是常有的现象。然而通过 NAT 或者外部负载均衡器的方式,对应用的相互调用有侵入,使得应用不能像原来一样相互调用,尤其是当应用之间使用 Dubbo 或者 SpringCloud 这种服务发现机制时,尤其如此。 网易云开发了自己的 NeteaseController,在监听到有新的 Pod 创建时,调用 IaaS 的 API 创建 IaaS 层的虚拟网卡,然后在虚拟机内部,通过调用 Netease CNI 插件将虚拟网卡添加到容器里面。添加技术用的就是上一节提到的 setns 命令。 通过这个图我们可以看出,容器的网卡是直接连接到虚拟私有网络的 OVS 上的,和虚拟机是一个平的二层网络,在 OVS 来看,容器和虚拟机是在同一个网络里面的。 这样一方面没有了二次虚拟化,只有 OVS 一层虚拟化。另外容器和虚拟机网络打平的好处是,当部分应用部署容器、虚拟机时,对应用没有侵入,应用原来如何相互访问,现在还是如何访问,有利于应用逐步容器化。 OpenStack 里面有一个项目 Kuryr 可以很好地去做这件事情,完全使用开源的 OpenStack 和 Kubernetes 可以尝试集成一下。 !完 ! 谋胆并重

优秀的个人博客,低调大师

详解K8S系统架构演进过程与背后驱动的原因

1.背景 各种平台都会遇到一个不可回避的问题,即平台应该包含什么和不包含什么,Kubernetes也一样。Kubernetes作为一个部署和管理容器的平台,Kubernetes不能也不应该试图解决用户的所有问题。Kubernetes必须提供一些基本功能,用户可以在这些基本功能的基础上运行容器化的应用程序或构建它们的扩展。此文件旨在明确Kubernetes架构的设计意图,打算描述其演进和将来的开发蓝图。(NIY标记尚未实现的功能特性) 此文档用于描述Kubernetes系统的架构开发演进过程,以及背后的驱动原因。对于希望扩展或者定制kubernetes系统的开发者,其应该使用此文档作为向导,以明确可以在哪些地方,以及如何进行增强功能的实现。如果应用开发者需要开发一个大型的、便携和符合将来发展的kubernetes应用,也应该参考此文档,以了解Kubernetes将来的演化和发展。 从逻辑上来看,kubernetes的架构分为如下几个层次: 核心层(Nucleus): 提供标准的API和执行机制,包括基本的REST机制,安全、Pod、容器、网络接口和存储卷管理,通过接口能够对这些API和执进行扩展,核心层是必需的,它是系统最核心的一部分。 应用管理层(Application Management Layer ):提供基本的部署和路由,包括自愈能力、弹性扩容、服务发现、负载均衡和流量路由。此层即为通常所说的服务编排,这些功能都提供了默认的实现,但是允许进行一致性的替换。 治理层(The Governance Layer):提供高层次的自动化和策略执行,包括单一和多租户、度量、智能扩容和供应、授权方案、网络方案、配额方案、存储策略表达和执行。这些都是可选的,也可以通过其它解决方案实现。 接口层(The Interface Layer):提供公共的类库、工具、用户界面和与Kubernetes API交互的系统。 生态层(The Ecosystem):包括与Kubernetes相关的所有内容,严格上来说这些并不是Kubernetes的组成部分。包括CI/CD、中间件、日志、监控、数据处理、PaaS、serverless/FaaS系统、工作流、容器运行时、镜像仓库、Node和云提供商管理等。 2.系统分层 就像Linux拥有内核(kernel)、核心系统类库、和可选的用户级工具,kubernetes也拥有功能和工具的层次。对于开发者来说,理解这些层次是非常重要的。kubernetes APIs、概念和功能都在下面的层级图中得到体现。 2.1 核心层:API和执行(The Nucleus: API and Execution) 核心层包含最核心的API和执行机。 这些API和功能由上游的kubernetes代码库实现,由最小特性集和概念集所组成,这些特征和概念是系统上层所必需的。 这些由上游KubNeNETs代码库实现的API和函数包括建立系统的高阶层所需的最小特征集和概念集。这些内容被明确的地指定和记录,并且每个容器化的应用都会使用它们。开发人员可以安全地假设它们是一直存在的,这些内容应该是稳定和乏味的。 2.1.1 API和集群控制面板 Kubernetes集群提供了类似REST API的集,通过Kubernetes API server对外进行暴露,支持持久化资源的增删改查操作。这些API作为控制面板的枢纽。 遵循Kubernetes API约定(路径约定、标准元数据等)的REST API能够自动从共享API服务(认证、授权、审计日志)中收益,通用客户端代码能够与它们进行交互。 作为系统的最娣层,需要支持必要的扩展机制,以支持高层添加功能。另外,需要支持单租户和多租户的应用场景。核心层也需要提供足够的弹性,以支持高层能扩展新的范围,而不需要在安全模式方面进行妥协。 如果没有下面这些基础的API机和语义,Kubernetes将不能够正常工作: 认证(Authentication): 认证机制是非常关键的一项工作,在Kubernetes中需要通过服务器和客户端双方的认证通过。API server 支持基本认证模式 (用户命名/密码) (注意,在将来会被放弃), X.509客户端证书模式,OpenID连接令牌模式,和不记名令牌模式。通过kubeconfig支持,客户端能够使用上述各种认证模式。第三方认证系统可以实现TokenReview API,并通过配置认证webhook来调用,通过非标准的认证机制可以限制可用客户端的数量。 1、The TokenReview API (与hook的机制一样) 能够启用外部认证检查,例如Kubelet 2、Pod身份标识通过”service accounts“提供 3、The ServiceAccount API,包括通过控制器创建的默认ServiceAccount保密字段,并通过接入许可控制器进行注入。 授权(Authorization):第三方授权系统可以实现SubjectAccessReview API,并通过配置授权webhook进行调用。 1、SubjectAccessReview (与hook的机制一样), LocalSubjectAccessReview, 和SelfSubjectAccessReview APIs能启用外部的许可检查,诸如Kubelet和其它控制器。 REST 语义、监控、持久化和一致性保证、API版本控制、违约、验证 1、NIY:需要被解决的API缺陷: 2、混淆违约行为 3、缺少保障 4、编排支持 5、支持事件驱动的自动化 6、干净卸载 NIY: 内置的准入控制语义、同步准入控制钩子、异步资源初始化 — 发行商系统集成商,和集群管理员实现额外的策略和自动化 NIY:API注册和发行、包括API聚合、注册额外的API、发行支持的API、获得支持的操作、有效载荷和结果模式的详细信息。 NIY:ThirdPartyResource和ThirdPartyResourceData APIs (或她们的继承者),支持第三方存储和扩展API。 NIY:The Componentstatuses API的可扩展和高可用的替代,以确定集群是否完全体现和操作是否正确:ExternalServiceProvider (组件注册) The Endpoints API,组件增持需要,API服务器端点的自我发布,高可用和应用层目标发行 The Namespace API,用户资源的范围,命名空间生命周期(例如:大量删除) The Event API,用于对重大事件的发生进行报告,例如状态改变和错误,以及事件垃圾收集 NIY:级联删除垃圾收集器、finalization, 和orphaning NIY: 需要内置的add-on的管理器 ,从而能够自动添加自宿主的组件和动态配置到集群,在运行的集群中提取出功能。 1、Add-ons应该是一个集群服务,作为集群的一部分进行管理 2、它们可以运行在kube-system命名空间,这么就不会与用户的命名进行冲突 API server作为集群的网关。根据定义,API server必需能够被集群外的客户端访问,而Node和Pod是不被集群外的客户端访问的。客户端认证API server,并使用API server作为堡垒和代理/通道来通过/proxy和/portforward API访问Node和Pod等Clients authenticate the API server and also use it TBD:The CertificateSigningRequest API,能够启用认证创建,特别是kubele证书。 理想情况下,核心层API server江仅仅支持最小的必需的API,额外的功能通过聚合、钩子、初始化器、和其它扩展机制来提供。注意,中心化异步控制器以名为Controller Manager的独立进程运行,例如垃圾收集。 API server依赖下面的外部组件: 持久化状态存储 (etcd,或相对应的其它系统;可能会存在多个实例) API server可以依赖: 身份认证提供者 The TokenReview API实现者 实现者 The SubjectAccessReview API实现者 2.1.2 执行 在Kubernetes中最重要的控制器是kubelet,它是Pod和Node API的主要实现者,没有这些API的话,Kubernetes将仅仅只是由键值对存储(后续,API机最终可能会被作为一个独立的项目)支持的一个增删改查的REST应用框架。 Kubernetes默认执行独立的应用容器和本地模式。 Kubernetes提供管理多个容器和存储卷的Pod,Pod在Kubernetes中作为最基本的执行单元。 Kubelet API语义包括: The Pod API,Kubernetes执行单元,包括: 1、Pod可行性准入控制基于Pod API中的策略(资源请求、Node选择器、node/pod affinity and anti-affinity, taints and tolerations)。API准入控制可以拒绝Pod或添加额外的调度约束,但Kubelet才是决定Pod最终被运行在哪个Node上的决定者,而不是schedulers or DaemonSets。 2、容器和存储卷语义和生命周期 3、Pod IP地址分配(每个Pod要求一个可路由的IP地址) 4、将Pod连接至一个特定安全范围的机制(i.e., ServiceAccount) 5、存储卷来源: 5.1、emptyDir 5.2、hostPath 5.3、secret 5.4、configMap 5.5、downwardAPI 5.6、NIY:容器和镜像存储卷 (and deprecate gitRepo) 5.7、NIY:本地存储,对于开发和生产应用清单不需要复杂的模板或独立配置 5.8、flexVolume (应该替换内置的cloud-provider-specific存储卷) 6、子资源:绑定、状态、执行、日志、attach、端口转发、代理 NIY:可用性和引导API 资源检查点 容器镜像和日志生命周期 The Secret API,启用第三方加密管理 The ConfigMap API,用于组件配置和Pod引用 The Node API,Pod的宿主 1、在一些配置中,可以仅仅对集群管理员可见 Node和pod网络,业绩它们的控制(路由控制器) Node库存、健康、和可达性(node控制器) 1、Cloud-provider-specific node库存功能应该被分成特定提供者的控制器 pod终止垃圾收集 存储卷控制器 1、Cloud-provider-specific attach/detach逻辑应该被分成特定提供者的控制器,需要一种方式从API中提取特定提供者的存储卷来源。 The PersistentVolume API 1、NIY:至少被本地存储所支持 The PersistentVolumeClaim API 中心化异步功能,诸如由Controller Manager执行的pod终止垃圾收集。 当前,控制过滤器和kubelet调用“云提供商”接口来询问来自于基础设施层的信息,并管理基础设施资源。然而,kubernetes正在努力将这些触摸点(问题)提取到外部组件中,不可满足的应用程序/容器/OS级请求(例如,PODS,PersistentVolumeClaims)作为外部“动态供应”系统的信号,这将使基础设施能够满足这些请求,并使用基础设施资源(例如,Node、和PersistentVolumes)在Kubernetes进行表示,这样Kubernetes可以将请求和基础设施资源绑定在一起。 对于kubelet,它依赖下面的可扩展组件: 镜像注册 容器运行时接口实现 容器网络接口实现 FlexVolume 实现(”CVI” in the diagram) 以及可能依赖: NIY:第三方加密管理系统(例如:Vault) NIY:凭证创建和转换控制器 2.2 应用层:部署和路由 应用管理和组合层,提供自愈、扩容、应用生命周期管理、服务发现、负载均衡和路由— 也即服务编排和service fabric。这些API和功能是所有Kubernetes分发所需要的,Kubernetes应该提供这些API的默认实现,当然可以使用替代的实现方案。没有应用层的API,大部分的容器化应用将不能运行。 Kubernetes’s API提供类似IaaS的以容器为中心的基础单元,以及生命周期控制器,以支持所有工作负载的编排(自愈、扩容、更新和终止)。这些应用管理、组合、发现、和路由API和功能包括: 默认调度,在Pod API中实现调度策略:资源请求、nodeSelector、node和pod affinity/anti-affinity、taints and tolerations. 调度能够作为一个独立的进度在集群内或外运行。 NIY:重新调度器 ,反应和主动删除已调度的POD,以便它们可以被替换并重新安排到其他Node 持续运行应用:这些应用类型应该能够通过声明式更新、级联删除、和孤儿/领养支持发布(回滚)。除了DaemonSet,应该能支持水平扩容。 1、The Deployment API,编排更新无状态的应用,包括子资源(状态、扩容和回滚) 2、The DaemonSet API,集群服务,包括子资源(状态) 3、The StatefulSet API,有状态应用,包括子资源(状态、扩容) 4、The PodTemplate API,由DaemonSet和StatefulSet用来记录变更历史 终止批量应用:这些应该包括终止jobs的自动剔除(NIY) 1、The Job API (GC discussion) 2、The CronJob API 发现、负载均衡和路由 1、The Service API,包括集群IP地址分配,修复服务分配映射,通过kube-proxy或者对等的功能实现服务的负载均衡,自动化创建端点,维护和删除。NIY:负载均衡服务是可选的,如果被支持的化,则需要通过一致性的测试。 2、The Ingress API,包括internal L7 (NIY) 4、服务DNS。DNS使用official Kubernetes schema。 应用层可以依赖: 身份提供者 (集群的身份和/或应用身份) NIY:云提供者控制器实现 Ingress controller(s) 调度器和重新调度器的替代解决方案 DNS服务替代解决方案 kube-proxy替代解决方案 工作负载控制器替代解决方案和/或辅助,特别是用于扩展发布策略 2.3 治理层:自动化和策略执行 策略执行和高层自动化。这些API和功能是运行应用的可选功能,应该挺其它的解决方案实现。 每个支持的API/功能应用作为企业操作、安全和治理场景的一部分。 需要为集群提供可能的配置和发现默认策略,至少支持如下的用例: 单一租户/单一用户集群 多租户集群 生产和开发集群 Highly tenanted playground cluster 用于将计算/应用服务转售给他人的分段集群 需要关注的内容: 1、资源使用 2、Node内部分割 3、最终用户 4、管理员 5、服务质量(DoS) 自动化APIs和功能: 度量APIs (水平/垂直自动扩容的调度任务表) 水平Pod自动扩容API NIY:垂直Pod自动扩容API(s) 集群自动化扩容和Node供应 The PodDisruptionBudget API 动态存储卷供应,至少有一个出厂价来源类型 1、The StorageClass API,至少有一个默认存储卷类型的实现 动态负载均衡供应 NIY:PodPreset API NIY:service broker/catalog APIs NIY:Template和TemplateInstance APIs 策略APIs和功能: 授权:ABAC和RBAC授权策略方案 1、RBAC,实现下面的API:Role, RoleBinding, ClusterRole, ClusterRoleBinding The LimitRange API The ResourceQuota API The PodSecurityPolicy API The ImageReview API The NetworkPolicy API 管理层依赖: 网络策略执行机制 替换、水平和垂直Pod扩容 集群自动扩容和Node提供者 动态存储卷提供者 动态负载均衡提供者 度量监控pipeline,或者它的替换 服务代理 2.4 接口层:类库和工具 这些机制被建议用于应用程序版本的分发,用户也可以用其进行下载和安装。它们包括Kubernetes官方项目开发的通用的类库、工具、系统、界面,它们可以用来发布。 Kubectl — kubectl作为很多客户端工具中的一种,Kubernetes的目标是使Kubectl更薄,通过将常用的非平凡功能移动到API中。这是必要的,以便于跨Kubernetes版本的正确操作,并促进API的扩展性,以保持以API为中心的Kubernetes生态系统模型,并简化其它客户端,尤其是非GO客户端。 客户端类库(例如:client-go, client-python) 集群联邦(API server, controllers, kubefed) Dashboard Helm 这些组件依赖: Kubectl扩展 Helm扩展 2.5 生态 在有许多领域,已经为Kubernetes定义了明确的界限。虽然,Kubernetes必须提供部署和管理容器化应用需要的通用功能。但作为一般规则,在对Kubernete通用编排功能进行补足的功能领域,Kubernetes保持了用户的选择。特别是那些有自己的竞争优势的区域,特别是能够满足不同需求和偏好的众多解决方案。Kubernetes可以为这些解决方案提供插件API,或者可以公开由多个后端实现的通用API,或者公开此类解决方案可以针对的API。有时,功能可以与Kubernetes干净地组合在而不需要显式接口。 此外,如果考虑成为Kubernetes的一部分,组件就需要遵循Kubernetes设计约定。例如,主要接口使用特定域语言的系统(例如,Puppet、Open Policy Agent)与Kubenetes API的方法不兼容,可以与Kubernetes一起使用,但不会被认为是Kubernetes的一部分。类似地,被设计用来支持多平台的解决方案可能不会遵循Kubernetes API协议,因此也不会被认为是Kubernetes的一部分。 内部的容器镜像:Kubernetes不提供容器镜像的内容。 如果某些内容被设计部署在容器镜像中,则其不应该直接被考虑作为Kubernetes的一部分。例如,基于特定语言的框架。 在Kubernetes的顶部 1、持久化集成和部署(CI/CD):Kubernetes不提供从源代码到镜像的能力。Kubernetes 不部署源代码和不构建应用。用户和项目可以根据自身的需要选择持久化集成和持久化部署工作流,Kubernetes的目标是方便CI/CD的使用,而不是命令它们如何工作。 2、应用中间件:Kubernetes不提供应用中间件作为内置的基础设施,例如:消息队列和SQL数据库。然而,可以提供通用目的的机制使其能够被容易的提供、发现和访问。理想的情况是这些组件仅仅运行在Kubernetes上。 3、日志和监控:Kubernetes本身不提供日志聚合和综合应用监控的能力,也没有遥测分析和警报系统,虽然日志和监控的机制是Kubernetes集群必不可少的部分。 4、数据处理平台:在数据处理平台方面,Spark和Hadoop是还有名的两个例子,但市场中还存在很多其它的系统。 5、特定应用运算符:Kubernetes支持通用类别应用的工作负载管理。 6、平台即服务 Paas:Kubernetes为Paas提供基础。 7、功能即服务 FaaS:与PaaS类似,但Faa侵入容器和特定语言的应用框架。 8、工作量编排: “工作流”是一个非常广泛的和多样化的领域,通常针对特定的用例场景(例如:数据流图、数据驱动处理、部署流水线、事件驱动自动化、业务流程执行、iPAAS)和特定输入和事件来源的解决方案,并且通常需要通过编写代码来实现。 9、配置特定领域语言:特定领域的语言不利于分层高级的API和工具,它们通常具有有限的可表达性、可测试性、熟悉性和文档性。它们复杂的配置生成,它们倾向于在互操作性和可组合性间进行折衷。它们使依赖管理复杂化,并经常颠覆性的抽象和封装。 10、Kompose:Kompose是一个适配器工具,它有助于从Docker Compose迁移到Kubernetes ,并提供简单的用例。Kompose不遵循Kubernetes约定,而是基于手动维护的DSL。 11、ChatOps:也是一个适配器工具,用于聊天服务。 支撑Kubernetes 1、容器运行时:Kubernetes本身不提供容器运行时环境,但是其提供了接口,可以来插入所选择的容器运行时。 2、镜像仓库:Kubernetes本身不提供容器的镜像,可通过Harbor、Nexus和docker registry等搭建镜像仓库,以为集群拉取需要的容器镜像。 3、集群状态存储:用于存储集群运行状态,例如默认使用Etcd,但也可以使用其它存储系统。 4、网络:与容器运行时一样,Kubernetes提供了接入各种网络插件的容器网络接口(CNI)。 5、文件存储:本地文件系统和网络存储 6、Node管理:Kubernetes既不提供也不采用任何综合的机器配置、维护、管理或自愈系统。通常针对不同的公有/私有云,针对不同的操作系统,针对可变的和不可变的基础设施。 7、云提供者:IaaS供应和管理。 8、集群创建和管理:社区已经开发了很多的工具,利润minikube、kubeadm、bootkube、kube-aws、kops、kargo, kubernetes-anywhere等待。 从工具的多样性可以看出,集群部署和管理(例如,升级)没有一成不变的解决方案。也就是说,常见的构建块(例如,安全的Kubelet注册)和方法(特别是自托管)将减少此类工具中所需的自定义编排的数量。 后续,希望通过建立Kubernetes的生态系统,并通过整合相关的解决方案来满足上述需求。 3.矩阵管理 选项、可配置的默认、扩展、插件、附加组件、特定于提供者的功能、版本管理、特征发现和依赖性管理。 Kubernetes不仅仅是一个开源的工具箱,而且是一个典型集群或者服务的运行环境。 Kubernetes希望大多数用户和用例能够使用上游版本,这意味着Kubernetes需要足够的可扩展性,而不需要通过重建来处理各种场景。 虽然在可扩展性方面的差距是代码分支的主要驱动力,而上游集群生命周期管理解决方案中的差距是当前Kubernetes分发的主要驱动因素,可选特征的存在(例如,alpha API、提供者特定的API)、可配置性、插件化和可扩展性使概念不可避免。 然而,为了使用户有可能在Kubernetes上部署和管理他们的应用程序,为了使开发人员能够在Kubernetes集群上构建构建Kubernetes扩展,他们必须能够对Kubernetes集群或分发提供一个假设。在基本假设失效的情况下,需要找到一种方法来发现可用的功能,并表达功能需求(依赖性)以供使用。 集群组件,包括add-ons,应该通过组件注册 API进行注册和通过/componentstatuses进行发现。 启用内置API、聚合API和注册的第三方资源,应该可以通过发现和OpenAPI(Savigj.JSON)端点来发现。如上所述,LoadBalancer类型服务的云服务提供商应该确定负载均衡器API是否存在。 类似于StorageClass,扩展和它们的选项应该通过FoeClass资源进行注册。但是,使用参数描述、类型(例如,整数与字符串)、用于验证的约束(例如,ranger或regexp)和默认值,从扩展API中引用fooClassName。这些API应该配置/暴露相关的特征的存在,例如动态存储卷供应(由非空的storageclass.provisioner字段指示),以及标识负责的控制器。需要至少为调度器类、ingress控制器类、Flex存储卷类和计算资源类(例如GPU、其他加速器)添加这样的API。 假设我们将现有的网络存储卷转换为flex存储卷,这种方法将会覆盖存储卷来源。在将来,API应该只提供通用目的的抽象,即使与LoadBalancer服务一样,抽象并不需要在所有的环境中都实现(即,API不需要迎合最低公共特性)。 NIY:需要为注册和发现开发下面的机制: 准入控制插件和hooks(包括内置的APIs) 身份认证插件 授权插件和hooks 初始化和终结器 调度器扩展 Node标签和集群拓扑 NIY:单个API和细粒度特征的激活/失活可以通过以下机制解决: 所有组件的配置正在从命令行标志转换为版本化配置。 打算将大部分配置数据存储在配置映射(ConfigMaps)中,以便于动态重新配置、渐进发布和内省性。 所有/多个组件共同的配置应该被分解到它自己的配置对象中。这应该包括特征网关机制。 应该为语义意义上的设置添加API,例如,在无响应节点上删除Pod之前需要等待的默认时间长度。 NIY:版本管理操作的问题,取决于多个组件的升级(包括在HA集群中的相同组件的副本),应该通过以下方式来解决: 为所有新的特性创建flag网关 总是在它们出现的第一个小版本中,默认禁用这些特性, 提供启用特性的配置补丁; 在接下来的小版本中默认启用这些特性 NIY:我们还需要一个机制来警告过时的节点,和/或潜在防止Master升级(除了补丁发布),直到/除非Node已经升级。 NIY:字段级版本管理将有助于大量激活新的和/或alpha API字段的解决方案,防止不良写入过时的客户端对新字段的阻塞,以及非alpha API的演进,而不需要成熟的API定义的扩散。 Kubernetes API server忽略不支持的资源字段和查询参数,但不忽略未知的/未注册的API(注意禁用未实现的/不活动的API)。这有助于跨多个版本的集群重用配置,但往往会带来意外。Kubctl支持使用服务器的Wagger/OpenAPI规范进行可选验证。这样的可选验证,应该由服务器(NYY)提供。此外,为方便用户,共享资源清单应该指定Kubernetes版本最小的要求,这可能会被kubectl和其他客户端验证。 服务目录机制(NIY)应该能够断言应用级服务的存在,例如S3兼容的群集存储。 4.与安全相关的系统分层 为了正确地保护Kubernetes集群并使其能够安全扩展,一些基本概念需要由系统的组件进行定义和约定。最好从安全的角度把Kubernetes看作是一系列的环,每个层都赋予连续的层功能去行动。 用于存储核心API的一个或者多个数据存储系统(etcd) 核心APIs 高度可信赖资源的APIs(system policies) 委托的信任API和控制器(用户授予访问API /控制器,以代表用户执行操作),无论是在集群范围内还是在更小的范围内 在不同范围,运行不受信任/作用域API和控制器和用户工作负载 当较低层依赖于更高的层时,它会使安全模型崩溃,并使系统变得更加复杂。管理员可以选择这样做以获得操作简单性,但这必须是有意识的选择。一个简单的例子是etcd:可以将数据写入etcd的任何组件现在都在整个集群上,任何参与者(可以破坏高度信任的资源)都几乎可以进行逐步升级。为每一层的进程,将上面的层划分成不同的机器集(etcd-> apiservers +控制器->核心安全扩展->委托扩展- >用户工作负载),即使有些可能在实践中崩溃。 如果上面描述的层定义了同心圆,那么它也应该可能存在重叠或独立的圆-例如,管理员可以选择一个替代的秘密存储解决方案,集群工作负载可以访问,但是平台并不隐含地具有访问权限。这些圆圈的交点往往是运行工作负载的机器,并且节点必须没有比正常功能所需的特权更多的特权。 最后,在任何层通过扩展添加新的能力,应该遵循最佳实践来传达该行为的影响。 当一个能力通过扩展被添加到系统时,它有什么目的? 使系统更加安全 为集群中的每一个人,启用新的“生产质量”API 在集群的子集上自动完成一个公共任务 运行一个向用户提供API的托管工作负载(spark、数据库、etcd) 它们被分为三大类: 1、集群所需的(因此必须在内核附近运行,并在存在故障时导致操作权衡) 2、暴露于所有集群用户(必须正确地租用) 3、暴露于集群用户的子集(像传统的“应用程序”工作负载运行) 如果管理员可以很容易地被诱骗,在扩展期间安装新的群集级安全规则,那么分层被破坏,并且系统是脆弱的。 原文发布时间为:2018-06-4 本文来自云栖社区合作伙伴“IT168”,了解相关信息可以关注“IT168”。

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。