Kubernetes 是什么

Kubernetes 是一个全新的基于容器技术的分布式架构解决方案,是 Google 开源的一个容器集群管理系统,Kubernetes 简称 K8S。

Kubernetes 是一个一站式的完备的分布式系统开发和支撑平台,更是一个开放平台,对现有的编程语言、编程框架、中间件没有任何侵入性。

Kubernetes 提供了完善的管理工具,这些工具涵盖了开发、部署测试、运维监控在内的各个环节。

Kubernetes 具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制、多粒度的资源配额管理能力。

Kubernetes 官方文档:https://kubernetes.io/zh/

用一句话总结kubernates:

  1. 容器编排工具
  2. 基于它可以轻易实现一个腾讯云、阿里云、字节云
  3. 是docker的绝佳搭档
  4. 是微服务技术的管理调度器。

为什么使用k8s

使用Kubernetes可以带来的好处:

首先,最直接的感受就是我们可以**“轻装上阵”地开发复杂系统**。以前动不动就需要十几个人而且团队中必须有技术大牛一起分工协作才能实现和运维的分布式系统,在采用了Kubernetes解决方案后,只需要一个小而美的团队就能轻松应对。在这个团队中,架构师专注于“服务组件”的提炼,几名开发工程师负责业务代码的开发,一名系统兼运维工程师则负责Kubernetes的部署和运维,从此大大节约了开发成本。

其次,使用Kubernetes就是全面拥抱微服务架构。微服务架构的核心就是将一个巨大的单体应用分解为很多很小的互相连接的微服务,一个微服务背后可能有多个实例副本在支撑,副本的数量可能会随着系统负荷变化而变化,内嵌的负载均衡器在这里发挥了重要的作用。微服务架构使得每个服务都可以由专门的开发团队来开发。开发者可以自由的选择开发技术,这对于大规模团队来说很有价值,另外每个微服务独立开发,升级,扩展,因此系统具备很高的稳定性和快速迭代能力。

最后,Kubernetes系统架构具备了超强的横向扩容能力。对于互联网公司来说,用户规模就等价于资产,谁拥有更多的用户,谁就能在竞争中胜出,因此超强的横向扩容能力是互联网业务系统的关键指标之一。不用修改代码,一个Kubernetes集群即可从只包含几个Node的小集群平滑扩展到拥有上百个Node的大规模集群,我们利用Kubernetes提供的工具,甚至可以再先完成集群扩容。只要我们的微服务设计得好,结合硬件或者公有云资源的线性增加,系统就能承受大量用户并发访问所带来的巨大压力。

Kubernetes 特性

① 自我修复(自愈)

在节点故障时,重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理用户的请求,确保线上服务不中断。

② 弹性伸缩

使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。

③ 自动部署和回滚

K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不影响业务。

④ 服务发现和负载均衡

K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。

⑤ 机密和配置管理

管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。

⑥ 存储编排

挂载外部存储系统,无论是来自本地存储,公有云,还是网络存储,都作为集群资源的一部分使用,极大提高存储使用灵活性。

⑦ 批处理

提供一次性任务,定时任务;满足批量数据处理和分析的场景。

架构

一套kubernates系统包含一个master如何一堆node。管理员在master上操作,master将命令同步到node。 master相当于k8s集群的控制节点。上面运行着以下组件:

  1. kube-apiserver:一个HTTP服务,是master对外的窗口
  2. kube-controller-manager:处理集群常规后台任务
  3. kube-scheduler:根据调度算法为新创建的Pod选择一个Node节点,可以将Pod部署到任意一个Node节点上。
  4. etcd:一个分布式一致性KV存储

除了master,k8s集群中的其它节点被称为node,node上运行着pod。每隔node上运行着以下组件:

  1. kubelet:是node上的木马程序,负责与master的通信,管理本机运行pod的生命周期。
  2. kube-proxy:相当于部署在node上的nginx,负责将流量打到特定的pod。
  3. docker engine:docker引擎,负责本机的容器创建和管理工作。

Node 节点可以在运行期间动态增加到 K8S 集群中,前提是这个节点上已经正确安装、配置和启动了上述关键组件。在默认情况下 kubelet 会向 Master 注册自己,一旦 Node 被纳入集群管理范围,kubelet 就会定时向 Master 节点汇报自身的情况,例如操作系统、Docker 版本、机器的 CPU 和内存情况,以及之前有哪些 Pod 在运行等,这样 Master 可以获知每个 Node 的资源使用情况,并实现高效均衡的资源调度策略。而某个 Node 超过指定时间不上报信息时,会被 Master 判定为“失联”,Node 的状态被标记为不可用(Not Ready),随后 Master 会触发“工作负载大转移”的自动流程。

核心概念

1、Pod

