为什么我的Pod没有使用多个节点?
目前,我在 AWS 上有 2 个节点
NAME STATUS ROLES AGE VERSION
NODE-1-xxx-xxx-xxx-xxx.cn-north-1.compute.internal Ready <none> 15d v1.16.13-eks-2ba888
NODE-2-xxx-xxx-xxx-xxx.cn-north-1.compute.internal Ready <none> 13d v1.16.13-eks-2ba888
这也是我的 CPU 负载的屏幕截图
节点 1
节点 2
我的问题是,每当我将应用程序部署到生产环境时,我都会最大限度地提高 NODE 2上的 CPU 使用率,这会降低整个站点的速度
这是我的部署配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend # name of the deployment
namespace: backend
labels: # these labels apply to the deployment
app: root
component: backend
spec:
replicas: 2
minReadySeconds: 20
selector:
matchLabels:
app: root
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels: # these labels apply to our container
app: root
component: backend
version: xxx_${BITBUCKET_BUILD_NUMBER}
spec:
containers:
- name: backend # name of our container
image: xxx/xxx_main:${BITBUCKET_BUILD_NUMBER} # the URI that we got from ECR
imagePullPolicy: Always
envFrom:
- configMapRef:
name: env
ports:
- containerPort: 3000 # expose the running contianer on port 3000
name: backend
protocol: TCP
readinessProbe:
tcpSocket:
port: backend
initialDelaySeconds: 20
periodSeconds: 5
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 20
imagePullSecrets:
- name: xxx
我在这里没有正确扩展吗?如果只使用一个节点,那么拥有两个节点有什么意义?如何正确扩展我的应用程序以使用多个节点?
回答
发生这种情况是因为节点调度算法基于优先级得分,不同的优先级算法对得分有贡献。一种这样的优先级算法是ImageLocalityPriority为已经拥有 pod 使用的图像的节点添加正优先级分数的 。因此,最初,已经运行 Pod 的第一个副本的节点由于ImageLocalityPriority. 一旦添加了越来越多的副本,每个节点上运行的 pod 数量就会趋于平衡,因为其他优先级BalancedResourceAllocation等也会受到影响。
还有一个SelectorSpreadPriority有助于最小化节点上属于同一服务的 pod 数量。因此,如果您service在创建部署之前创建对象,它可能会有所帮助。
要强制 Pod 展开,您应该向Pod添加Pod 间反关联约束。
您还应该考虑向容器添加请求和限制。这有助于在LeastRequestedPriority优先级也开始时分散 pod 。(注意:还有MostRequestedPriority为使用的节点添加优先级,但默认情况下未启用)。