k8s service对象初识
service
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更新期间不断开。
更多推荐
所有评论(0)