基础架构
Kubernetes 是一个跨主机集群的 开源的容器调度平台,它可以自动化应用容器的部署、扩展和操作 , 提供以容器为中心的基础架构。
使用 Kubernetes, 您可以快速高效地响应客户需求:
- 快速、可预测地部署您的应用程序
- 拥有即时扩展应用程序的能力
- 不影响现有业务的情况下,无缝地发布新功能
- 优化硬件资源,降低成本
我们的目标是构建一个软件和工具的生态系统,以减轻您在公共云或私有云运行应用程序的负担。
Kubernetes 具有如下特点:
- 便携性: 无论公有云、私有云、混合云还是多云架构都全面支持
- 可扩展: 它是模块化、可插拔、可挂载、可组合的,支持各种形式的扩展
- 自修复: 它可以自保持应用状态、可自重启、自复制、自缩放的,通过声明式语法提供了强大的自修复能力
集群有Master和Node节点,架构如下:
其中:
- etcd 保存了整个集群的状态,就是一个数据库,只有API Server能与其通信;
- apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
- controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
- kubelet 负责维护容器的生命周期,同时也负责 Volume(CSI)和网络(CNI)的管理;
- Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
- kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;
scheduler
和controller-manager
都是通过apiserver
从etcd
中获取各种资源的状态,进行相应的调度和控制操作。
除了上面的这些组件,还有一些第三方的组件:
- kube-dns 负责为整个集群提供 DNS 服务
- Ingress Controller 为服务提供外网入口
- Heapster 提供资源监控
- Dashboard 提供 GUI
组件之间的关系:
从上面图可以看到所有组件均是通过API Server进行通信,所以API Server就是一个中枢神经,在生产中我们会把master部署为多节点,做高可用。
etcd主要是存储集群里的信息,比如集群状态,集群的各Node信息等,只有API能与其通信,所以我们也会把etcd做高可用,etcd是一个单独的组件,一个应用软件,做高可用建议是奇数节点,比如3,5等,节点不应过多,因为节点过多,节点之间的数据同步是会有一定的开销,影响集群的性能。
Schduler负责整个集群的调度,它通过API Server来检测Node上Pod的状态,然后会根据定义的策略来调度pod并绑定Node。
Controller manager负责pod的控制,常见的比如定义了一个Pod为replicaSet,然后因为某些原因当前pod挂掉了,这时候Controller manager就会为你在Node上重启该Pod。
kubelet是Node上的组件,它会检测Node上的Pod,并将其状态更新到API Server。
kube-proxy主要是负责代理转发,主要控制service,并将sevice状态更新到API Server。
kubectl是集群的管理组件,主要也是调用API Server,然后进行整个集群的管理。
高可用
Kubernetes 集群,在生产环境,必须实现高可用:
- 实现Master节点及其核心组件的高可用;
- 如果Master节点出现问题的话,那整个集群就失去了控制;
具体的 HA 示意图:
具体工作原理:
- etcd 集群:etcd集群建议和主集群分开,3个节点允许一个容错,5个节点允许2个容错,根据实际情况进行选择
- master集群: 对master节点来说一般3个节点就够了,主要需要我们做高可用的组件是apiserver,我们可以在前面做一个负载均衡器,比如加一个Nginx,Nginx还可以通过keepalived做高可用,工作节点和客户端通过这个负载均衡器(VIP)和apiserver进行通信
pod-master
保证仅是主master
可用,scheduler、controller-manager 在集群中多个实例只有一个工作,其他为备用