k8s中大部分概念如node/pod等都可以看做资源对象,k8s其实是一个高度自动化的资源控制系统,通过跟踪比对etcd里的资源期望状态和当前环境里的实际资源状态差异来实现自动控制和自动纠错的高级功能。
Kubernetes集群的两种类型资源
Master节点:协调控制整个集群。
Node节点:运行应用的工作节点。
- Master组件负责整个集群的管理和控制。基本上所有的控制命令都发给它,命令都是在master节点上运行的,他来负责整体的执行过程,一般独自占一台机器,如果宕机或不可用,那么对容器应用的控制将失效。
- kube-apiserver 网关,用于暴露Kubernetes API,k8s所有资源增删改查操作的唯一入口。
- etcd 是Kubernetes提供默认的存储系统,保存所有集群数据
- kube-controller-manager 资源对象的自动化控制中心
- kube-schedule 负责资源调度的进程
节点(Node)组件
Node是物理机。提供Kubernetes运行时环境,以及维护Pod。可以在运行期间动态增加到k8s集群中,前提是这个节点已正确安装
- kubelet负责pod对应容器的创建、启停等任务,同时与master密切协作,实现集群管理的基本功能
- kube-proxy 实现k8s service的通信和负载均衡的重要组件
每个Node都会运行pod的一些必要服务包括Docker、kubelet和kube-proxy,并由Master组件进行管理
目前,有三个组件与Kubernetes节点接口进行交互:节点控制器(node controller)、kubelet和kubectl。
Node是Kubernetes REST API中的最高级别资源。
label Selector
使用label和label Selector可以给对象创建多组标签,label和label Selector共同构成了k8s系统中最核心的应用模型,使得被管理对象能够被精细的分组管理,同时实现了整个集群的高可用性。
namespaces
kubernetes最重要的对象Pod。
Kubernetes REST API中的所有对象都用Name和UID来明确地标识。
Name在一个对象中同一时间只能拥有单个Name,删除一个namespace会自动删除所有属于该namespace的资源。命令行操作NameSpace:
kubectl create namespace new-namespace
kubectl create -f ./my-namespace.yaml
kubectl delete namespaces new-namespace
kubectl get namespaces //列出当前群集中的namespace
volume
Kubernetes Volume具有明确的生命周期 - 与pod相同。而Docker的Volume只是磁盘中的一个目录,生命周期不受管理。
Kubernetes支持Volume类型有:emptyDir、hostPath等,只要Node上的Pod一直运行,Volume就会一直存在。
当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。
在同一个pod中的多个容器能够共享pod级别的存储卷volume。
Annotations
Annotations就如标签一样,也是由key/value组成:
–构建、发布的镜像信息,如时间戳,发行ID,git分支,PR编号,镜像hashes和注Registry地址。
- 一些日志记录、监视、分析或audit repositories。
- 一些工具信息:例如,名称、版本和构建信息。
- 用户或工具/系统来源信息,例如来自其他生态系统组件对象的URL。
- 负责人电话/座机,或一些信息目录。
pod
Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。
一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。
Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。有点类似serverrole
- Pod中运行一个容器。“one-container-per-Pod”模式是Kubernetes最常见的用法;
在这种情况下,你可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。 - 如果Pods中运行多个需要一起工作的容器。它们之间能够共享资源,在单个Pod中共同管理多个容器是一个相对高级的用法
- 每个Pod被分配一个独立的IP地址,Pod可以指定一组共享存储volumes。
【注意点】重启Pod中的容器跟重启Pod不是一回事。Pod只提供容器的运行环境并保持容器的运行状态,重启容器不会造成Pod重启。
kubernetes中,pod大部分场景下只是容器的载体而已,通常需要通过Deployment、RC等对象来完成一组pod的调度和自动控制功能。
replicaSet
官方建议使用Deployment来管理ReplicaSet,这意味着我们不需要操作ReplicaSet对象,而是使用Deployment管理 。RS主要是用来维护POD
ReplicaSet(RS)副本集是Replication Controller(RC)的升级版本,用来保证pod的高可用
通过监控运行中的pod来保证集群中运行指定数量的pod副本,少于指定数目就会根据模板创建,多了就会杀死多余的pod副本。
replication理解为复制品、副本
rc其实是定义了一个期望的场景,包含三个部分:期待的副本数(replicas),用于筛选目标pod的label selector,以及副本数量小于预期数时用于创建新pod的模板。
deployment
你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。
真正支持滚动更新的组件是Deployment,而不是ReplicaSet。通过Deployment创建ReplicaSet实现滚动更新。
StatefulSet 有状态服务
Deployment只能部署无状态服务,如web服务,而项Mysql这样的有实时数据需要保存,在pod生命周期结束后,会销毁,就不适合用Deployment来部署,这时可以考虑StatefulSet。
service
- 如何实现均衡?
service其实是一个虚拟ip,请求转发通过service来实现负载均衡。service是通过iptables或ipvs做数据包的转发。service通过标签选择器来控制一组pod。 - 如果pod挂掉,service又是如何发现呢?
每个node节点都有kube-proxy,这个是监听所有pod的组件,一旦发现pod有变化,就会更新对应的映射关系endpoints。服务的注册和发现就是通过这个组件来实现。这个组件存在于etcd中。