本文最后更新于 259 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
Kubernetes概述
一.Kubernetes概述
1.有了Docker为什么还用Kubernetes
为了提高业务并发和高可用,会使用多台服务器,因此会面临以下问题:
(1)多容器跨主机提供服务;
(2)多容器分布节点部署;
(3)多容器怎么升级;
(4)怎么高效管理这些容器;
......
早期的容器编排三剑客为:Kubernetes(简称"K8S"),Docker Swarm,Mesos Marathon。
目前K8S已经成为容器编排的事实标准,其它两个容器编排工具已经逐渐没落。
2.Kubernetes是什么
Kubernetes是Google在2014年开源的一个容器集群管理系统(也称为编排工具),Kubernetes简称"K8S"。
Kubernetes用于容器化应用程序的部署,扩展和管理,模板是让部署容器化应用简单高效。
官方文档:
https://kubernetes.io/docs/home/
GitHub地址:
https://github.com/kubernetes/kubernetes
推荐阅读:
https://kubernetes.io/docs/concepts/
https://kubernetes.io/docs/tasks/
3.Kubernetes的核心功能
(1)自动化上线和回滚
Kubernetes会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。
如果出现问题,Kubernetes 会为你回滚所作更改。你应该充分利用不断成长的部署方案生态系统。
(2)服务发现与负载均衡
无需修改你的应用程序即可使用陌生的服务发现机制。
Kubernetes为容器提供了自己的IP地址和一个DNS名称,并且可以在它们之间实现负载均衡。
(3)存储编排
自动挂载所选存储系统,包括本地存储、诸如GCP或AWS之类公有云提供商所提供的存储或者诸如NFS、iSCSI、Gluster、Ceph、Cinder 或 Flocker 这类网络存储系统。
(4)Secret和配置管理
部署和更新Secrets和应用程序的配置而不必重新构建容器镜像,且不必将软件堆栈配置中的秘密信息暴露出来。
(5)自动装箱
根据资源需求和其他约束自动放置容器,同时避免影响可用性。
将关键性工作负载和尽力而为性质的服务工作负载进行混合放置,以提高资源利用率并节省更多资源。
(6)批量执行
除了服务之外,Kubernetes 还可以管理你的批处理和 CI 工作负载,在期望时替换掉失效的容器。
(7)IPv4/IPv6 双协议栈
为Pod和Service分配IPv4和IPv6地址
(8)水平扩缩
使用一个简单的命令、一个UI或基于CPU使用情况自动对应用程序进行扩缩。
(9)自我修复
重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会将它们公布给客户端。
(10)为扩展性设计
无需更改上游源码即可扩展你的 Kubernetes 集群。
推荐阅读:
https://kubernetes.io/zh/
https://queue.acm.org/detail.cfm?id=2898444
4.kubernetes简史
2014年 docker容器编排工具,立项
2015年7月 发布kubernetes 1.0, 加入cncf基金会 孵化
2016年,kubernetes干掉两个对手,docker swarm,mesos marathon 1.2版
2017年 1.5 -1.9
2018年 k8s 从cncf基金会 毕业项目1.10 1.11 1.12,1.13
2019年: 1.14,1.15,1.16,1.17
2020年: 1.18, 1.19,1.20,1.21
2021年: 1.22
cncf :
cloud native compute foundation 孵化器
kubernetes (k8s):
希腊语 舵手,领航者 容器编排领域,
谷歌15年容器使用经验,
borg容器管理平台,使用golang重构borg,kubernetes
推荐阅读:
https://kubernetes.io/releases/patch-releases/#1-22
https://github.com/kubernetes/kubernetes
https://kubernetes.io/releases/release/
温馨提示:
k8s的称呼并非空穴来风,可百度搜索"i18n"(是“国际化”的简称,全称为"internationalization")。
5.kubernetes的应用场景很适合微服务
微服务(或微服务架构)是一种云原生架构方法,其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。
微服务是一种开发软件的架构和组织方法,其中软件由通过明确定义的 API 进行通信的小型独立服务组成。这些服务由各个小型独立团队负责。
微服务架构使应用程序更易于扩展和更快地开发,从而加速创新并缩短新功能的上市时间。
通过整体式架构,所有进程紧密耦合,并可作为单项服务运行。这意味着,如果应用程序的一个进程遇到需求峰值,则必须扩展整个架构。随着代码库的增长,添加或改进整体式应用程序的功能变得更加复杂。这种复杂性限制了试验的可行性,并使实施新概念变得困难。整体式架构增加了应用程序可用性的风险,因为许多依赖且紧密耦合的进程会扩大单个进程故障的影响。
使用微服务架构,将应用程序构建为独立的组件,并将每个应用程序进程作为一项服务运行。这些服务使用轻量级 API 通过明确定义的接口进行通信。这些服务是围绕业务功能构建的,每项服务执行一项功能。由于它们是独立运行的,因此可以针对各项服务进行更新、部署和扩展,以满足对应用程序特定功能的需求。
微服务的特性
(1)自主性:可以对微服务架构中的每个组件服务进行开发、部署、运营和扩展,而不影响其他服务的功能。这些服务不需要与其他服务共享任何代码或实施。各个组件之间的任何通信都是通过明确定义的API进行的。
(2)专用性:每项服务都是针对一组功能而设计的,并专注于解决特定的问题。如果开发人员逐渐将更多代码增加到一项服务中并且这项服务变得复杂,那么可以将其拆分成多项更小的服务。
微服务的优势
(1)敏捷性:微服务促进若干小型独立团队形成一个组织,这些团队负责自己的服务。各团队在小型且易于理解的环境中行事,并且可以更独立、更快速地工作。这缩短了开发周期时间。您可以从组织的总吞吐量中显著获益。
(2)灵活扩展:通过微服务,您可以独立扩展各项服务以满足其支持的应用程序功能的需求。这使团队能够适当调整基础设施需求,准确衡量功能成本,并在服务需求激增时保持可用性。
(3)轻松部署:微服务支持持续集成和持续交付,可以轻松尝试新想法,并可以在无法正常运行时回滚。由于故障成本较低,因此可以大胆试验,更轻松地更新代码,并缩短新功能的上市时间。
(4)技术自由:微服务架构不遵循“一刀切”的方法。团队可以自由选择最佳工具来解决他们的具体问题。因此,构建微服务的团队可以为每项作业选择最佳工具。
(5)可重复使用的代码:将软件划分为小型且明确定义的模块,让团队可以将功能用于多种目的。专为某项功能编写的服务可以用作另一项功能的构建块。这样应用程序就可以自行引导,因为开发人员可以创建新功能,而无需从头开始编写代码。
(6)弹性:服务独立性增加了应用程序应对故障的弹性。在整体式架构中,如果一个组件出现故障,可能导致整个应用程序无法运行。通过微服务,应用程序可以通过降低功能而不导致整个应用程序崩溃来处理总体服务故障。
二.Kubernetes集群架构与组件:star:
在K8S早期版本,其架构分为两个部分,一个是管理节点(Kubernetes Master),一个是工作节点(Kubernetes Node)。
在Kubernetes最新版本中,其架构稍微是有些变动的。比如早期的Kubelet和cAdvisor组件是分开的,而新版本中cAdvisor已经集成到Kubelet(在k8s1.5版本中就可以得到验证)。不仅如此还引入了很多新的组件。
推荐阅读:
https://kubernetes.io/docs/concepts/overview/components/
1.Control Plane组成部分
Scheduler:
kube-scheduler根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
Controller Manager:
Kube-controller-manager,处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。
Cloud Controller Manager:
用在云平台上的Kube-controller-manager组件。如果我们直接在物理机上部署的话,可以不使用该组件。
API Server:
kube-apiserver,集群的统一入口,各组件协调者,以RESTFUL API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给etcd存储。
Etcd:
分布式键值存储系统,用于保存集群状态元数据信息,比如Pod,Service等对象信息。这个数据库是可以单独拿出来部署,只需要API server可以连接到该分布式数据库集群即可。
2.Node组成部分
kubelet:
可以理解为Master在工作节点上的Agent,管理本机运行容器的生命周期,比如创建容器,Pod挂载数据卷,下载secret,获取容器的节点状态等工作。kubelet将每一个Pod转换成一组容器。
kube-proxy:
在工作节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。换句话说,就是用于负责Pod网络路由,用于对外提供访问的实现。可以找到你关心的项目所在的pod节点。
POD:
用户划分容器的最小单位,一个POD可以存在多个容器。
docker/rocket(rkt,已停止支持):
容器引擎,用于运行容器。
3.附加组件(Add-ons)基本上都是以容器的形式运行在集群中
除了上面提到的核心组件,还有一些推荐的附加组件(Add-ons)
kube-dns:
负责为整个集群提供DNS服务。
Ingress Controller:
为服务提供外网入口。
Heapster:
提供资源监控。
Dashboard:
提供GUI。
Federation:
提供跨可用区的集群。
Fluentd-elasticsearch:
提供集群日志采集、存储与查询。
温馨提示:
附加组件(Add-ons)基本上都是以容器的形式运行在集群中哟~后面会有相应的章节进行讲解。
三.kubernetes的安装方式
1.yum安装
很适合新手安装,学习安装即可。
2.kind
kind让你能够在本地计算机上运行Kubernetes。 kind要求你安装并配置好Docker。
推荐阅读:
https://kind.sigs.k8s.io/docs/user/quick-start/
3.minikube
minikube 是一个工具, 能让你在本地运行 Kubernetes。
minikube 在你本地的个人计算机(包括 Windows、macOS 和 Linux PC)运行一个单节点的 Kubernetes 集群,以便你来尝试 Kubernetes 或者开展每天的开发工作。因此很适合开发人员体验K8S。
推荐阅读:
https://minikube.sigs.k8s.io/docs/start/
4.kubeadm
kubeadm:
你可以使用kubeadm工具来创建和管理Kubernetes集群。 该工具能够执行必要的动作并用一种用户友好的方式启动一个可用的、安全的集群。
推荐阅读:
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
5.二进制安装
安装步骤比较繁琐,但可以更加了解细节。适合运维人员生产环境中使用。
6.源码编译安装
难度最大,请做好各种故障排查的心理准备。其实这样一点对于K8S二次开发的人员应该不是很难。
7.kubectl是Kubernetes命令行工具
kubectl使得你可以对Kubernetes集群运行命令。
你可以使用kubectl来部署应用、监测和管理集群资源以及查看日志。
推荐阅读:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
8.强烈推荐阅读
大规模集群的注意事项:
https://kubernetes.io/zh/docs/setup/best-practices/cluster-large/