優(yōu)化大規(guī)模Terway集群NetworkPolicy的擴展性
在Terway的集群中,可以使用NetworkPolicy來控制Pod之間的訪問。當Terway的集群節(jié)點數(shù)量增加到100以上時,NetworkPolicy的代理會給Kubernetes的管控造成不小的壓力,所以需要對NetworkPolicy做針對大規(guī)模集群的優(yōu)化調(diào)整。本文介紹如何優(yōu)化大規(guī)模Terway集群中NetworkPolicy的性能。
背景信息
Terway使用Calico的Felix作為NetworkPolicy功能的實現(xiàn)。在節(jié)點數(shù)量大于100的大規(guī)模集群中,每個節(jié)點上的Felix都從API Server獲取規(guī)則,這樣會給API Server帶來不小的壓力,所以在大規(guī)模集群中可以采用關(guān)閉NetworkPolicy的功能或者部署中繼組件Typha的方式降低Felix對API Server的壓力。
您可以通過兩種方式優(yōu)化大規(guī)模集群中NetworkPolicy的性能:
部署NetworkPolicy中繼。
關(guān)閉集群的NetworkPolicy功能。
說明關(guān)閉集群的NetworkPolicy能力會導(dǎo)致NetworkPolicy的功能不可用。
前提條件
集群網(wǎng)絡(luò)模式為Terway且集群規(guī)模大于100個節(jié)點以上,詳情請參見創(chuàng)建Kubernetes托管版集群。
部署NetworkPolicy中繼
升級集群的Terway組件至最新版本,具體步驟請參見管理組件。
Terway不同模式使用的組件有所不同。詳細信息,請參見Terway各種模式對比。
復(fù)制以下代碼至新建的calico-typha.yaml文件中,用以部署NetworkPolicy中繼組件Typha。
apiVersion: v1 kind: Service metadata: name: calico-typha namespace: kube-system labels: k8s-app: calico-typha spec: ports: - port: 5473 protocol: TCP targetPort: calico-typha name: calico-typha selector: k8s-app: calico-typha --- apiVersion: apps/v1 kind: Deployment metadata: name: calico-typha namespace: kube-system labels: k8s-app: calico-typha spec: replicas: 3 # 根據(jù)集群規(guī)模修改其中的replicas的副本數(shù)(一個副本對應(yīng)200個節(jié)點,最少3個副本)。 revisionHistoryLimit: 2 selector: matchLabels: k8s-app: calico-typha template: metadata: labels: k8s-app: calico-typha annotations: cluster-autoscaler.kubernetes.io/safe-to-evict: 'true' spec: nodeSelector: kubernetes.io/os: linux hostNetwork: true tolerations: - operator: Exists serviceAccountName: terway priorityClassName: system-cluster-critical containers: - image: registry-vpc.{REGION-ID}.aliyuncs.com/acs/typha:v3.20.2 # 修改{REGION-ID}為對應(yīng)集群的地域。 name: calico-typha ports: - containerPort: 5473 name: calico-typha protocol: TCP env: - name: TYPHA_LOGSEVERITYSCREEN value: "info" - name: TYPHA_LOGFILEPATH value: "none" - name: TYPHA_LOGSEVERITYSYS value: "none" - name: TYPHA_CONNECTIONREBALANCINGMODE value: "kubernetes" - name: TYPHA_DATASTORETYPE value: "kubernetes" - name: TYPHA_HEALTHENABLED value: "true" livenessProbe: httpGet: path: /liveness port: 9098 host: localhost periodSeconds: 30 initialDelaySeconds: 30 readinessProbe: httpGet: path: /readiness port: 9098 host: localhost periodSeconds: 10 --- apiVersion: policy/v1 # 若Kubernetes為v1.21以前版本,apiVersion對應(yīng)的版本為policy/v1beta1。 kind: PodDisruptionBudget metadata: name: calico-typha namespace: kube-system labels: k8s-app: calico-typha spec: maxUnavailable: 1 selector: matchLabels: k8s-app: calico-typha --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: bgppeers.crd.projectcalico.org spec: scope: Cluster group: crd.projectcalico.org versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: apiVersion: type: string names: kind: BGPPeer plural: bgppeers singular: bgppeer
說明修改模板中的{REGION-ID}為對應(yīng)的地域。
根據(jù)集群規(guī)模修改其中的replicas的副本數(shù)(一個副本對應(yīng)200個節(jié)點,最少3個副本)。
根據(jù)集群版本適配
PodDisruptionBudget
的apiVersion
:集群版本為v1.21或更高,PodDisruptionBudget
的apiVersion
需要設(shè)置為policy/v1
;集群版本低于v1.21,PodDisruptionBudget
的apiVersion
需要設(shè)置為policy/v1beta1
。
執(zhí)行以下命令,部署中繼組件。
kubectl apply -f calico-typha.yaml
執(zhí)行以下命令,修改Terway的配置項文件eni-config。
kubectl edit cm eni-config -n kube-system
在打開的文件中增加中繼配置
felix_relay_service: calico-typha
,并將disable_network_policy
的參數(shù)取值配置為"false"
(如果沒有該參數(shù),則無需配置)。這兩個參數(shù)均與eni_conf
參數(shù)對齊。felix_relay_service: calico-typha disable_network_policy: "false" # 如果沒有該參數(shù),則無需新增。
執(zhí)行以下命令,重啟集群中的Terway。
kubectl get pod -n kube-system | grep terway | awk '{print $1}' | xargs kubectl delete -n kube-system pod
預(yù)計輸出:
pod "terway-eniip-8hmz7" deleted pod "terway-eniip-dclfn" deleted pod "terway-eniip-rmctm" deleted ...
關(guān)閉集群NetworkPolicy
當您不需要NetworkPolicy的功能時,也可以采用直接關(guān)閉集群的NetworkPolicy功能,從而降低NetworkPolicy的代理對API Server的壓力。
執(zhí)行以下命令,修改Terway的配置項文件eni-config,增加禁用NetworkPolicy的配置disable_network_policy: "true"。
kubectl edit cm -n kube-system eni-config # 修改(如果有以下key)或者新增: disable_network_policy: "true"
執(zhí)行以下命令,重啟集群中的Terway。
kubectl get pod -n kube-system | grep terway | awk '{print $1}' | xargs kubectl delete -n kube-system pod
預(yù)計輸出:
pod "terway-eniip-8hmz7" deleted pod "terway-eniip-dclfn" deleted pod "terway-eniip-rmctm" deleted ...
執(zhí)行結(jié)果
上述操作完成后,NetworkPolicy的代理會使用中繼組件,從而不會再對Kubernetes的API Server造成過大壓力。通過觀察集群API Server的SLB的監(jiān)控情況,可以看到API Server的負載下降。