我们学习K8s主要就是学习PodPod控制器,以及Service资源存储
K8s系统将一切事物都抽象为Api资源

POD概念

网络通讯方式

自主式POD,控制器管理的POD。
有相互影响的容器之间管理不方便例如LAMP架构。
有POD就会有pause容器。
不同容器共用pause的网络栈。
在同一个POD中容器的端口不能相同。
共享存储卷。

Pod控制器:

pod是k8s集群中工作负载型资源的基础资源。它负载运行容器,并为其解决所依赖的环境,但是当容器关闭后,pod需要将容器重建,Pod控制器就是用来控制Pod的行为。
Replicaset:用于确保每个Pod副本中容器运行的数量满足要求,换句话说就是确保Pod中的容器能够正常的运行并且可访问。满足期望值。
Deployment:它用于为Pod和Replicaset提供声明式更新,是建构在Replicaset上更为高级的控制器。高级在:(Deployment不直接创建pod而是创建replicaset并且有许多ReplicaSet没有的特性,例如滚动升级和回滚。
HPA:适用于RS和DM创建的POD。能实现水平扩展。
StatefulSet:用于管理有状态的持久化应用,例如database,它与deployment的区别在于,它会为每个Pod创建一个特殊的标识符,用来保证POD的顺序。
DaemenSet:用于确保每个Node运行了某一Pod的副本,新增的节点也会创建此副本,Node在被移除时,此Pod会被回收
Job:用于管理运行完成后即可终止的业务,如批处理作业任务。

资源管理:

在K8s系统中,一切事物都被抽象为资源,用户需要通过操作资源来管理K8s
K8s的本质是一个集群系统,用户可以在这个集群系统上部署各种服务,而所谓的部署服务,是创建容器,并将指定的服务跑在容器中。
Pod能提供服务后,我们就要考虑如何才能访问服务了,在集群内部可以直接访问,但是在集群外部访问需要使用service这个资源将服务暴露出去。
如果Pod的资源需要持久化,就需要使用到存储系统。
学习K8s就是学习如何操作POD,POD管理器,service,存储等各种资源进行操作。

资源管理方式:

命令式对象管理:通过命令直接控制资源 //简单,只能操作活动对象,无法审计,跟踪
命令式对象配置:通过命令或者配置文件控制资源 //可以审计跟踪,但是项目大时,配置文件多,操作麻烦
声明式对象配置:通过apply这个命令和配置文件控制资源。//支持目录操作,意外情况下难以调试。

Service:

问题:Podip会随着Pod的重建而发生变化,Pod提供的IP只能供系统内部使用,外部无法访问。

Service就是解决这些问题的。

Service会对提供同一个服务的多个Pod进行聚合,并且提供一个统一的入口地址,通过访问service的入口地址就能访问到后面的Pod服务。

Service只是一个概念,真正起作用的是kube-Proxy服务进程。当创建Service的时候,会通过apiserver向etcd中写入service的信息,而kube-proxy会监听这种机制产生的service变动,并将变动的service信息转换成相应的访问规则。

kube-proxy目前支持三种工作模式。
userspace,iptables,ipvs。
Userspace:当用户访问集群ip的时候,iptables会根据iptables规则将流量匹配到相应的kube-proxy监听的端口上,kube-proxy根据LB算法选择一个提供服务的Pod并和其建立连接,以将请求转发到Pod上,由于kubeproxy运行在用户空间,在进行转发处理的时候,会增加数据在内核空间和用户空间的拷贝,效率不高。

iptables:kube-proxy为service后端的每个pod创建相应的iptables规则,将发往集群ip的数据包根据iptables规则匹配重定向到后端的Pod,在次过程中kube-proxy只提供编写iptables的规则,比userspace 的效率更高,但是不能提供灵活的lb策略。后端pod不能响应时也无法进行重试。

ipvs模式:与iptables类似,kube-proxy监视后端Pod的变化,并且编写ipvs规则,转发效率更高,它还支持多种LB算法。