首页 > 其他分享 >Kubernetes服务发现-Service

Kubernetes服务发现-Service

时间:2022-11-11 00:00:27浏览次数:34  
标签:iptables 服务 Service Kubernetes svc proxy pod kube

1、Service概念

  • Service是一组pod服务的抽象,相当于一组pod的Load Balance,负责将请求分发给对应的pod。

  • 一组Pod可以被Service访问到,通过 Label Selector

缺点

  • Service只提供四层负载均衡能力,没有7层功能,

2、Service类型

- clusterIp

自动分配一个仅Cluster内部可以访问的虚拟IP。

- NodePort

在ClusterIP基础上为svc在每台机器绑定一个端口,这样就可以通过`NodeIP:NodePort`来访问该服务。

- LoadBalancer

在NodePort基础上,借助cloud provider(云供应商) ,创建外部负载均衡器,并将请求转发到 `NodeIP:NodePort`。

- ExternalName

把集群外部服务引入到集群内部来,在集群内部直接使用。(集群内部新建svc,里面设置了其他集群的端口及IP)没有任何类型代理被创建,只有k8s 1.7或者更高版本才支持。

3、VIP和Service代理

k8s集群中,每个node都有一个kube-proxy进程。kube-proxy负责为svc实现了一种vip(虚拟ip),而不是 externalName的形式。

在k8s v1.0版本,代理完全在userspace
在k8s v1.1版本,新增了iptables代理,但不是默认的运行模式。
从k8s v1.2开始,默认就是iptables代理
在k8s v1.8.0-beta.0中,添加了ipvs代理
在k8s v1.14默认使用ipvs代理。

3.1、代理模式的分类

1、userspace代理模式

2、iptables代理模式

3、ipvs代理模式

4、ClusterIP

clusterIP在每个Node节点使用iptables|ipvs,将发向clusterIP对应端口的数据,转发到kube-proxy。然后kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个svc下对应的pod地址和端口,进而把数据转发给对应的pod的地址和端口。

工作流程

  • apiserver用户通过kubectl命令向apiserver发送创建svc的命令,apiserver接收到请求将数据存储到etcd中。
  • kube-proxy k8s 的每个节点中都有一个叫kube-proxy的进程,这个进程负责感知svc,pod的变化,并将变化的信息写入本地的iptables规则中。
  • iptables使用NAT技术将vip的流量转发到endpoint中
apiVersion: v1
kind: Service
metadata:
  name: test-clusterip
  namespace: test
spec:
  ports:
  - port: 80  # svc提供服务的port
    protocol: TCP
    targetport: 8002 # pod提供服务的port
  # clusterIP: 10.97.97.97  # 可固定IP,或默认生成
  selector:
    app: myblog
  type: ClusterIP

查询流程
iptables -t nat -nvL

ipvsadm -Ln
PREROUTING > KUBE-SERVIVE > SVC > SEP

Headless Service 无头服务

不需要负载均衡,以及不需要单独的Svc IP。可设置Cluster IP的值为None,来创建headless svc。这类svc不会分配cluster ip,kube-proxy不会处理他们,平台也不会对他进行负载均衡和路由。

apiVersion: v1
kind: Service
metadata:
  name: myapp-headless
  namespace: test
spec:
  selector:
    app: myapp
  clusterIP: 'None'
  ports:
  - port: 80
    targetPort: 80

访问

dig -t A [email protected]

10.96.0.10 为coredns地址
svc.cluster.local 集群域名
test namespace名称
myapp-headless svc名称
dig # 需要yum install bind-utils

5、NodePort

原理是在node上开了一个端口,将该端口的流量导入kube-proxy,然后由kube-proxy进一步给到pod。

apiVersion: v1
kind: Service
metadata:
  name: myapp-nodeport
  namespace: test
spec:
  type: NodePort # svc类型
  selector:
    app: myapp
    release: stable
  ports:
   - name: http
     port: 80
     targetPort: 80

iptables -t nat -nvL

6、LoadBalancer

和nodeport是一种方式,区别就是LoadBalancer比nodeport多一步,就是可以调用云厂商(cloud provider)去创建LB来向节点导流。 LAAS

7、ExternalName

这种类型svc通过返回CNAME和他的值,可以将服务映射到externalName字段的内容。ExternalName是svc的特例,他没有selector,也没有特定的端口和endpoint。相反,对于运行在集群外部的服务,他通过 返回该外部服务别名 来提供服务。

apiVersion: v1
kind: Service
metadata:
  name: myapp-exter
  namespace: test
spec:
  type: ExternalName
  externalName: xx.com

当访问 myapp-exter.test.svc.cluster.local,集群的DNS服务器返回xx.com。
重定向发生在DNS层,不会进行代理和转发。

标签:iptables,服务,Service,Kubernetes,svc,proxy,pod,kube
From: https://www.cnblogs.com/20190707wdd/p/16877940.html

相关文章