前言

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是业务端口,也就是镜像中应用监听的端口。
nodePort是集群节点监听端口(暴露服务)。可以使用不同的Nodeport实现不同业务访问
数据流向:用户访问节点端口(nodePort)->转发到LB端口(port)->分发到业务端口(targetPort)

LoadBalancer

与NodePort类似,在每个节点上启用一个端口来暴露服务。除此之外,Kubernetes会请求底层云平台上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。

在这里插入图片描述

四、Service代理模式

Service代理模式分为Iptables与IPVS两种。

流程包流程:客户端 ->NodePort/ClusterIP(iptables/Ipvs负载均衡规则) -> 分布在各节点Pod

Iptables

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x4pBsCZm-1684200981736)(https://secure2.wostatic.cn/static/9fcRD2DpQrAYKQhC3Ns8oc/image.png?auth_key=1684199971-sQ8vkKFENSvyAbCj4JPYaq-0-dfc7ecd4d4c6518223eb6bd3d61727c1)]

  • 灵活,功能强大
  • 规则遍历匹配和更新,呈线性时延

IPVS

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-js1Go43y-1684200981737)(https://secure2.wostatic.cn/static/otE5jcnioNX7Fo4qorzQtZ/image.png?auth_key=1684199972-hR6Y9cXakoJX1F3wFMJuuK-0-0e4fac620fcf8b45e3eab874fb698b37)]

  • 工作在内核态,有更好的性能
  • 调度算法丰富: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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