Pod 是 K8S 中最重要也是最基本的概念,Pod 是最小的部署单元,是一组容器的集合。每个 Pod 都由一个特殊的根容器 Pause 容器,以及一个或多个紧密相关的用户业务容器组成。

Pause 容器作为 Pod 的根容器,以它的状态代表整个容器组的状态。K8S 为每个 Pod 都分配了唯一的 IP 地址,称之为 Pod IP。Pod 里的多个业务容器共享 Pause 容器的IP,共享 Pause 容器挂载的 Volume。

2、Label

标签,附加到某个资源上,用于关联对象、查询和筛选。一个 Label 是一个 key=value 的键值对,key 与 value 由用户自己指定。Label 可以附加到各种资源上,一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源上。

我们可以通过给指定的资源对象捆绑一个或多个不同的 Label 来实现多维度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等工作。

K8S 通过 Label Selector(标签选择器)来查询和筛选拥有某些 Label 的资源对象。Label Selector 有基于等式( name=label1 )和基于集合( name in (label1, label2) )的两种方式。

3、ReplicaSet(RC)

ReplicaSet 用来确保预期的 Pod 副本数量,如果有过多的 Pod 副本在运行,系统就会停掉一些 Pod,否则系统就会再自动创建一些 Pod。

我们很少单独使用 ReplicaSet,它主要被 Deployment 这个更高层的资源对象使用,从而形成一整套 Pod 创建、删除、更新的编排机制。

4、Deployment

Deployment 用于部署无状态应用,Deployment 为 Pod 和 ReplicaSet 提供声明式更新,只需要在 Deployment 描述想要的目标状态,Deployment 就会将 Pod 和 ReplicaSet 的实际状态改变到目标状态。

5、Horizontal Pod Autoscaler(HPA)

HPA 为 Pod 横向自动扩容,也是 K8S 的一种资源对象。HPA 通过追踪分析 RC 的所有目标 Pod 的负载变化情况,来确定是否需要针对性调整目标 Pod 的副本数量。

6、Service

Service 定义了一个服务的访问入口,通过 Label Selector 与 Pod 副本集群之间“无缝对接”,定义了一组 Pod 的访问策略,防止 Pod 失联。

创建 Service 时,K8S会自动为它分配一个全局唯一的虚拟 IP 地址,即 Cluster IP。服务发现就是通过 Service 的 Name 和 Service 的 ClusterIP 地址做一个 DNS 域名映射来解决的。

7、Namespace

命名空间,Namespace 多用于实现多租户的资源隔离。Namespace 通过将集群内部的资源对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组。

K8S 集群在启动后,会创建一个名为 default 的 Namespace,如果不特别指明 Namespace,创建的 Pod、RC、Service 都将被创建到 default 下。

当我们给每个租户创建一个 Namespace 来实现多租户的资源隔离时,还可以结合 K8S 的资源配额管理,限定不同租户能占用的资源,例如 CPU 使用量、内存使用量等。

kubernates和docker的关系

官方定义1:Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。

官方定义2:k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

k8s相当于集群版的supervisor,可以管理多台机器,负责容器部署和调度,相当于腾讯云、阿里云等。

问题“Kubernetes vs. Docker?” 本身是相当荒谬的,就像将苹果比作橘子一样。一个不是另一个的替代品。恰恰相反,Kubernetes 可以在没有 Docker 的情况下运行,而 Docker 可以在没有 Kubernetes 的情况下运行

但是 Kubernetes 可以(并且确实)从 Docker 中受益匪浅,反之亦然。 Docker 是一个独立的应用程序,可以安装在任何计算机上以运行容器化应用程序。容器化是一种在操作系统上运行应用程序的方法,以便应用程序与系统的其余部分隔离。尽管可能有其他容器在同一系统上运行,但您为应用程序创建了一种错觉,认为它正在获得自己的操作系统实例。

Docker 使我们能够在单个操作系统上运行、创建和管理容器。 Kubernetes 将其增加到 11。如果您在一堆主机(不同的操作系统)上安装了 Docker,则可以利用 Kubernetes。这些节点或 Docker 主机可以是裸机服务器或虚拟机。

然后,Kubernetes 可以让您从单个命令行或仪表板跨所有这些节点自动执行容器配置、网络、负载平衡、安全性和扩展。由单个 Kubernetes 实例管理的节点集合称为 Kubernetes 集群。

现在,为什么首先需要有多个节点?其背后的两个主要动机是:

  1. 使基础设施更加健壮——即使某些节点离线,您的应用程序也将在线,即高可用性。

  2. 使您的应用程序更具可扩展性——如果工作负载增加,只需生成更多容器和/或向 Kubernetes 集群添加更多节点。

实操

https://www.cnblogs.com/chiangchou/p/k8s-1.html