您现在的位置是:首页 >技术杂谈 >Kubernetes那点事儿——暴露服务之Service网站首页技术杂谈
Kubernetes那点事儿——暴露服务之Service
Kubernetes那点事儿——暴露服务之Service
前言
K8s中,我们将应用跑在Pod里。多数情况下是一组Pod,用户如何访问这一组Pod,K8s提供了Service资源,来实现一组Pod的负载均衡。
一、Service
Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。为后端Pod提供负载均衡及服务发现的能力。
- 关联Pod(服务发现)
- 定义一组Pod的访问策略(负载均衡)
二、Service与Pod关系
Service与Pod通过Label关联,Service实现Pod的负载均衡(4层)
示例:
apiVersion: v1
kind: Service
metadata:
name: web-service
labels:
app: svc-web
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 8080
上述配置创建一个名称为 “web-service” 的 Service 对象,它会将请求代理到使用 TCP 端口 8080,并且具有标签 “app=web” 的 Pod 上。
metadata定义了service本身的名称,标签。spec定义的标签选择器是pod的标签(对应pod中的labels)
三、Service常用类型
ClusterIP
ClusterIP在集群内部使用。默认分配一个稳定的IP地址,即VIP,只能在集群内部访问(同Namespace内的Pod)
apiVersion: v1
kind: Service
metadata:
name: web-service
labels:
app: web-service
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45d
web-service ClusterIP 10.105.115.247 <none> 80/TCP 5m11s
NodePort
NodePort:在每个节点上启用一个端口来暴露服务,可以在集群外部访问(访问任意节点ip)。也会分配一个稳定内部集群IP地址。
访问地址:NodeIP:NodePort
apiVersion: v1
kind: Service
metadata:
name: web-service
labels:
app: web-service
spec:
type: NodePort
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45d
web-service NodePort 10.105.115.247 <none> 80:31087/TCP 33m
集群内所有节点均会监听31087端口,此时可以用集群内任意节点ip+31087访问到业务(nodeip+31087),可以手动指定nodeport,端口范围30000-32767
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30001
port是Service监听的端口,也就是LB监听的端口。targetport是业务端口,也就是image服务的监控端口。
Nodeport是集群节点监听端口(暴露服务)。可以使用不同的Nodeport实现不同业务访问
数据流向:用户访问节点端口(Nodeport)->转发到LB端口(Port)->分发到业务端口(targetport)
LoadBalancer
与NodePort类似,在每个节点上启用一个端口来暴露服务。除此之外,Kubernetes会请求底层云平台上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。
四、Service代理模式
Service代理模式分为Iptables与IPVS两种。
流程包流程:客户端 ->NodePort/ClusterIP(iptables/Ipvs负载均衡规则) -> 分布在各节点Pod
Iptables
- 灵活,功能强大
- 规则遍历匹配和更新,呈线性时延
IPVS
- 工作在内核态,有更好的性能
- 调度算法丰富:rr,wrr,lc,wlc,ip hash…
修改代理模式
kubeadm方式
# kubectl edit configmap kube-proxy -n kube-system
...
mode: "ipvs"
...
# kubectl delete pod kube-proxy-btz4p -n kube-system
注:
1、kube-proxy配置文件以configmap方式存储
2、如果让所有节点生效,需要重建所有节点kube-proxy pod
二进制方式
# vi kube-proxy-config.yml
mode: ipvs
ipvs:
scheduler: "rr"
# systemctl restart kube-proxy