如有错误请批评指正,当对知识点有了新的理解会修正博客内容
k8s 是什么?
k8s 是谷歌开源的容器集群管理工具,灵感来自谷歌内部的borg 系统,那么使用容器来运行有什么优势呢?以及使用k8s的出现解决了什么问题?带给我们怎么样的便利?
我们先回顾下历史
传统部署: 一台机器上可能部署很多个应用,各个应用之间互相影响,没有隔离,如果一个应用出现问题,比如占用资源过多,那么其他的进程就有可能会被杀死。
虚拟机部署: 虚拟机可以在宿主机上运行多个操作系统,然后把每个应用放到对应的虚拟操作系统中,这样就解决了,进程之间相互影响的问题,但是又有新的问题,就是资源的利用率不高,因为虚拟机是很占内存的,而且内部运行了多个操作系统,那么宿主机的资源基本上都浪费在了虚拟机上,而且存在二级调度的问题,性能上也会有所下降。
容器部署: 可以把容器先看做一个小型的虚拟机,各个容器内的进程之前相互隔离,有自己独立的文件系统,内存,cpu ,进程空间,同时也可以共享某些资源,每个容器内置运行一个进程,不会存在虚拟机那样巨大的系统开销,因此资源的利用率非常的高,最主要的是有很好的移植性,做好镜像就可以到处运行了。
好的知道容器是个好东西了,那么k8s 能做什么呢,和容器又有啥关系???
先思考一个问题?
容器虽然把各个进程隔离开了,我们写好Dockerfile, build 成镜像后就可以 docker run 顺利的跑起来了
那么这时需要将容器部署在集群中咋办?
办法肯定是有的,比如 jenkins->ansible
ok 这是一个办法,但是可能只适合第一次部署,如果运行过程中其中一个服务挂掉了,那么又要全部重新部署,或者单独找到挂掉的服务,手动重启一下!,又或者要加一个节点怎么办???
k8s的出现就是解决上面的问题的,当然不仅仅如此
- Self-healing:自我修复
- Automatic bin packing: 自动装箱
- Service discovery and load balancing: 服务发现
- Secret and configuration management: 秘钥和配置管理
- Automated rollouts and rollbacks: 自动化部署和回滚
- Storage orchestration: 存储编排
k8s 对象的概念
(个人理解)
k8s 是一个高度抽象的系统,将我们的系统资源和运行实体看做一个个对象,所以是不是关于对k8s 的管理就可以理解为对对象的增删改查[Smirk],架构中的所有组件,就是管理这些对象的。
Kubernetes对象是Kubernetes系统中的持久实体。Kubernetes使用这些实体来表示集群的状态。具体来说,他们可以描述:
- 容器化应用正在运行(以及在哪些节点上)
- 这些应用可用的资源
- 关于这些应用如何运行的策略,如重新策略,升级和容错、
Kubernetes对象是“record of intent”,一旦创建了对象,Kubernetes系统会确保对象存在。通过创建对象,可以有效地告诉Kubernetes系统你希望集群的工作负载是什么样的。
要使用Kubernetes对象(无论是创建,修改还是删除),都需要使用Kubernetes API。例如,当使用kubectl命令管理工具时,CLI会为提供Kubernetes API调用。你也可以直接在自己的程序中使用Kubernetes API,Kubernetes提供一个golang客户端库 (其他语言库正在开发中-如Python)。
(翻译至官方文档)
在k8s 中的对象有
-
pod: pod 概念
-
service:service 概念
-
volume: volume 概念
-
namespaces: namespaces 概念
以及基于以上四个基础对象,构建了更加抽象的对象controller也就是管理一组pod,称为副本控制器
注意:这里真正管理的是controller manager 而controller只是描述期望的一个场景,如lable = nginx的pod 要三个
1、ReplicationController(RC):
负责pod的数量的维护,比如一定需要三个pod 那么 RC,一定会给你保持在三个
2、ReplicaSet (RS):
和RC
类似,但是是RC
的升级版本,和它唯一的区别是ReplicaSet
支持labels user guide中描述的set-based
选择器要求, 而RC
仅支持equality-based的选择器要求。
3、Deployment:
Deployment
又是ReplicaSet的升级,可以用来维护RS的状态,因此建议通过Deployment来操作RS
4、StatefulSet:
依然是负责副本控制的,但是和RS
不同的是StatefulSet
适合有序的稳定的副本管理,比如启动三个pod 那么就会按照0-2的顺序去启动,顺序启动的条件是前一个pod的状态是Running and Ready
后一个才会启动,如果前一个启动失败了,那么后面的就不会执行。关闭则是按照2-0的顺序。更新pod 时也会根据当前其他pod 的状态,进行可靠的调整。
所以RC 和RS 适合无序的pod
5、DaemonSet:
保证每个Node
上都会有一个Pod的副本,一般用在日志收集,监控等服务类型的Pod
6、Job:
之前所讲的副本控制器,适合长期运行的服务,而Job用于短暂任务
7、Cron Job:
用于定时任务
也就说k8s 就是通过这些对象来描述我们集群状态的,那么我们通过api server
增删改查的就是这些对象,个人觉得这是入门k8s的关键
k8s 架构
虽然看着这么多组件,但是不要担心,这些组件无非不是用来管理k8s 的对象的,只不过各司其职,这些组件和之前说的对象不同,这些组件都是进程实体。
k8s整体的架构为主从模式
- master(当官的): 一般会做
master
冗余(3个),用来维护和管理集群 - node (干活的):真正运行应用程序的机器,每个
pod
都是跑在node
上
当官的是这些:
负责资源调度,保证系统高可用,和一些常规的任务处理
1、 kube-apiserver:
概念:暴露k8s的 api ,是k8s的前端控制台(一些控制面板就是基于这些接口开发),扩展方式主要是水平方式扩展
参看文章:
构建高可用的集群
2、etcd(在架构图上没有体现出来)
概念:一致性的高可用键值对数据库,用来保存集群的所有数据信息,作为数据库那么备份就很重要了
参考文章:
etcd 的备份
3、kube-scheduler
概念:负责调度pod 应该运行在哪一个node上,比如提交了一个运行pod的请求那么这时调度器就会根据这个pod 所需要的资源,选择合适的node ,选择好合适的以后会进行二次调度选择最优的。调度器考虑的是资源的划分与分配(硬件资源,软件资源,优先级),管理程序的关联,数据位置,截止时间等
4、kube-controller-manager
概念:负责后台的一些常规处理,为了降低复杂度,可以把多个控制管理器编译为一个进程
- Node Controller: 响应node 节点的宕机
- Replication Controller: 管理副本控制器提交的需求,也就说一共六个pod 如果挂掉一个 那么就必须要在启动一个
- EndPoint Controller: 填充Endpoints对象(即连接Services&Pods)没太懂 ?
- Service Account & Token Controllers: 创建默认账户以及token 管理
5、cloud-controller-manager
未来版本的特性,主要是可以直接和云厂商进行一些交互
干活的是这些
主要的工作就是维护正在运行的pod,可以运行在每一台机器上
1、kubelet
概念:负责监控pod 是否正常运行的,但不是不会管理非k8s创建的容器
2、kube-proxy
概念:是一个网络代理,负责请求的转发支持tcp和udp,由于service有可能被替换,所以他的IP就会更改,通过kube-proxy可以更新转发规则,
3、Container Runtime
概念:指的就是容器引擎,一般是docker 但是也可以是containerd, cri-o, rktlet 等,只要实现了相关接口就可以
**如有错误请批评指正,当对知识点有了新的理解会修正博客内容**