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控制器

  Ingress控制器自身是运行于Pod中的容器应用,一般是Nginx或Envoy一类的具有代理及负载均衡功能的守护进程,它监视着来自于API Server的Ingress对象状态,并以其规则生成相应的应用程序专有格式的配置文件并通过重载或重启守护进程而使新配置生效。例如,对于Nginx来说,Ingress规则需要转换为Nginx的配置信息。 既然Ingress控制器实际上也是Pod资源,那么也需要接入外部流量,这可以使用NodePort或LoadBalancer类型的Service对象为其接入集群外部的请求流量;或者借助于DaemonSet控制器,将Ingress控制器的Pod资源各自以单一实例的方式运行于集群的所有或部分工作节点之上,并配置这类Pod对象以hostPort或hostNetwork的方式在当前节点接入外部流量。 以部署ingress-nginx并通过专用的Service接入流量为例: 首先apply在线的mandatory.yaml来部署ingress-nginx所需的全部资源。

  

人生就是要不断折腾
原文地址:https://www.cnblogs.com/xiangxiaolin/p/14872801.html