kubernetes(1)了解k8s

文章目录

  • kubernetes(1)了解k8s
    • 什么是kubernets(k8s)
    • 名词概念
    • Kubernetes 组件
      • Master 组件
      • 节点(Node)组件
    • 特点
    • 为什么要装容器?
    • 使用Kubernetes能做什么?
    • Kubernetes不是什么?

kubernetes(1)了解k8s

中文文档

什么是kubernets(k8s)

Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
通过Kubernetes你可以:
快速部署应用
快速扩展应用
无缝对接新的应用功能
节省资源,优化硬件资源的使用
我们的目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。

Kubernets(k8s)是google在2014年发布的一个开源项目
据说google的数据中心里运行着20多亿个容器,而且google十年前就开始使用容器技术
最初 google开发了一个叫Borg的系统(现在命名为Omega)来调度如此庞大数量的容器和工作负载,在积累了多年的经验后,google决定重写这个容器管理系统,并将其贡献到开源社区,让全世界都能受益 这个项目就是kubernetes kubernetes(1)了解k8s_第1张图片
kubernetes(1)了解k8s_第2张图片
kubernetes(1)了解k8s_第3张图片kubernetes(1)了解k8s_第4张图片
kubernetes(1)了解k8s_第5张图片

一个例子
kubernetes(1)了解k8s_第6张图片

名词概念

kubernetes的几个重要的概念,它们是组成kubernetes集群的基石

1.cluster
是计算,存储和网络资源的集和,kubernetes利用这些资源运行各种基于容器的应用

2.Master
是cluster的大脑,它的主要职责是调度,即决定将应用放在哪里运行,Master运行linux操作系统,可以是物理机或者虚拟机,为了实现高可用,可以运行多个Master

3.node
node的职责是运行容器应用,node由master管理,node负责监控并汇报容器的状态,同时根据master的要求管理容器的生命周期,node运行在linux操作系统上,可以是物理机或者是虚拟机

4.pod
是kubernetes的最小工作单元,每个pod包含一个或多个容器,pos中的容器会作为一个整体被master调度到一个node上运行
kubernetes引入pod主要基于下面两个目的:
1.可管理性
有些容器天生就是需要紧密联系,一起工作,pod提供了比容器更高层次的抽象,将它们封装到一个部署单元,kubernetes以pod为最小单位进行调度,扩展,共享资源,管理生命周期
2.通信和资源共享。
pod中的所有容器使同一个网络,即同样的ip地址和port空间,它们可以直接用localhost通信,同样的,这些容器可以共享存储当Kubernetes挂载volume到Pod,本质上是将volume挂载到Pod中的每一个容器
Pods有两种使用方式:
(1)运行单一容器
one-container-per-Pod是Kubernetes最常见的模型,这种情况下,
只是将单个容器简单封装成Pod。即便是只有一个容器,Kubernetes
管理的也是Pod而不是直接管理容器
(2)运行多个容器。
问题在于:哪些容器应该放到一个Pod中?
答案是:这些容器联系必须非常紧密,而且需要直接共享资源
举个例子这个Pod包含两个容器:一个是File Puller,一个是Web Server.
File Puller会定期从外部的Content Manager中拉取最新的文件,
将其存放在共享的volume中。
Web Server从volume读取文件,响应Consumer的请求这两个容器是紧密协作的,它们一起为Consumer提供最新的数据;同时它们也通过volume共享数据,所以放到一个Pod是合适的
再来看一个反例:是否需要将Tomcat和MySQL放到一个Pod中?
Tomcat从MySQL读取数据,它们之间需要协作,但还不至于需
要放到一个Pod中一起部署、一起启动、一起停止。同时它们之间是通过JDBC交换数据,并不是直接共享存储,所以放到各自的Pod中更合适

5.Controller
Kubernetes通常不会直接创建Pod,而是通过Controller来管理Pod
的。Controller中定义了Pod的部署特性,比如有几个副本、在什么样的Node上运行等。为了满足不同的业务场景,Kubernetes提供了多种Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等,我们逐一讨论

