【问题标题】:What are the options to scale up/scale down a kubernetes statefulset during runtime?在运行时扩展/缩减 kubernetes statefulset 的选项有哪些?
【发布时间】:2019-07-13 09:38:48
【问题描述】:

在我的用例中,我需要根据特定逻辑扩展有状态集,然后将其缩小。 我不确定 HPA 是否会有所帮助,因为我每次都需要创建一个副本,然后发出通知以缩小它,这意味着 - 应用程序将被缩放,然后在特定的时间内将没有缩放down(HPA 将继续旋转 pod,直到满足其条件,如果满足,它将缩小 pod,这是一个问题)。

我正在使用 helm 进行部署。

我应该:

  • 让 pod 访问 K8s API 并更改副本数?
  • 使用 helm 控制器可能创建/更新包含副本数的 CRD?
  • 满足条件时在 Pod 内运行 kubectl scale?

这里的最佳做法是什么?

【问题讨论】:

  • 我不是专家,但如果它应该以编程方式放大/缩小,听起来像使用 API 将是要走的路。使用 kubectl scale 可能需要在 pod 上安装 kubectl - 这看起来不太优雅并且会增加 pod 大小 - 但如果你赶时间,它会作为一个 hacky 解决方案工作
  • 我只是想知道它有多干净,因为在更新部署时(在 cicd 升级管道期间)我还需要调整当前动态更改的副本数,我想知道这是否干净跨度>

标签: kubernetes scale kubernetes-helm


【解决方案1】:

您可以设置一个CronJob,它将每(x 分钟)生成一个 pod,并检查,例如,使用ConfigMap 是否需要扩大/缩小StatefulSet

这个Job 将使用REST API,你可以使用API reference docsReplacePatch 你的StatefulSet。

你可以这样做:

Using kubectl proxy

$ kubectl proxy --port=8080 & 详情请见kubectl proxy

然后您可以使用 curl、wget 或浏览器探索 API,如下所示:

$ curl http://localhost:8080/api/ 输出类似于:

{
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

Without kubectl proxy

可以通过将身份验证令牌直接传递给 API 服务器来避免使用 kubectl 代理,如下所示:

使用grep/cut 方法:

# Check all possible clusters, as you .KUBECONFIG may have multiple contexts:
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'

# Select name of cluster you want to interact with from above output:
export CLUSTER_NAME="some_server_name"

# Point to the API server refering the cluster name
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")

# Gets the token value
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 -d)

# Explore the API with TOKEN
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

输出类似这样:

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

或者通过对 API 的编程访问,Kubernetes 正式支持 GoPython 客户端库。

希望对您有所帮助,如果您还有其他问题,请提出。

【讨论】:

  • 我想避免以自定义方式进行操作,但谢谢!我会接受这个:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
相关资源
最近更新 更多