k8s——Service和Ingress
1. Service
Service对象的IP地址也称为Cluster IP,是一种虚拟IP地址,能被同一集群的Pod资源所访问。Service端口用于接收客户端请求并将其转发至其后端的Pod中应用的相应端口之上。这种代理称为“端口代理”或四层代理,它工作于TCP/IP协议栈的传输层。
Service资源能够以负载均衡的方式进行流量调度,实现了请求流量的分发机制。Service和Pod对象之间的关联关系通过标签选择器以松耦合的方式建立。Service并不直接链接至Pod对象,它们之间还有一个中间层——Endpoints资源对象(Service的后端端点),它是一个由IP地址和端口组成的列表,这些IP地址和端口则来自于由Service的标签选择器匹配到的Pod资源。
spec:
sessionAffinity: ClientIP (支持None和ClientIP,ClientIP表示服务将来自同一个client IP的所有请求转发到同一个pod上)
1.1 虚拟IP和服务代理
一个Service对象就是工作节点上的一些iptables或ipvs规则,用于将到达Service对象IP地址的流量调度转发至相应的Endpoints对象指向的IP地址和端口之上。工作于每个工作节点的kube-proxy组件通过AIP Server持续监控着各Service及与其关联的Pod对象,并将其创建或变动实时反映至当前工作节点上相应的iptables或ipvs规则上。
kube-proxy将请求代理至相应端点的方式有三种:userspace、iptables、ipvs。
Service类型:
ClusterIP:通过集群内部IP地址暴露服务,此地址仅在集群内部可达,而无法被集群外部的客户端访问。
NodePort:这种类型建立在ClusterIP类型之上,其在每个节点的IP地址的某静态端口暴露服务,NodePort类型就是在工作节点的IP地址上选择一个端口用于将集群外部的用户请求转发至目标Servce的ClusterIP和Port。
LoadBalancer:这种类型构建在NodePort类型之上,其通过cloud provider提供的负载均衡器将服务暴露到集群外部。
ExternalName:其通过将Service映射至由externalName字段的内容指定的主机名来暴露服务。
Service配置的port详解:
port:service内部端口,用于集群内其他应用访问端口
targetPort:容器端口(pod端口)
nodePort:对集群外部请求的端口
2. Ingress
Ingress资源是基于HTTP虚拟主机或URL的转发规则。Ingress资源的定义方式举例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: www.ilinux.io http: paths: - path: / pathType: Prefix backend: service: name: myapp-svc port: number: 80
spec字段下主要嵌套如下三个字段
rules,用于定义当前Ingress资源的转发规则列表;未由rules定义规则,或者没有匹配到任何规则时,所有流量都会转发到由backend定义的默认后端。
backend,默认的后端用于服务那些没有匹配到任何规则的请求;定义Ingress资源时,至少应该定义backend或rules两者之一;此字段用于让负载均衡器指定一个全局默认的后端。backend对象的定义由两个必选的内嵌字段组成:serviceName和servicePort,分别用于指定流量转发的后端目标Service资源的名称和端口。
tls,TLS配置,目前仅支持通过默认端口443提供服务;如果要配置指定的列表成员指向了不同的主机,则必须通过SNI TLS扩展机制来支持此功能。
Ingress资源类型
单Service资源型Ingress
暴露单个Service的方法可以使用NodePort、LoadBalancer,也可以使用Ingress来暴露服务,只需要为Ingress指定“default backend”,这样Ingress控制器会为其分配一个IP地址接入请求流量,并将它们转至指定的后段service,如:
spec: backend: serviceName: my-svc servicePort: 80
基于URL路径进行流量分发
Ingress也支持基于URL路径进行流量分发
spec: rules: - host: www.ilinux.io http: paths: - path: /web backend: service: name: myapp-svc-web port: number: 80 - path: /api backend: service: name: myapp-svc-api port: number: 80
基于主机名称的虚拟主机
如果服务按照域名进行划分,可以将Ingress基于虚拟主机定义如下
spec: rules: - host: web.ilinux.io ... - host: api.ilinux.io
TLS类型的Ingress资源
如果需要以HTTPS发布Service资源,也可以配置TLS协议的Ingress资源,但需要基于一个含有私钥和证书的Secret对象,这在后面的章节会涉及到,在Ingress资源中引用此Secret即可让Ingress控制器加载并配置为HTTPS服务
spec: tls: - secretName: ilinuxSecret backend: ...
Ingress控制器