Kubenetes 的特点:
- 轻量级 消耗的资源比较小
- 开源 免费
- 弹性伸缩 可以动态的扩缩容
- 负载均衡 kubenetes 自己本身带有负载均衡 IPVS
K8S 的基础概念
Pod 的概念:
Pod 的分类;
自主式pod: 一旦死亡,不会被自动拉起来,也不会有副本数。
被控制器管理的pod: 可以被重启,生产pod 副本数
在同一个pod 里,容器的端口不能重复
控制器管理的pod :
RC :用来确保容器的副本数始终保持在用户定义的副本数,如果有容器异常退出会创建新的pod 的来代替,如果容器多余定义的副本数,多余的容器会被收回
RS : 与RC 没有本质上的却别,RS 支持集合式的selector
Deployment : 可以用用deployment 在自动管理rs ,这样不用担心与其他机制不兼容的问题。Deployment 是支持滚动更新的 滚动更新的概念(deployment 下管理的rs 的pod 要升级,deployment 下会多有个rs 的集群,在新的rs 里新建升级版本的pod,另一个rs 会缩减一个pod, 这样依次知道新的rs 的pod 完全取缔了旧的rs 完成升级。 回滚的话相反。 )
HPA ;
在v1 的版本中支持根据cpu 进行扩容, 当hpa 检查到cpu 使用率到了80% 会自动扩建pod ,如果cpu 还是80% 会一直创建,知道cpu 使用率小于80% 才会停止扩建,最多扩10个,如果cpu 使用率降低了,pod 会被回收,最低回收到2个
Statefulset : 为解决有状态服务问题
稳定的持久化存储
稳定的网络标志
有序部署有序扩展
有序收缩有序删除
Daemonset: 确保全部(或者一些)node 上运行一个pod 副本,当有node 加入集群的时候,也会为他新增一个pod ,当有node 从集群移除,这些pod 也会被回收,删除daemonset 将会删除它创建的所有的pod
我们在管理node 可以打污点,打了污点的node 是可以不被管控的
使用daemonset的一些典型用法:
运行集群存储daemon,eg 在每个node 节点上的运行glusterd 、ceph
每个node 上运行日志收集的daemon eg: fluentd logstash
每个node 上运行监控daemon eg; prometheus Node exporter
Job: 负责批处理任务,即仅执行一次的任务,他保证批处理任务一个s或着多个pod 的成功结束 (job 如果判断执行是否成功,成功才会退出,也可以设置成功的次数,成功两次可以退出等)
Cron job: 管理基于时间的job 即:
在给定时间只执行一次
周期性的在给定时间点运行。
服务发现:
客户端想访问一组pod ,如果pod 无相干是不可以被service代理的。这一组pod 必须是有同样的标签或者是通过一个rc 或者rs 创建的。Service 收集pod 是根据pod 的标签收集的。 客户端访问是service 的ip+端口 来访问pod
网络通讯的方式:
K8S 的网络模型假定了所有的pod 都在一个可以直接连通的扁平的网络空间里。
GCE:是现成的网络模型,K8S 假定这个网络已经存在了,而在私有云的搭建K8S ,这个就不能假定这个网络空间存在,需要我们自己实现这一假设,将不同节点的容器相互访问都打通了。才能运行K8S
同一个pod内多个容器: 我们pod 创建出来后会有一个pause 容器的网络栈,pod 内容器的通讯是走的localhost 方式访问。
各个pod 之间的通讯:overlay network
Overlay network 的实现:flannel 是针对K8S 设计的一个网络规划服务,它实现了集群中不同节点的主机创建的docker 容器都具有全集群唯一的虚拟ip 地址,他还能在这些ip 地址之间建立一个覆盖网络(overlay network) 通过这个覆盖网络将数据包原封不断的传递到目标容器中