是什么
Kubernetes是开源的容器编排系统,Kubernetes 是google 10多年大规模容器管理技术的Borg的开源版本,它是容器集群管理系统, 可使先容器集群的自动化部署,自动扩缩容,维护等功能,它可以帮助我们快速部署应用,快速扩展应用, 无缝对接新应用,DevOps自动化运维,金丝雀发布。
部署进化
传统部署时代
早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本很高。
虚拟化部署时代
作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的 CPU 上运行多个虚拟机(VM)。虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。
因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
容器部署时代
容器类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 分发进行移植。容器因具有许多优势而变得流行起来。下面列出了容器的一些好处:敏捷应用程序的创建和部署
,持续开发集成和部署
,关注开发与运维的分离
,可观察性
,跨开发测试和生产的环境一致性
,云和操作系统分发的可移植性
,以应用程序为中心的管理
,松散耦合、分布式、弹性、解放的微服务
,资源隔离
,高效率和高密度的资源利用
Kubernetes 为什么存在
在生产环境中,您需要管理运行应用程序的容器,并确保不会停机。Kubernetes 提供了一个可弹性运行分布式系统的框架。Kubernetes 会满足扩展要求、故障转移、部署模式等。Kubernetes 提供了如下的功能:服务发现和负载均衡
,存储编排
,自动部署和回滚
,自动二进制打包
,自我修复
,密钥与配置管理
Kubernetes构成
节点类型分为master节点和node节点
master节点 :调度控制集群资源
node节点 :运行容器,运行服务。就是干活的
master节点的模块构成 : kube-apiserver
,kube-scheduler
,kube-controller-manager
,etcd
node节点模块构成:kubelet
,kube-proxy
,runtime
kubernetes 内部使用grpc通信,对外提供restful aip
基础概念
kubernetes对象
pod :用于运行容器的最小单元
,一个pod可以对应着一个docker容器, 也可以是对应一组docker容器。 pod很少直接创建,一般情况下pod 由Controller创建和管理,由调度器调度在集群中的node节点上运行。他们共享IPC(进程间通信),Network(网络),和UTS(后面有解释)
service: 默认情况下,Docker 使用私有主机网络连接,只能与同在一台机器上的容器进行通信。 为了实现容器的跨节点通信,必须在机器自己的 IP 上为这些容器分配端口,为容器进行端口转发或者代理。service是为运行在一组 Pods 上的应用程序 提供对外网络服务的。借助Service,应用可以方便地实现服务发现和负载均衡
Volume: 容器中的磁盘文件是临时的,当容器崩溃时,kubelet 将重新启动容器,这些文件会丢失。当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。Volumes就是来解决这两个问题的。 Kubernetes 支持的卷类型很多:awsElasticBlockStore
,azureDisk
,azureFile
,cephfs
,cinder
,configMap
,csi
,downwardAPI
,emptyDir
,fc (fibre channel)
,flexVolume
,flocker
,gcePersistentDisk
,gitRepo (deprecated)
… …
Namespace: Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间。命名空间适用于存在很多跨多个团队或项目的用户的场景。命名空间为名称提供了一个范围。资源的名称需要在命名空间内是唯一的。在 Kubernetes 未来版本中,相同命名空间中的对象默认将具有相同的访问控制策略。命名空间是在多个用户之间划分集群资源的一种方法。
Kubernetes 中的 Controller 高级抽象
deployment: Controller中的一种,负责部署 pod, deployment存在的时候,我们通过命了删除了pod,pod也会被deployment自动创建出来
DaemonSet: DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
StatefulSet: StatefulSet 是用来管理有状态应用的工作负载 API 对象。StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供*序号和唯一性保证,
ReplicaSet: ReplicaSet 是下一代的 Replication Controller。 ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持。ReplicaSet 支持新的基于集合的选择器需求,这在标签用户指南中有描述。而 Replication Controller 仅支持基于相等选择器的需求。
Job: Job用于执行任务,例如临时任务 ,Job会创建一个或多个Pod,并确保指定数量的Pod成功终止。pods成功完成后,Job将跟踪成功完成的情况。当达到指定的成功完成次数时,Job就完成了。删除Job将清除其创建的Pod
其他
label (k-v)标签,可以被管理到pod这样的对象上,主要作用是标记,
GUI 用户图形界面,可以是web用户页面例如kubernetes-dashboard
组件,用户可以通过dashboard部署集群中的容器化应用,可以查看集群运行情况,通过部署向导对容器进行扩容缩容,进行滚动更新,重启pod,dashboard也能查看资源状态
kubectl:用户管理Kubernetes 的命令行工具
kube-apiserver:提供了资源操作的唯一入口,并提供认证授权,访问控制,api注册和发现等机制。
runtime: 负责镜像管理以及pod和容器的真正运行(CRI Containner Runtime Interface),默认的容器runtime是Docker。
kubelet: 负责维持容器的生命周期,同时也负责Volume(CVI Container Volume Interface)和网络(CNI Container Network Interface) 的管理
kube-proxy: 负责为Service提供cluster(集群) 内部的服务发现和负载均衡
UTS命名空间是Linux命名空间的子系统,主要作用是完成对容器的Hostname和Domain的隔离,同时保存内核名称, 版本和底层体系结构类型等信息,Docker就是基于它开发的。
文章引用
kubernetes官网