在Terway的集群中,可以使用NetworkPolicy来控制Pod之间的访问。当Terway的集群Node数量多了之后(节点大于100),NetworkPolicy的代理会给Kubernetes的管控造成不小的压力,所以在大规模集群中需要对NetworkPolicy做针对大规模集群的优化调整。本文介绍如何优化大规模Terway集群中NetworkPolicy的性能。
背景信息
Terway使用Calico的Felix作为NetworkPolicy功能的实现。在大规模(节点大于100)的集群中,每个节点上的Felix都从API Server获取规则,这样会给API
Server带来不小的压力,所以在大规模集群中可以采用关闭NetworkPolicy的功能或者部署中继组件Typha的方式降低Felix对API Server的压力。
您可以通过两种方式优化大规模集群中NetworkPolicy的性能:
- 部署NetworkPolicy中继。
- 关闭集群的NetworkPolicy能力。
说明 关闭集群的NetworkPolicy能力会导致NetworkPolicy的功能不可用。
部署NetworkPolicy中继
- 登录容器服务管理控制台。
- 升级集群的Terway组件至最新版本,具体步骤请参见管理组件。
- 使用以下模板并执行
kubectl apply -f
部署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
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
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/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}为对应的地域。
- 根据集群规模修改其中的replicas的副本数(一个副本对应200个节点,最小3副本)。
- 执行以下命令修改Terway的配置项文件eni-config,增加中继配置felix_relay_service: calico-typha。
kubectl edit cm eni-config -n kube-system
#在打开的文件中增加以下中继配置,与eni_conf参数对齐。
felix_relay_service: calico-typha
- 执行以下命令重启集群中的Terway。
kubectl get pod -n kube-system | grep terway | awk '{print $1}' | xargs kubectl delete -n kube-system pod
预计输出:
pod "terway-eniip-8hmz7" deleted
pod "terway-eniip-dclfn" deleted
pod "terway-eniip-rmctm" deleted
关闭集群NetworkPolicy
当您不需要NetworkPolicy的功能时,也可以采用直接关闭集群的NetworkPolicy功能,从而降低NetworkPolicy的代理对API Server的压力。
- 修改Terway的配置项文件eni-config,增加禁用NetworkPolicy的配置disable_network_policy: "true"。
kubectl edit cm -n kube-system eni-config
# 修改(如果有以下key)或者新增:
disable_network_policy: "true"
- 执行以下命令重启集群中的Terway。
kubectl get pod -n kube-system | grep terway | awk '{print $1}' | xargs kubectl delete -n kube-system pod
预计输出:
pod "terway-eniip-8hmz7" deleted
pod "terway-eniip-dclfn" deleted
pod "terway-eniip-rmctm" deleted
执行结果
上述操作完成后,NetworkPolicy的代理会使用中继组件而不会再对Kubernetes的API Server造成过大压力。通过观察集群API Server的SLB的监控情况,API
Server的负载下降。