k8s
概念

Node

一个节点就是一个物理机或者虚拟机
Pod

如图所示:在一个node中有APP应用程序、数据库应用程序
pod是k8s中的最小调度单元,它由node进行管理,一个node中可以有一个或者多个容器的组合。创建之后,k8s一般会给它们分配一个内部的ip地址,注意外部是访问不了的
一般情况下,建议一个pod中只运行一个容器,这样可以更好的实现应用程序的解耦和扩展

如图所示:pod如果发生故障的时候,k8s会销毁故障的pod,重新创建一个新的pod,此时ip地址会发生改变,如果还按照原来的ip进行访问的话,就会发生错误。k8s为了解决这个问题,引入了一个叫做Service的资源对象。
Service

Service简称svc
svc可以作为pod之间的通讯桥梁。svc将APP应用程序和数据库应用程序分成了两个部分,APP应用程序通过svc来访问数据库。数据库的pod做了集群,当某一个pod故障了,即使这个pod的ip地址发生了变化,svc会将请求发送到其他正常的pod上,因为svc的ip地址不会变
内部服务、外部服务

内部服务:不想暴露给外面的一些隐私类服务,如数据库,缓存,消息队列等
外部服务:让外部能够访问的服务,如Controller层
NodePort

NodePort会在node上开放一个端口,然后将这个端口映射到svc的ip和端口上,这样就可以通过节点ip:端口来访问svc了。
但是这种方式只适用于开发和测试阶段,实际生产阶段需要使用域名的方式,于是引入了Ingress
Ingress

Ingress是用来管理集群外部访问集群内部的桥梁,可以通过Ingress来配置不同的转发规则,从而通过不同的转发规则来访问集群内部不同的Service、Pod
也可以通过Ingress来配置域名,将原来的ip地址和端口号的方式变为域名访问
还可以配置负载均衡、SSL证书
ConfigMap

当手机应用pod想访问数据库pod的时候,需要知道URL、username、password这些信息,这些信息一般都放在配置文件中或者环境变量中,然后在应用程序中读取这些配置信息,如果进行了修改的话,需要重新编译,重新部署到集群中,导致程序不能正常运行。为了解决这个问题,k8s引入了ConfigMap
可以将这些配置信息放在ConfigMap中,然后就可以直接在应用程序中读取和使用了
有了ConfigMap,就可以将应用程序的镜像内容分离开来
当信息发生修改的时候,只需要修改ConfigMap中的内容,再重新加载Pod就可以了
数据安全

ConfigMap中的数据都是明文,容易被窃取;为了解决这个问题,首先引入的是Secret,它可以将数据做一次Base64编码,但是做一次解码就可以得到原来的数据;后来又引入了网络安全、控制访问、身份认证等等。
Volumes

如果pod被销毁,那么里面的内容也会删除,如果需要做到持久化,就需要Volumes组件,它的作用是将pod中的数据挂在到本地磁盘上,或者挂载到集群外部的远程存储上,这样即使容器被销毁或者重启,可以在Volumes中找到
Deployment高可用

如果某一个Node中的pod宕机了,k8s为了高可用,通过一个svc来管理几个Node,如果其中一个挂掉了,就会将请求发送到其他正常的Node上
k8s引入了Deployment,它可以定义和管理应用程序的副本数量和应用程序的更新策略
Pod是用来管理一个或者多个容器的
Deployment是用来管理一个或者多个Pod的
具有的特性:
- 副本控制:可以定义一个应用程序的副本数量,如上图,可以定义APP应用程序的副本(pod)数量为3,如果有副本(pod)发生故障,就会创建一个新的副本(pod)来代替它,始终保持有3个副本(pod)在集群中运行
- 滚动更新

可以定义和管理应用程序的更新策略,升级应用程序的版本,逐渐使用新的版本替换掉旧的版本,确保应用程序的平滑升级
- 自动扩缩容
StatefulSet

APP应用程序使用了Deployment进行管理,数据库应用程序应该也需要有高可用的特性。
但是使用Deployment管理会造成数据的不同步,每个pod中的数据是独立的,对于数据库来说需要保证多个副本之间的数据是一致的,于是引用了StatefulSet,它可以保证管理的pod数据一致
但是这种部署非常麻烦,另一种有效的方法是将数据库、缓存、消息队列这种有状态的应用从k8s中抽离出来,在集群外单独部署
架构
Worker-Node


每个Node中包含kubelet、kube-proxy、container-runtime
- kubelet:负责管理和维护每个节点上的Pod,也会定期从api-server组件接收新的或者修改后的pod规范,同时它也会监控工作节点的运行情况,然后将这些信息汇报给api-server
- kube-proxy:为Pod对象提供网络代理和负载均衡服务,用来接收请求,将请求发送给不同的节点上。它会在每一个Node上启动一个代理,使发往Service的流量用一种高效的方式路由到正确的后端Pod中
- container-runtime(容器运行时):运行容器的软件,负责拉取容器镜像、创建容器、启动或者停止容器等等(如Docker-Engine)
Master-Node

用于管理Worker Node,调度不同的Pod到不同的节点上、监控节点的状态、添加和删除一个节点
- api(kube-apiserver):提供k8s集群的API接口服务,所有的组件都会通过这个接口来进行通信,作为整个系统的入口;负责对整个Worker Node集群的增删改查操作和控制访问;交互的方式有命令行
kubectl,Dashboard等 - etcd:高可用的键值存储对象,用来保存集群中所有资源对象的状态信息
- c-m(ControllerManager):用于监控集群中所有的状态,如pod、node、service等,如果发现异常,会根据策略采取重启这个pod,或者使用其他的pod来替换掉它
- sched(Scheduler):负责监控集群中所有节点的资源使用情况,根据一些调度策略,将Pod调度到合适的节点上运行
- c-c-m(Cloud Controller Manager):云控制管理器,使用其他云服务自带的额外组件,负责与云平台的API进行交互





