Kubernetes中Service、Ingress与Ingress Controller的作用与关系
- Service 是对一组提供相同功能的 Pods 的抽象,并为它们提供一个统一的入口。借助 Service,应用可以方便的实现服务发现与负载均衡。
- Ingress 是
反向代理规则
,管理外部流量进入集群的方式。用来规定 HTTP/S 请求应该被转发到哪个 Service 上,比如根据请求中不同的 Host 和 url 路径让请求落到不同的 Service 上 - Ingress Controller 就是一个反向代理程序,它负责
解析 Ingress 的反向代理规则
,如果 Ingress 有增删改的变动,所有的 Ingress Controller 都会及时更新自己相应的转发规则
,当 Ingress Controller 收到请求后就会根据这些规则将请求转发到对应的 Service。
Service 有三种类型:
- ClusterIP:通过
集群的内部 IP
公开 Service,选择该值时 Service 只能够在集群内部访问。 - NodePort:通过每个
节点上的 IP 和静态端口
(NodePort)公开 Service。 - LoadBalancer:使用
云平台的负载均衡器
向外部公开 Service - ExternalName :将 Service 映射到 DNS 名称,而不是典型的选择算符,把集群外部的服务引入到集群内部,直接使用
service ingress ingress控制器
-
服务(Service)
将在集群中运行的应用通过同一个面向外界的端点公开出去,即使工作负载分散于多个后端也完全可行。 -
Ingress
使用一种能感知协议配置的机制来解析 URI、主机名称、路径等 Web 概念, 让你的 HTTP(或 HTTPS)网络服务可被访问。 Ingress 概念允许你通过 Kubernetes API 定义的规则将流量映射到不同后端。 -
Ingress 控制器
为了让 Ingress 在你的集群中工作, 必须有一个 Ingress 控制器正在运行。你需要选择至少一个 Ingress 控制器并确保其已被部署到你的集群中。 本页列出了你可以部署的常见 Ingress 控制器。
kubernetes 持久化的存储方式
kubernetes 持久化的存储方式
- emptyDir类型的Volume在Pod分配到Node上时被创建,Kubernetes会在Node上
自动分配
一个目录,因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除
。 - hostPath Volume 是指 Pod 挂载
宿主机上的目录或文件
。 hostPath Volume 使得容器可以使用宿主机的文件系统进行存储 , hostpath (宿主机路径):节点级别的存储卷,在 pod 被删除,这个存储卷还是存在的,不会被删除
,所以只要同一个 pod 被调度到同一个节点
上来,在 pod 被删除重新被调度到这个节点之后,对应的数据依然是存在的。无法提供跨节点的数据共享。 - PersistentVolume (PV) 和 PersistentVolumeClaim (PVC): 是集群管理员配置的存储资源,而 PVC 是用户或应用程序请求存储资源的方式。PVC 与 PV 绑定后,Pod 可以通过挂载 PVC 来访问
稳定的存储空间
,即使 Pod 被重新调度
到另一个节点,数据也能保持不变
。 - CSI 提供了一种标准接口,使得
第三方
存储提供商能够将他们的存储系统集成到 Kubernetes
中,从而支持各种类型的外部存储,如商业存储解决方案和开源项目。 - StatefulSet::StatefulSet 是一种工作负载控制器,专门用于
部署有状态应用
。每个StatefulSet Pod都会自动获得一个持久化的存储卷
,确保每个实例都有唯一且持久的存储资源。
kube-proxy的三种模式
- iptables:为后端每个pod创建对应的iptables规则,直接将cluster ip的请求重定向到一个pod ip, 该模式下kube-proxy黁呢个承担起负载均衡器的角色,只负责创建iptables规则。该模式的优点是效率较高,但是不能灵活的提供LB(负载均衡)策略,当后端pod不可用时也无法进行重试
- ipvs:监控pod的变化,并创建响应的ipvs规则,ipvs相对于iptable的效率更高。除此之外,ipvs支持更多的LB算法。
statefulset
kubernetes之StatefulSet详解
有状态 vs 无状态
无状态服务
1)是指该服务运行的实例不会在本地存储需要持久化的数据
,并且多个实例对于同一个请求响应的结果是完全一致的
2)多个实例可以共享相同的持久化数据
。例如: nginx实例和tomcat实例
3)相关的k8s资源有:ReplicaSet、ReplicationController、Deployment等,由于是无状态服务,所以这些控制器创建的pod序号都是随机值。并且在缩容的时候并不会明确缩容某一个pod,而是随机的,因为所有实例得到的返回值都是一样,所以缩容任何一个pod都可以。
有状态服务
1)宠物和牛的类比,农场主的牛如果病了可以丢掉再重新买一头,如果宠物主的宠物病死了是没法找到一头一模一样的宠物的。有状态服务 可以说是 需要数据存储功能的服务、或者指多线程类型的服务,队列等。(mysql数据库、kafka、zookeeper等)
2)每个实例都需要有自己独立的持久化存储
,并且在k8s中是通过申明模板来进行定义。持久卷申明模板在创建pod之前创建,绑定到pod中,模板可以定义多个.和无状态服务相比,它多了状态保存的需求。即有数据存储功能。这类服务包括单实例的mysql。
说明: 有状态的 pod是用来运行有状态应用的,所以其在数据卷上存储的数据非常重要,在 Statefulset缩容时删除这个声明将是灾难性的,特别是对于 Statefulset来说,缩容就像减少其 replicas 数值一样简单。基于这个原因,当你需要释放特定的持久卷时,需要手动删除对应的持久卷声明。
3)相关的k8s资源为:statefulSet,由于是有状态的服务,所以每个pod都有特定的名称和网络标识。比如pod名是由statefulSet名+有序的数字组成(0、1、2…)
4)在进行缩容操作的时候,可以明确知道会缩容哪一个pod,从数字最大的开始。并且Stat巳fulset 在有实例不健康的情况下是不允许做缩容操作的
在用Deployment时,每一个Pod名称是没有顺序的,是随机字符串,因此是Pod名称是无序的,但是在statefulset中要求必须是有序 ,每一个pod不能被随意取代,pod重建后pod名称还是一样的。而pod IP是变化的,所以是以Pod名称来识别。pod名称是pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称 。
serverless是什么
serverless