service 四种类型
clusterIp
NodePort
LoadBalancer
ExternalName是别名
在这里插入图片描述
service是实现负载均衡的一个对象通过kube-proxy创建ipvs 或者是iptables创建的规则

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - protocol: TCP
      port: 80

svc = service
svc 与 pod 看着是label相同而关联的,其实是通过endpoint进行关联的,endpoint controller 会监听pod对象以及svc对象,如果创建了svc对象且包含了selector,那么ep controller对象会创建一个同名的endpoint对象,按照selector去寻找是否有同样label的pod,看pod是否就绪,pod不就绪在notreadaddress ,就绪了addresses里,一个service对应多个pod,多对多的关系,关系由endpoint这个中间表来维护svc与pod关系,selector找到的所有的podip存放在address中的,ready的是存在address中,Notready的存在notreadaddress
不就绪的pod不接受流量。

endpoint 对象

apiVersion: v1
kind: Endpoints
metadata:
  annotations:
    endpoints.kubernetes.io/last-change-trigger-time: "2022-10-13T09:40:26Z"
  creationTimestamp: "2022-10-13T08:23:29Z"
  name: my-nginx
  namespace: default
  resourceVersion: "14270"
  uid: 42940e41-d988-4637-b1e8-cf730baf8cd2
subsets:
- addresses:
  - ip: 172.22.189.199
    nodeName: izwz9b6ehvw4yhz5f1wa4uz
    targetRef:
      kind: Pod
      name: nginx-deployment-66b6c48dd5-5f6rr
      namespace: default
      resourceVersion: "14227"
      uid: 32336232-7012-461e-8537-167cfdbfd6e4
  - ip: 172.22.189.200
    nodeName: izwz9b6ehvw4yhz5f1wa4uz
    targetRef:
      kind: Pod
      name: nginx-deployment-66b6c48dd5-pjtkd
      namespace: default
      resourceVersion: "14268"
      uid: 2fdd93aa-2c88-49fb-8581-8d80dde47a75
  ports:
  - port: 80
    protocol: TCP

但是放某个service后的pod数很多的时候这个ep会特别的庞大,当pod变化会引起ep变化,然后会将变化推送到比如5000个节点上,所以出现了serviceSlice,将service进行切片,降低带宽压力

在这里插入图片描述
clusterIP是一个虚ip+port,通过负载均衡到podIP+targertport

root@iZwz9b6ehvw4yhz5f1wa4uZ:~/101/module8/service# kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        4h11m

service Topology就近访问
k8s提供通用标签标记所处的物理位置,解决就近访问,增加访问速度
在这里插入图片描述
service Topology key

apiVersion: v1
kind: Service
metadata:
  name: nodelocal
spec:
  ports:
    - port: 80
      protocol: TCP
      name: http
  selector:
    app: nginx
  topologyKeys:
    - "kubernetes.io/hostname #定义客户与服务端在一台机器上

就近访问由近到远的配置

apiVersion: v1
kind: Service
metadata:
  name: prefer-nodelocal
spec:
  ports:
    - port: 80
      protocol: TCP
      name: http
  selector:
    app: nginx
  topologyKeys:
    - "kubernetes.io/hostname" #找本机有没有对应ep
    - "topology.kubernetes.io/zone"#没有到zone里找
    - "topology.kubernetes.io/region"#到region中找
    - "*"#更大区域

kube-proxy是运行在每台机器上运行的服务,它监听apiserver和ep和svc,通过iptables实现负载均衡(仅支持TCP UDP)
kube-proxy可运行在物理机上以daemonset 或者shistatic pod运行
kube-proxy支持 iptables 与 ipvs v1.8新增ipvs模式,采用增量式更新,并保证service更新期间不断开。

Logo

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

更多推荐