我有一个具有定义数量的
replicas
的部署。我使用就绪探针来通信我的 Pod 是否已准备好/未准备好处理新连接 – 我的 Pod 在其生命周期内在 ready
/ not ready
状态之间切换。
我希望 Kubernetes 扩大/缩小部署规模,以确保始终有所需数量的 pod 处于
ready
状态。
示例:
replicas
为 4 并且有 4 个 Pod 处于 ready
状态,那么 Kubernetes 应保留当前的副本数量。replicas
为 4,并且有 2 个 ready
pod 和 2 个 not ready
pod,那么 Kubernetes 应该再添加 2 个 pod。如何让 Kubernetes 根据 Pod 的“就绪”/“未就绪”状态扩展我的部署?
我认为这是不可能的。 如果 pod 没有准备好,k8 不会让它准备好,因为它与你的应用程序相关。即使它创建了新的 pod,如何保证准备就绪。所以你必须解决非就绪状态背后的原因,然后再解决k8。唯一的事情 k8 可以让他们远离世界负载以避免请求失败
也许在 2019 年发布问题时这是不可能的,但现在在 2024 年,当我发布这个答案时,我们有了 KEDA。
KEDA 基本上是一个 Kubernetes 集群内工具,它根据自定义指标而不是本机 CPU 和内存指标执行自动缩放。有一个广泛的列表,列出了哪种自定义指标收集器(称为“缩放器”) KEDA 可以用来管理自动缩放。
接下来是确定哪个缩放器可以提供有关 pod 准备情况的信息。理想情况下,该指标应原生构建到 KEDA 中,但截至撰写本文时,遗憾的是事实并非如此。下一个最佳选择是 Prometheus,它通常安装在集群上(如果尚未安装,我强烈建议安装它)。Kubernetes 集群上的 Prometheus 安装通常会预安装
kube-state-metrics,Prometheus 使用它来收集集群指标。我们感兴趣的一个特定指标是kube_deployment_status_replicas_ready,它告诉我们与状态为就绪或未就绪的特定过滤器匹配的部署副本的数量。当就绪副本数量低于我们的阈值时,我们可以使用此指标告诉 KEDA 扩展副本,使用如下所示的 KEDA 配置:
triggers:
- type: prometheus
metadata:
# Required fields:
serverAddress: http://<prometheus-host>:9090
query: kube_deployment_status_replicas{namespace="example-namespace",deployment="example-deployment"} - kube_deployment_status_replicas_ready{namespace="example-namespace",deployment="example-deployment"}
threshold: '1' # scale up when number of ready replicas is 1 less than the expected number
# Optional fields:
namespace: example-namespace # for namespaced queries, eg. Thanos
customHeaders: X-Client-Id=cid,X-Tenant-Id=tid,X-Organization-Id=oid # Optional. Custom headers to include in query. In case of auth header, use the custom authentication or relevant authModes.
ignoreNullValues: false # Default is `true`, which means ignoring the empty value list from Prometheus. Set to `false` the scaler will return error when Prometheus target is lost
queryParameters: key-1=value-1,key-2=value-2
unsafeSsl: "false" # Default is `false`, Used for skipping certificate check when having self-signed certs for Prometheus endpoint
注意:上面的配置改编自Prometheus 缩放器上的 KEDA 文档页面。请相应修改。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 4 #here we define a requirement for 4 replicas
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
Kubernetes 将确保如果任何 Pod 崩溃,将创建替换 Pod,以便总共 4 个 Pod 始终可用。
此外,您定义的称为 k8s 的自动修复概念,从基本角度来看,它将得到处理。