摘要:使用場景將一個服務的分散在不同的主機或者拓撲域中,提高服務本身的穩定性。示例解讀使用作為拓撲域查看匹配規則,即同一打有同樣標簽的會調度到不同的節點。
externalTrafficPolicy 簡介
如果服務需要將外部流量路由到 本地節點或者集群級別的端點,即service type 為LoadBalancer或NodePort,那么需要指明該參數。存在兩種選項:”Cluster”(默認)和 “Local”。 “Cluster” 隱藏源 IP 地址,可能會導致第二跳(second hop)到其他節點,但是全局負載效果較好。”Local” 保留客戶端源 IP 地址,避免 LoadBalancer 和 NodePort 類型服務的第二跳,但是可能會導致負載不平衡。
在實際的業務中,諸多業務是需要保留客戶端源 IP,所以需要通過將服務的配置文件中的 externalTrafficPolicy 參數設置為 “Local” 來激活這個特性。
{ "kind": "Service", "apiVersion": "v1", "metadata": { "name": "example-service", }, "spec": { "ports": [{ "port": 8765, "targetPort": 9376 }], "selector": { "app": "example" }, "type": "LoadBalancer", "externalTrafficPolicy": "Local" } }使用保留源 IP 的警告和限制
新功能中,外部的流量不會按照 pod 平均分配,而是在節點(node)層面平均分配(因為 GCE/AWS 和其他外部負載均衡實現沒有能力做節點權重, 而是平均地分配給所有目標節點,忽略每個節點上所擁有的 pod 數量)。
然而,在 pod 數量(NumServicePods) ? 節點數(NumNodes)或者 pod 數量(NumServicePods) ? 節點數(NumNodes)的情況下,即使沒有權重策略,我們也可以看到非常接近公平分發的場景。
內部 pod 對 pod 的流量應該與 ClusterIP 服務類似,流量對于所有 pod 是均分的。
ps設置了externalTrafficPolicy:Local以后svc死活都不能訪問,后來經過一系列排查iptables和kube-proxy終于發現了解決辦法。
在kube-proxy啟動參數里面需要設置--hostname-override:
- --hostname-override=$(NODE_NAME) env: - name: NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName通過podAntiAffinity 避免pod 流量不均衡
竟然外部的流量不會按照 pod 平均分配,而是在節點(node)層面平均分配 ,那么我們能做的只有保證同一業務的pod調度到不同的node節點上。
podAntiAffinity使用場景:
將一個服務的POD分散在不同的主機或者拓撲域中,提高服務本身的穩定性。
給POD對于一個節點的獨占訪問權限來保證資源隔離,保證不會有其它pod來分享節點資源。
把可能會相互影響的服務的POD分散在不同的主機上
對于親和性和反親和性,每種都有三種規則可以設置:
RequiredDuringSchedulingRequiredDuringExecution :在調度期間要求滿足親和性或者反親和性規則,如果不能滿足規則,則POD不能被調度到對應的主機上。在之后的運行過程中,如果因為某些原因(比如修改label)導致規則不能滿足,系統會嘗試把POD從主機上刪除(現在版本還不支持)。
RequiredDuringSchedulingIgnoredDuringExecution :在調度期間要求滿足親和性或者反親和性規則,如果不能滿足規則,則POD不能被調度到對應的主機上。在之后的運行過程中,系統不會再檢查這些規則是否滿足。
PreferredDuringSchedulingIgnoredDuringExecution :在調度期間盡量滿足親和性或者反親和性規則,如果不能滿足規則,POD也有可能被調度到對應的主機上。在之后的運行過程中,系統不會再檢查這些規則是否滿足。
那我們的使用場景只能使用RequiredDuringSchedulingIgnoredDuringExecution,要嚴格保證同一業務pod調度到不同的主機。當然這樣可能出現一種問題:不滿足條件的pod,會pending。這個時候我們運維會接受到通知,去增加node節點或是驅趕業務不重要的pod。
示例解讀apiVersion: v1 kind: Pod metadata: name: with-pod-affinity spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: podAffinityTerm: labelSelector: matchExpressions: - key: name operator: In values: - frontend topologyKey: kubernetes.io/hostname containers: - name: with-pod-affinity image: gcr.io/google_containers/pause:2.0
使用kubernetes.io/hostname作為拓撲域,查看匹配規則,即同一打有同樣標簽name=frontend的pod會調度到不同的節點。
親和性/反親和性調度策略比較調度策略 | 匹配標簽 | 操作符 | 拓撲域支持 | 調度目標 |
---|---|---|---|---|
nodeAffinity | 主機 | In, NotIn, Exists, DoesNotExist, Gt, Lt | 否 | pod到指定主機 |
podAffinity | Pod | In, NotIn, Exists, DoesNotExist | 是 | pod與指定pod同一拓撲域 |
PodAntiAffinity | Pod | In, NotIn, Exists, DoesNotExist | 是 | pod與指定pod非同一拓撲域 |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/33064.html
摘要:使用場景將一個服務的分散在不同的主機或者拓撲域中,提高服務本身的穩定性。示例解讀使用作為拓撲域查看匹配規則,即同一打有同樣標簽的會調度到不同的節點。 externalTrafficPolicy 簡介 如果服務需要將外部流量路由到 本地節點或者集群級別的端點,即service type 為LoadBalancer或NodePort,那么需要指明該參數。存在兩種選項:Cluster(默認)...
摘要:如何在啟用的集群中設置的為關于的和兩個值,在之前的文章中,我們已經講過。首先保證啟動參數里加入設置然后需要設置的為。參考資料當您創建時,我們會自動創建選項集,并將它們與相關聯。 如何在啟用cloud-provider=aws的k8s集群中設置service 的externalTrafficPolicy為local 關于externalTrafficPolicy的local和cluste...
摘要:如何在啟用的集群中設置的為關于的和兩個值,在之前的文章中,我們已經講過。首先保證啟動參數里加入設置然后需要設置的為。參考資料當您創建時,我們會自動創建選項集,并將它們與相關聯。 如何在啟用cloud-provider=aws的k8s集群中設置service 的externalTrafficPolicy為local 關于externalTrafficPolicy的local和cluste...
摘要:原因解釋創建成功后,的將集群中的每個云主機節點作為自身的節點,端口為申明的值注意不是。如何獲取源對于需要明確知道客戶端來源地址的情況,我們需要顯示地將的設置成如下修改。重新部署服務后,再用瀏覽器訪問,可以發現正確獲取了瀏覽器的訪問。ULB屬性修改的處理方法如沒有實際需要,請避免修改ULB名稱及注釋根據cloudprovider插件使用提醒,由UK8S cloudprovider創建的ULB不...
摘要:的調度機制組件調度器會將調度到資源滿足要求并且評分最高的上。這個特性的設計初衷是為了替代,并擴展更強大的調度策略。和完全相同,以進行強制的約束。軟規則除了,,還有一條軟規則配置后,沒有相關污點策略的會盡量避免調度到該上。 k8s的調度機制 scheduler組件 k8s調度器會將pod調度到資源滿足要求并且評分最高的node上。我們可以使用多種規則比如:1.設置cpu、內存的使用要求;...
閱讀 1223·2021-11-25 09:43
閱讀 1337·2021-09-26 09:55
閱讀 2330·2021-09-10 11:20
閱讀 3365·2019-08-30 15:55
閱讀 1441·2019-08-29 13:58
閱讀 1164·2019-08-29 12:36
閱讀 2337·2019-08-29 11:18
閱讀 3407·2019-08-26 11:47