6.Service
Deployment可以部署多个副本,每个Pod都有自己的IP,外界如
何访问这些副本呢?
通过Pod的IP吗?
要知道Pod很可能会被频繁地销毁和重启,它们的IP会发生变
化,用IP来访问不太现实。
答案是Service
Kubernetes Service定义了外界访问一组特定Pod的方式。Service有自己的IP和端口,Service为Pod提供了负载均衡。
Kubernetes运行容器(Pod)与访问容器(Pod)这两项任务分别
由Controller和Service执行

7.Namespace
如果有多个用户或项目组使用同一个Kubernetes Cluster,如何将
他们创建的Controller、Pod等资源分开呢?
答案就是Namespace。
Namespace可以将一个物理的Cluster逻辑上划分成多个虚拟
Cluster,每个Cluster就是一个Namespace。不同Namespace里的资源是完全隔离的。

8.deployment
是最常用的controller。deployment可以管理pod的多个副本,并确保pod按照期望的状态运行。

9.replicaset
实现了pod的多副本管理。使用deployment时会自动创建replicaset,也就是说deployment是通过replicaset来管理pod的多个副本的,我们通常不需要直接使用replicaset。

10.daemonset
用于每个node最多只运行一个pod副本的场景。正如其名称所示的,daemonset通常用于运行daemon。

11.statefuleset
能够保证pod的每个副本在整个生命周期中名称是不变的,而其他controller不提供这个功能。当某个pod发生故障需要删除并重新启动时,pod的名称会发生变化,同时statefulset会保证副本按照固定的顺序启动、更新或者删除。

12.job
用于运行结束就删除的应用,而其他controller中的pod通常是长期持续运行的。

Kubernetes 组件

Master 组件

Master组件提供集群的管理控制中心。
Master组件可以在集群中任何节点上运行。但是为了简单起见,通常在一台VM/机器上启动所有Master组件,并且不会在此VM/机器上运行用户容器。

kube-apiserver
kube-apiserver用于暴露Kubernetes API。任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行。请参阅构建高可用群集。

ETCD
etcd是Kubernetes提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。

kube-controller-manager
kube-controller-manager运行管理控制器,它们是集群中处理常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成单个二进制文件,并在单个进程中运行。
这些控制器包括:
节点(Node)控制器。
副本(Replication)控制器:负责维护系统中每个副本中的pod。
端点(Endpoints)控制器:填充Endpoints对象(即连接Services&Pods)。
Service Account和Token控制器:为新的Namespace 创建默认帐户访问API Token。
cloud-controller-manager
云控制器管理器负责与底层云提供商的平台交互。云控制器管理器是Kubernetes版本1.6中引入的,目前还是Alpha的功能。
云控制器管理器仅运行云提供商特定的(controller loops)控制器循环。可以通过将–cloud-provider flag设置为external启动kube-controller-manager ,来禁用控制器循环。
cloud-controller-manager 具体功能:
节点(Node)控制器
路由(Route)控制器
Service控制器
卷(Volume)控制器

kube-scheduler
kube-scheduler 监视新创建没有分配到Node的Pod,为Pod选择一个Node。

插件 addons
插件(addon)是实现集群pod和Services功能的 。Pod由Deployments,ReplicationController等进行管理。Namespace 插件对象是在kube-system Namespace中创建。

DNS
虽然不严格要求使用插件,但Kubernetes集群都应该具有集群 DNS。
群集 DNS是一个DNS服务器,能够为 Kubernetes services提供 DNS记录。
由Kubernetes启动的容器自动将这个DNS服务器包含在他们的DNS searches中。

用户界面
kube-ui提供集群状态基础信息查看。更多详细信息,请参阅使用HTTP代理访问Kubernetes API

容器资源监测
容器资源监控提供一个UI浏览监控数据。

Cluster-level Logging
Cluster-level logging,负责保存容器日志,搜索/查看日志。

节点(Node)组件

节点组件运行在Node,提供Kubernetes运行时环境,以及维护Pod。

