Kubernetes
概述
-
Kubernetes
是一个可移植、可拓展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 -
k8s
这个缩写是因为k和s之间有八个字符的关系。
应用部署方式
传统部署时代
早期,直接将应用程序部署在物理机上,无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题,程序之间还会相互影响。如果将应用程序运行在不同的物理服务器上,有的应用程序资源利用率不高又会造成资源浪费,而且物理服务器的维护成本高昂。
虚拟化部署时代
虚拟化技术允许在单个物理服务器上运行多个虚拟机(VM)。每个虚拟机是一个独立的环境,可以有效隔离应用程序,且能提供一定程度的安全性。
虚拟化技术能够更好地利用物理服务器的资源,并且因为可以轻松地添加或更新应用程序,而因此可以具有更高的收缩性,以及降低硬件成本等等的好处。坏处就是每个虚拟机都有操作系统,浪费了部分资源。
容器部署
容器类似于VM,具有更加宽松的隔离特性,不同容器之间共享操作系统。相比于VM,容器更加轻量级。每个容器都具有自己的文件系统、CPU、内存、进程空间等。
容器具有的优势:
- 敏捷应用程序的创建和部署
- 持续开发、集成和部署:通过快速简单的回滚(镜像的不可变性),提供可靠且频繁的容器镜像构建和部署。
- 跨开发、测试和生产的环境一致性:在笔记本电脑上也可以和在云中运行一样的应用程序。
- 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理-而不是在一台大型单机上整体运行。
- 资源隔离:可预测的应用程序性能。
- 资源利用:高效率和高密度。
为何需要k8s
容器是打包和运行应用程序的好方式。虽然容器化部署方式有许多优势,但是还存在一些问题。例如:
- 数据访问量变大时,如何动态扩容?
- 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
这就是k8s需要解决的问题。k8s提供了一个可弹性运行分布式系统的框架,会满足你的拓展要求、故障转移、提供部署模式等。
k8s的优势
服务发现和负载均衡
- k8s可以使用DNS名称或者自己的IP地址来暴露容器。如果进入容器的流量很大,k8s可以负载均衡并分配网络流量,从而使内部稳定。
存储编排
- k8s允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
自动部署和回滚
- 使用k8s描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为期望状态。例如,可以自动化k8s来为你的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
自动完成装箱计算
- 为k8s提供许多节点组成的集群,在这个集群上云霄容器化的任务。告诉k8s每个容器需要多少cpu和内存。k8s可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
自我修复
- k8s将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状态检查的容器,并且在准备好服务之前不将其通告给客户端。
密钥和配置管理
- k8s允许你存储和管理敏感信息,例如密码、OAuth令牌和SSH密钥、可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需再堆栈配置中暴露密钥。
批处理执行
- 除了服务外,k8s还可以管理你的批处理和持续集成(CI)工作负载,如有需要,可以替换失败的容器。
水平扩缩
- 使用简单的命令、用户界面或根据CPU使用率自动对你的应用进行扩缩
IPv4/IPv6双栈
- 为Pod和Service分配IPv4和IPv6地址
为可拓展性设计
- 在不改变上游源代码的情况下为你的k8s集群添加功能。
k8s架构
组件介绍
master组件
Master Node简称为Master,集群控制节点,可以看成是一个特殊的Node负责管理其他的Node。
Master具有四个组件:kube-apiserver
、etcd
、kube-scheduler
、kube-controller-manager
kube-apiserver
- 管理整个k8s所需的API接口,例如从Command Line下Kubectl指令就会吧指令送到这
- Node之间的沟通桥梁,Node直接不允许直接沟通,必须通过apiserver
- 负责k8s中请求的身份认证和授权
etcd
- 存放k8s cluster的资料作为备份,当master发生故障时,可以透过etcd还原k8s的状态。
kube-controller-manager
- 管理并运行kubernetes controller,controller是负责监视cluster状态的Process,如Node controller、Replication controller。
- Process会在Cluster与预期状态不符时尝试更新现有状态。例如要多开一台机器以应付流量时,预期状态会更新成N+1,但现有状态为N,因此这时相对应的Controller就会想办法多开一台机器
kube-scheduler
- 整个k8s上得调度员,scheduler会监视新建立但还没有被指定要放在哪个Node上得Pod,并根据每个Node上得资源规定、硬件限制等条件去协调一个最适合的Node让Pod运行。
Pod
Pod是k8s运行的最小部署单位,一个Pod可以由一个或多个容器组成,而这些Pod具有以下几个特点:
- 每个Pod都有属于各自独立的
yaml
- 同一个Pod中的容器共享同样的网络和资源,彼此以local number port通信。
- 一个Pod可以容纳多个容器,但是一般情况建议一个Pod对应一个容器;然后如果多个容器的应用会高度耦合,即这些应用必须使用相同的资源,像以前还没有容器概念时,有些应用必须要放在同一个主机或虚拟机上,这种情况就会把多个容器放在同一个Pod
Worker Node
Worker Node 简称Node,是k8s运行的最小硬件单元,一个Node对应一个机器。
每个Node 都有三个组件:kublet、kube-proxy、Container Runtime
kubelet
- 该Node的管理员,负责管理该Node上的所有Pod的状态并负责与Master沟通。Master负责管理Node
kube-proxy
-该Node上得通讯员,负责更新Node的Iptables,让其他不在该Node中的物件可以得知该Node上所有Pod的最新状态。
Container Runtime
- 该Node真正负责容器执行的程序,如 Docker 容器的 Container Runtime 即為 Docker Engine。