共计 4023 个字符,预计需要花费 11 分钟才能阅读完成。
一、Kubernetes 介绍
Kubernetes 是一个全新的基于容器技术的分布式架构领先方案, 它是 Google 在 2014 年 6 月开源的一个容器集群管理系统,使用 Go 语言开发,Kubernetes 也叫 K8S。K8S 是 Google 内部一个叫 Borg 的容器集群管理系统衍生出来的,Borg 已经在 Google 大规模生产运行十年之久。K8S 主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。2015 年 7 月,Kubernetes v1.0 正式发布,截止到 2020 年 5 月 27 日最新稳定版本是 v1.18。Kubernetes 目标是让部署容器化应用简单高效。
Kubernetes 最初源于谷歌内部的 Borg,提供了面向应用的容器集群部署和管理系统。Kubernetes 的目标旨在消除编排物理 / 虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原语上进行自助运营。Kubernetes 也提供稳定、兼容的基础(平台),用于构建定制化的 workflows 和更高级的自动化任务。
Kubernetes 具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。Kubernetes 还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。
二、Kubernetes 主要功能
Kubernetes 是 docker 容器用来编排和管理的工具,它是基于 Docker 构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件。Kubernetes 提供应用部署、维护、扩展机制等功能,利用 Kubernetes 能方便地管理跨机器运行容器化的应用,其主要功能如下:
数据卷: Pod 中容器之间共享数据,可以使用数据卷。
应用程序健康检查: 容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性。
复制应用程序实例: 控制器维护着 Pod 副本数量,保证一个 Pod 或一组同类的 Pod 数量始终可用。
弹性伸缩: 根据设定的指标(CPU 利用率)自动缩放 Pod 副本数。
服务发现: 使用环境变量或 DNS 服务插件保证容器中程序发现 Pod 入口访问地址。
负载均衡: 一组 Pod 副本分配一个私有的集群 IP 地址,负载均衡转发请求到后端容器。在集群内部其他 Pod 可通过这个 ClusterIP 访问应用。
滚动更新: 更新服务不中断,一次更新一个 Pod,而不是同时删除整个服务。
服务编排: 通过文件描述部署服务,使得应用程序部署变得更高效。
资源监控: Node 节点组件集成 cAdvisor 资源收集工具,可通过 Heapster 汇总整个集群节点资源数据,然后存储到 InfluxDB 时序数据库,再由 Grafana 展示。
提供认证和授权: 支持属性访问控制(ABAC)、角色访问控制(RBAC)认证授权策略。
除此之外, Kubernetes 主要功能还体现在:
– 使用 Docker 对应用程序包装 (package)、实例化 (instantiate)、运行 (run)。
– 将多台 Docker 主机抽象为一个资源,以集群的方式运行、管理跨机器的容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。
– 使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题 – 解决 Docker 跨机器容器之间的通讯问题。
– 自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有十个容器在运行,反而杀死多余的。Kubernetes 的自我修复机制使得容器集群总是运行在用户期望的状态. 当前 Kubernetes 支持 GCE、vShpere、CoreOS、OpenShift。
kubernetes 的集群至少有两个主机组成:master + node,即为 master/node 架构。master 为集群的控制面板,master 主机需要做冗余,一般建议为 3 台;而 node 主机不需要做冗余,因为 node 的主要作用是运行 pod,贡献计算能力和存储能力,而 pod 控制器会自动管控 pod 资源,如果资源少,pod 控制器会自动创建 pod,即 pod 控制器会严格按照用户指定的副本来管理 pod 的数量。客户端的请求下发给 master, 即把创建和启动容器的请求发给 master,master 中的调度器分析各 node 现有的资源状态,把请求调用到对应的 node 启动容器。
可以理解为 kubernetes 把容器抽象为 pod 来管理 1 到多个彼此间有非常紧密联系的容器,但是 LAMP 的容器主机 A,M,P 只是有关联,不能说是非常紧密联系,因此 A,M,P 都要运行在三个不同的 pod 上。在 kubernetes 中,要运行几个 pod,是需要定义一个配置文件,在这个配置文件里定义用哪个控制器启动和控制几个 pod,在每个 pod 里要定义那几台容器,kubernetes 通过这个配置文件,去创建一个控制器,由此控制器来管控这些 pod, 如果这些 pod 的某几个 down 掉后,控制器会通过健康监控功能,随时监控 pod,发现 pod 异常后, 根据定义的策略进行操作,即可以进行自愈。
kubernetes 内部需要 5 套证书,手动创建或者自动生成,分别为:
1. etcd 内部通信需要一套 ca 和对应证书。
2. etcd 与外部通信也要有一套 ca 和对应证书。
3. APIserver 间通信需要一套证书。
4. apiserver 与 node 间通信需要一套证书。
5. node 和 pod 间通信需要一套 ca 证书。
目前来说还不能实现把所有的业务都迁到 kubernetes 上,如存储,因为这个是有状态应用,出现错误排查很麻烦,所以目前 kubernetes 主要是运行无状态应用。
所以一般而言,负载均衡器运行在 kubernetes 之外,nginx 或者 tomcat 这种无状态的应用运行于 kubernetes 集群内部,而数据库如 mysql,zabbix,zoopkeeper 等有状态的,一般运行于 kubernetes 外部,通过网络连接,实现 kubernetes 集群的 pod 调用这些外部的有状态应用。
三、Kubernetes 架构和组件
kubernetes 主要由以下几个核心组件组成:
etcd: 集群的主数据库,保存了整个集群的状态; etcd 负责节点间的服务发现和配置共享。etcd 分布式键值存储系统, 用于保持集群状态,比如 Pod、Service 等对象信息。
kube-apiserver: 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;这是 kubernetes API,作为集群的统一入口,各组件协调者,以 HTTPAPI 提供接口服务,所有对象资源的增删改查和监听操作都交给 APIServer 处理后再提交给 Etcd 存储。
kube-controller-manager: 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;它用来执行整个系统中的后台任务,包括节点状态状况、Pod 个数、Pods 和 Service 的关联等, 一个资源对应一个控制器,而 ControllerManager 就是负责管理这些控制器的。
kube-scheduler: 资源调度,按照预定的调度策略将 Pod 调度到相应的机器上;它负责节点资源管理,接受来自 kube-apiserver 创建 Pods 任务,并分配到某个节点。它会根据调度算法为新创建的 Pod 选择一个 Node 节点。
kubectl: 客户端命令行工具,将接受的命令格式化后发送给 kube-apiserver,作为整个系统的操作入口。
kubelet: 负责维护容器的生命周期,负责管理 pods 和它们上面的容器,images 镜像、volumes、etc。同时也负责 Volume(CVI)和网络(CNI)的管理;kubelet 运行在每个计算节点上,作为 agent,接受分配该节点的 Pods 任务及管理容器,周期性获取容器状态,反馈给 kube-apiserver; kubelet 是 Master 在 Node 节点上的 Agent,管理本机运行容器的生命周期,比如创建容器、Pod 挂载数据卷、下载 secret、获取容器和节点状态等工作。kubelet 将每个 Pod 转换成一组容器。
container runtime: 负责镜像管理以及 Pod 和容器的真正运行(CRI);
kube-proxy: 负责为 Service 提供 cluster 内部的服务发现和负载均衡;它运行在每个计算节点上,负责 Pod 网络代理。定时从 etcd 获取到 service 信息来做相应的策略。它在 Node 节点上实现 Pod 网络代理,维护网络规则和四层负载均衡工作。
docker 或 rocket(rkt): 运行容器。
除了上面的几个核心组件, 还有一些常用插件 (Add-ons):kube-dns: 负责为整个集群提供 DNS 服务;Ingress Controller: 为服务提供外网入口;Heapster: 提供资源监控;Dashboard: 提供 GUI;Federation: 提供跨可用区的集群;Fluentd-elasticsearch: 提供集群日志采集、存储与查询;
其中:
master 组件包括: kube-apiserver, kube-controller-manager, kube-scheduler;
Node 组件包括: kubelet, kube-proxy, docker 或 rocket(rkt);
第三方服务:etcd
因为篇幅有限,想要更多的内容可以直接私聊客服偶!
声明:文章转载于网络,版权归原作者所有!