您好,登錄后才能下訂單哦!
拓撲域:表示在集群中某個節點,可操作區域,也就是拓撲域名。
Endpoint: IP-Port 一般來說是Node當中pod的ip+port。
Service:一組依靠labelselector的pod,起到流量均衡分發管理的作用。
集群版本在V1.17以上
Kube-proxy 以iptables或IPVS模式運行(alpha階段暫時只實現這兩種模式)。
Service K8S的service資源,關聯一組endpoint,準發到某個endpoint。
啟用了Endpoint Slices
給所有組件打開ServiceTopology和Endpointslice這兩個Feature gate:
--feature-gates=ServiceTopology=true,EndpointSlice=true
kube-apiserver 前期啟動OwnerReferencesPermissionEnforcement 插件請刪除不然一直提示 Warning FailedToUpdateEndpointSlices 8m24s (x7 over 11m) endpoint-slice-controller (combined from similar events): Error updating Endpoint Slices for Service kube-system/kube-dns: Error creating EndpointSlice for Service kube-syste
m/kube-dns: endpointslices.discovery.k8s.io "kube-dns-x8qmh" is forbidden: cannot set blockOwnerDeletion if an ownerReference refers to a resource you can't set finalizers on: , <nil>
root@Qist:/opt/kube14# kubectl get endpointslices
NAME ADDRESSTYPE PORTS ENDPOINTS AGE
kube-dns-kh6ls IPv4 53,9153,53 10.83.98.136,10.90.153.135 15m
metrics-server-gqgqm IPv4 443 10.93.92.195 15m
在 Service spec 里加上 topologyKeys 字段,表示該 Service 優先順序選用的拓撲域列表,對應節點標簽的 key;當訪問此 Service 時,會找是否有 endpoint 有對應 topology key 的拓撲信息并且 value 跟當前節點也一樣,如果是,那就選定此 topology key 作為當前轉發的拓撲域,并且篩選出其余所有在這個拓撲域的 endpoint 來進行轉發;如果沒有找到任何 endpoint 在當前 topology key 對應拓撲域,就會嘗試第二個 topology key,依此類推;如果遍歷完所有 topology key 也沒有匹配到 endpoint 就會拒絕轉發,就像此 service 沒有后端 endpoint 一樣。
有一個特殊的 topology key “*“,它可以匹配所有 endpoint,如果 topologyKeys 包含了 *,它必須在列表末尾,通常是在沒有匹配到合適的拓撲域來實現就近轉發時,就打消就近轉發的念頭,可以轉發到任意 endpoint 上。
當前 topology key 支持以下可能的值(未來會增加更多):
kubernetes.io/hostname: 節點的 hostname,通常將它放列表中第一個,表示如果本機有 endpoint 就直接轉發到本機的 endpoint。
topology.kubernetes.io/zone: 節點所在的可用區,通常將它放在 kubernetes.io/hostname 后面,表示如果本機沒有對應 endpoint,就轉發到當前可用區其它節點上的 endpoint(部分云廠商跨可用區通信會收取額外的流量費用)。
topology.kubernetes.io/region: 表示節點所在的地域,表示轉發到當前地域的 endpoint,這個用的應該會比較少,因為通常集群所有節點都只會在同一個地域,如果節點跨地域了,節點之間通信延時將會很高。
*: 忽略拓撲域,匹配所有 endpoint,相當于一個保底策略,避免丟包,只能放在列表末尾。
topologyKeys 與 externalTrafficPolicy=Local 不兼容,是互斥的,如果 externalTrafficPolicy 為 Local,就不能定義 topologyKeys,反之亦然。
topology key 必須是合法的 label 格式,并且最多定義 16 個 key。
# 以kube-dns 為例:
---
apiVersion: v1
kind: Service
metadata:
name: kube-dns
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: "CoreDNS"
spec:
selector:
k8s-app: kube-dns
clusterIP: 192.66.0.2
topologyKeys: ["kubernetes.io/hostname", "topology.kubernetes.io/zone", "*"] # 添加參數
ports:
- name: dns
port: 53
protocol: UDP
- name: dns-tcp
port: 53
protocol: TCP
- name: metrics
port: 9153
protocol: TCP
# 驗證ServiceTopology 是否生效
進去node 節點
無kube-dns 容器節點
root@k8s-master-01:~# ipvsadm -Ln | grep :53
TCP 10.66.0.2:53 rr
-> 10.83.98.136:53 Masq 1 0 0
-> 10.90.153.135:53 Masq 1 0 0
UDP 10.66.0.2:53 rr
-> 10.83.98.136:53 Masq 1 0 0
-> 10.90.153.135:53 Masq 1 0 0
# 有kube-dns 容器節點
[root@k8s-node-09 ~]# ipvsadm -Ln| grep :53
TCP 10.66.0.2:53 rr
-> 10.90.153.135:53 Masq 1 0 0
UDP 10.66.0.2:53 rr
-> 10.90.153.135:53 Masq 1 0 0
# 直接就是當前node 節點容器IP
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。