大家好,我是小白。下面由我给白白们讲解一下云计算火热的容器编排之王Kubernetes…
上文咱们讲解了Linux容器技术docker,有些基础后理解Kubernetes后就更好理解啦~
简言之呢,docker虽然帮助我们实现了容器化,但仅仅是个使用工具,而我们并不仅仅只需要运行一个容器就能满足我们的需求,我们需要自动化部署,弹性伸缩,负载均衡,服务自动发现等等云原生的一整套的生态化需求,而这就是kubernetes能帮我们做到的。
一、何为Kubernetes
Kubernetes 是谷歌开源的容器集群管理系统,是 Google 多年大规模容器管理技术 Borg 的开源版本,主要功能包括:
基于容器的应用部署、维护和滚动升级
负载均衡和服务发现
跨机器和跨地区的集群调度
自动伸缩
无状态服务和有状态服务
广泛的 Volume 支持
插件机制保证扩展性
Kubernetes 发展非常迅速,已经成为容器编排领域的领导者。
二、Kubernetes架构
Kubernetes 主要由以下几个核心组件组成:
1.etcd 集群持久化数据存储, 保存了整个集群的状态信息等;
2.apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
3.controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
4.scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
5.kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
6.Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
7.kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡
除了核心组件,还有一些推荐的 Add-ons:
*kube-dns 负责为整个集群提供 DNS 服务
*Ingress Controller 为服务提供外网入口
*Heapster 提供资源监控
*Dashboard 提供 GUI
*Federation 提供跨可用区的集群
*Fluentd-elasticsearch 提供集群日志采集、存储与查询
三、Kubernetes 设计理念
1.API设计
*所有API应该是声明式的。
*API对象是彼此互补而且可组合的。
*高层API以操作意图为基础设计
*低层API根据高层API的控制需要设计
*尽量避免简单封装,不要有在外部API无法显式知道的内部隐藏的机制
*API操作复杂度与对象数量成正比
*API对象状态不能依赖于网络连接状态
*尽量避免让操作机制依赖于全局状态,因为在分布式系统中要保证全局状态的同步是非常困难的。
2.控制机制设计
*控制逻辑应该只依赖于当前状态。
*尽量避免复杂状态机,控制逻辑不要依赖无法监控的内部状态。
*假设任何错误的可能,并做容错处理。
*假设任何操作都可能被任何操作对象拒绝,甚至被错误解析。
*每个模块都可以在出错后自动恢复。
*每个模块都可以在必要时优雅地降级服务。
3. 架构设计
*只有apiserver可以直接访问etcd存储,其他服务必须通过Kubernetes API来访问集群状态
*单节点故障不应该影响集群的状态
*在没有新请求的情况下,所有组件应该在故障恢复后继续执行上次最后收到的请求(比如网络分区或服务重启等)
*所有组件都应该在内存中保持所需要的状态,apiserver将状态写入etcd存储,而其他组件则通过apiserver更新并监听所有的变化
*优先使用事件监听而不是轮询
四、Kubernetes核心概念
pod: 一组容器集合,k8s最小调度部署单元
*k8s不能直接控制容器,通过控制pod来间接管理容器
*pod是由pod templates创建而来的,pod template包含于控制器中
*不同控制器对模板的处理方式方式不同,比如,有的会立即删除旧pod,依据新模板创建新pod来保持最新
*一个pod包含一个或多个容器
*一个pod的所有容器共享共享 PID、IPC、Network 和 UTS namespace
*重启一个pod中的容器不会重启pod,因为pod不是进程而是一个容器运行环境,pod会一直存在除非它被删除
pod生命周期中的状态/阶段
*pending:k8s已经知道pod的存在,此时pod还没完全准备好,比如容器还没创建完成、正在下载镜像等,即在做前期的准备工作
*running:pod已经分配到一个节点上了,并且至少有一个容器在运行
*succeeded:终止在pod上的所有容器,全部成功终止,且不重启
*unknown:由于出现了一些错误而使非上边提到的任何一种状态
*failed:终止pod上所有rq,有的容器关闭失败
pod的生命和人类一样,只有一次,从出生到死亡,不可重活
控制器controller:控制器,控制pod(启动、停止、删除……)
*ReplicaSet:确保预期pod副本数,保证任何时候都是固定pod数量在工作(动态地根据需求增删pod),通过Deployment来设置ReplicaSet
*ReplicationController:自动增删pod,同ReplicaSet功能相同,ReplicaSet是它的升级版
*Deployment:无状态应用部署,是比ReplicationController更高一层的api,还可以更新回滚ReplicaSet
*StatefulSet:有状态应用部署
*DaemonSet:确保所有node运行同一个pod
*Job:一次性任务,
*Cronjob:定时任务
服务service:将一组相关pod关联起来,对外提供服务,提供统一入口,使得pod地址改变不影响服务
*提供负载均衡
*服务的自动发现
*内部DNS域名服务
*定义相关pod访问策略
标签label:标记pod,node等资源
*便于识别pod,node
*亲和反亲和等策略
命名空间namespace:提供逻辑隔离
*租户隔离