什么是kubernetes
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
为什么要用kubernetes
传统部署:
缺点:
- 隔离性差
- 不能负载均衡
虚拟化部署:
解决了隔离性差的问题,但是虚拟机会消耗大量的资源。
缺点:
- 不能负载均衡
- 虚拟机消耗资源多
容器部署:
解决了上面的问题,即保证了隔离性和负载均衡,又不会消耗大量资源。
kubernetes特点
- 自我修复
- 弹性伸缩
- 自动部署和回滚
- 服务发现和负载均衡
- 机密和配置管理
- 存储编排
- 批处理
集群架构与组件
有状态服务和无状态服务
有状态服务
定义
会对运行环境产生依赖,比如会将文件存到本地硬盘等
代表应用
mysql、redis等
优点
可以独立存储数据,实现数据管理
缺点
集群环境下需要实现主从、数据同步、备份、水平扩容等
无状态服务
定义
不会对运行环境产生依赖,比如不会将文件存到本地硬盘等
代表应用
nginx、apache等
优点
对客户端透明,无依赖关系、可以高效实现扩容、迁移
缺点
不能存储数据,需要额外的数据服务支撑
对象的规约和状态
规约是指用户期望的状态
状态是实际的状态
资源的分类
集群级别的资源
- Namespace
- Node
- ClusterRole
- CulsterRoleBinding
命名空间级别的资源
Pod
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。
RC、RS和Deployment(适用于无状态服务)
- Replication Controller 简称 RC,RC 是 Kubernetes 系统中的核心概念之一,简单来说,RC 可以保证在任意时间运行 Pod 的副本数量,能够保证 Pod 总是可用的。
- ReplicaSet(RS) 跟 RC 没有本质的不同,只是名字不一样,并且 RS 支持集合式的 selector。
- Deployment 为 Pod 和 Replica Set 提供声明式更新。
StatefulSet(适用于有状态服务)
- 稳定的持久化存储
- 稳定的网络标志
- 有序部署,有序扩展
- 有序收缩,有序删除
DaemonSet(守护进程)
DaemonSet 保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:
日志收集,比如 fluentd,logstash 等
系统监控,比如 Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond 等
系统程序,比如 kube-proxy, kube-dns, glusterd, ceph 等
Service
“Service” 简写 “svc”。Pod 不能直接提供给外网访问,而是应该使用 service。Service 就是把 Pod 暴露出来提供服务,Service 才是真正的“服务”
Ingress
Ingress 可以提供外网访问 Service 的能力。可以把某个请求地址映射、路由到特定的 service。
ingress 需要配合 ingress controller 一起使用才能发挥作用,ingress 只是相当于路由规则的集合而已,真正实现路由功能的,是 Ingress Controller,ingress controller 和其它 k8s 组件一样,也是在 Pod 中运行。
元数据级别的资源
- Horizontal Pod Autoscaler(HPA)
- PodTemplate
- LimitRage