K8s-05: Service and Internet
Service
一组Pod的逻辑分组,一种访问他们的策略,通常成为微服务。通过label selector将Pod分组。service能够提供负载均衡(四层)、服务发现、session保持、虚拟IP等功能。Ingrees是service的升级版,支持七层负载均衡。
Service Type
- ClusterIP: 提供一个虚拟IP,只能在集群内部访问。
- NodePort: 在ClusterIP的基础上,为service在每个node上绑定一个端口,可以通过node的IP和端口访问service。
- LoadBalancer: 在NodePort的基础上,借助cloud providerr为service提供一个外部的负载均衡器,可以通过负载均衡器的IP和端口访问service。
- ExternalName: 为service提供一个CNAME记录,可以通过CNAME访问service。
Proxy Mode
userspace: 通过iptables实现,性能较差。
clusterlP主要在每个node节点使用iptables,将发向clusterIP对应端口的数据,转发到kube-proxy中。然后kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口。
iptables: 通过iptables实现,性能较好。
ipvs: 通过ipvs实现,性能最好。
举例
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
Ingress
-
Ingress是对service的升级,支持七层负载均衡。Ingress Controller是Ingress的实现,Ingress Controller通过service实现七层负载均衡。Ingress Controller可以是nginx、traefik、haproxy等。
-
Ingress在service的基础上,增加了host和path的匹配规则。Ingress Controller会根据host和path的匹配规则,将请求转发到对应的service上。
-
Ingress还可以实现TLS终止,将https请求转发到http请求。加快后端服务的处理速度。
举例
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx
spec:
rules:
- host: nginx.example.com
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80
网络通信
通信方式
- 同一个pod中的容器可以通过localhost进行通信。
- 不同pod中的容器可以通过overlay network进行通信。如果pod在同一个node上,可以通过veth pair进行通信;如果pod在不同的node上,可以通过vxlan进行通信。
- pod与service之间的通信,通过iptables规则进行转发。现在默认使用ipvs进行转发。
- pot到外网,查找路由表,通过node(宿主机)的网关转发。宿主网卡完成路由选择后,itables执行mapquerade规则,将pod的ip地址转换为node的ip地址,然后发送出去。
- 外网访问pod:通过NodePort或者LoadBalancer进行访问。
网络解决方案
- flannel: 使用vxlan技术,为pod提供overlay network。etcd保存可分配的ip段。监控etcd中pod的实际地址,在内存中建立和维护pod的路由表。包转发采用udp协议。