什么是Kubernetes
Kubernetes 是 Google 开源的基于容器技术的分布式架构领先方案,提供应用部署、维护、扩展机制等功能,利用 Kubernetes 能方便地管理跨机器运行容器化的应用。
单容器( contianer )所遇到的问题
- 需要被管理
- 网络环境复杂
- 容器需要被调度、分发,以及配置负载均衡
- 数据需要被保存在其他地方
即
- 使用 Docker 对应用程序打包、实例化、运行
- 以集群的方式运行、管理跨机器的容器
- 解决 Docker 跨机器容器之间的通讯问题
核心概念
分为 master 和 node 节点,master 为集群控制节点
master 节点通常会占据一个独立的服务器(高可用部署建议使用三台服务器(如果 master 和 etcd 部在一起的话))
master上:etcd, controller, scheduler, api server
- etcd: key-value 存储,集群状态管理,是运行在多节点上的分布式键值存储,高可用(奇数个,必须半数以上的选举,容错能力限制于节点数的一半,选举 raft)
- controller:控制器(多个控制器组成)选举
- scheduler:调度器,负责资源调度(pod 调度)的进程 选举。scheduler 的职责很明确,就是负责调度 pod 到合适的 Node 上。如果把 scheduler 看成一个黑匣子,那么它的输入是 pod 和由多个 Node 组成的列表,输出是 Pod 和一个 Node 的绑定,即将这个 pod 部署到这个 Node 上。Kubernetes 目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。
- api server:暴露接口,处理请求。提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制。APIServer负责对外提供RESTful的 Kubernetes API 服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给 APIServer 处理后再提交给 etcd,kubectl( Kubernetes 提供的客户端工具,该工具内部就是对 Kubernetes API 的调用)是直接和 APIServer 交互的。
node上:kubelet, kubeproxy, runtime
- kubelet:管理 pod,负责 pod 对应的容器的创建、启停等任务,同时与 master 节点密切协作,实现集群管理的基本功能
- kubeproxy: 实现 kubernetes service 的通信与负载均衡机制的重要组件
- runtime: runtime 指的是容器运行环境,目前 Kubernetes 支持 docker 和 rkt 两种容器。
除了核心组件,还有一些推荐的 Add-ons:
- kube-dns:负责为整个集群提供 DNS 服务
- Ingress Controller:为服务提供外网入口
- Heapster:提供资源监控
- Dashboard:提供GUI
- Federation:提供跨可用区的集群
- Fluentd-elasticsearch:提供集群日志采集、存储与查询
网络预置
- 所有 pods 之间可以相互通信
- 所有 pods 和 nodes 可以相互通信
- 不做 NAT
设计原则
声明式编程(Declarative)
声明式与命令式的区别
Declarative 的定义是用户设定期望的状态,系统会知道它需要执行什么操作,来达到期望的状态。
而对于 Imperative,需要用户告诉系统需要做什么。比如说用户说创建一个新的 Container,系统才会创建一个新的 Container。
Level-triggered
Pod
基本概念
- Kubernetes 中最小计算和被调度单元
- 是多个容器的集合,pod 中的容器共享 namespace 和 volume
- 一 pod 一 ip
pod 的五大状态(生命周期,pod phase)
- Pending:系统已经接受 pod 实例的创建,但其中所包含容器的一个或者多个 image 还没有创建成功。Pending 包含调度计算与通过网络创建 image,所以此 phase 的时间可能会有点长。
- Running:Pod 已经被调度到某个 node 上,pod 包含的所有容器已经创建完成,至少有一个容器正常运行或者处于启动与重启动过程。
- Failed:Pod 中所有容器已终止运行,至少有一个容器非正常结束,比如退出码非零,被系统强制杀死等。
- Succeeded:Pod 中的所有容器正常终止,并且不会再次启动。
- Unknown:无法取得 pod 状态,一般是网络问题引起。
pod 的重启策略
- Always:总是重启
- Never:从不重启
- OnFailure:失败时重启
API
API 资源结构
- apiVersion:api 版本
- kind:资源类型
- metadata:元数据
- spec:Spec 是让用户写入期望的状态,系统可以通过 Spec 读出用户的期望
- status:Status 是系统写入观察到的状态,用户可以从中读出系统当前是什么状态
API 扩展方法
- CRD:自定义 api
- aggregator:让用户利用全部的 Kubernetes API 实现自己的 apiserver,封装服务层
RC, RS, Deployment
RC
推荐使用 RS + Deployment 来代替 RC
是比 pod 高一级的存在
RC 与 Pod 的关联是通过 Label 来实现的(通过 selector)
Label 是键值对,可用于筛选资源
RS
大部分与 RC 相同,除了 rolling update (RS 特有)
Deployment
比 RS 高一级的定义微服务应用的抽象层
Deployments 创建 RS
PV, PVC
PV 与 PVC 一一对应
管理员定义 PV, 用户使用 PVC