kubelet
kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能:
安装Pod所需的volume。
下载Pod的Secrets。
Pod中运行的 docker(或experimentally,rkt)容器。
定期执行容器健康检查。
Reports the status of the pod back to the rest of the system, by creating a mirror pod if necessary.
Reports the status of the node back to the rest of the system.
kube-proxy
kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象。

docker
docker用于运行容器。

RKT
rkt运行容器,作为docker工具的替代方案。

supervisord
supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行。

fluentd
fluentd是一个守护进程,可提供cluster-level logging.。

特点

Kubernetes 特点
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
可扩展: 模块化, 插件化, 可挂载, 可组合
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。

为什么要装容器?

为什么要使用容器?通过以下两个图对比:kubernetes(1)了解k8s_第7张图片

为什么是容器?
传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚机轻量、更“透明”,这更便于监控和管理。最后,

容器优势总结:
快速创建/部署应用:与VM虚拟机相比,容器镜像的创建更加容易。
持续开发、集成和部署:提供可靠且频繁的容器镜像构建/部署,并使用快速和简单的回滚(由于镜像不可变性)。
开发和运行相分离:在build或者release阶段创建容器镜像,使得应用和基础设施解耦。
开发,测试和生产环境一致性:在本地或外网(生产环境)运行的一致性。
云平台或其他操作系统:可以在 Ubuntu、RHEL、 CoreOS、on-prem、Google Container Engine或其它任何环境中运行。
Loosely coupled,分布式,弹性,微服务化:应用程序分为更小的、独立的部件,可以动态部署和管理。
资源隔离
资源利用:更高效

使用Kubernetes能做什么?

可以在物理或虚拟机的Kubernetes集群上运行容器化应用,Kubernetes能提供一个以“容器为中心的基础架构”,满足在生产环境中运行应用的一些常见需求,如:
多个进程(作为容器运行)协同工作。(Pod)
存储系统挂载
分发机密
应用健康检测
应用实例的复制
Pod自动伸缩/扩展
命名和发现
负载均衡
滚动更新
资源监控
日志访问
调试应用程序
提供认证和授权

Kubernetes不是什么?

Kubernetes并不是传统的PaaS(平台即服务)系统。

Kubernetes不限制支持应用的类型,不限制应用框架。不限制受支持的语言runtimes (例如, Java, Python, Ruby),满足12-factor applications 。不区分 “apps” 或者“services”。 Kubernetes支持不同负载应用,包括有状态、无状态、数据处理类型的应用。只要这个应用可以在容器里运行,那么就能很好的运行在Kubernetes上。
Kubernetes不提供中间件(如message buses)、数据处理框架(如Spark)、数据库(如Mysql)或者集群存储系统(如Ceph)作为内置服务。但这些应用都可以运行在Kubernetes上面。
Kubernetes不部署源码不编译应用。持续集成的 (CI)工作流方面,不同的用户有不同的需求和偏好的区域,因此,我们提供分层的 CI工作流,但并不定义它应该如何工作。
Kubernetes允许用户选择自己的日志、监控和报警系统。
Kubernetes不提供或授权一个全面的应用程序配置 语言/系统(例如,jsonnet)。
Kubernetes不提供任何机器配置、维护、管理或者自修复系统。
另一方面,大量的Paas系统都可以运行在Kubernetes上,比如Openshift、Deis、Gondor。可以构建自己的Paas平台,与自己选择的CI系统集成。

由于Kubernetes运行在应用级别而不是硬件级,因此提供了普通的Paas平台提供的一些通用功能,比如部署,扩展,负载均衡,日志,监控等。这些默认功能是可选的。
另外,Kubernetes不仅仅是一个“编排系统”;它消除了编排的需要。“编排”的定义是指执行一个预定的工作流:先执行A,之B,然C。相反,Kubernetes由一组独立的可组合控制进程组成。怎么样从A到C并不重要,达到目的就好。当然集中控制也是必不可少

你可能感兴趣的:(docker&k8s)