根据https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#scaling-a-statefulset,请问如何实现零宕机滚动更新?我想这是最低要求:
(1) .spec.updateStrategy 设置为 RollingUpdate
(2) .spec.podManagementPolicy 设置为 OrderedReady
(3) .spec.replicas 设置为 2
那正确吗?我假设当更新以相反的顺序发生时,所有到 StatefulSet 的流量都由序号较低的 pod 提供服务?
patch downtime live-update kubernetes kubernetes-statefulset
对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 将被分配一个整数序数,从 0 到 N-1,它在整个 Set 中是唯一的。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zookeeper-np
labels:
app: zookeeper-np
spec:
serviceName: zoo-svc-np
replicas: 3
selector:
matchLabels:
app: zookeeper-np
template:
metadata:
labels:
app: zookeeper-np
spec:
containers:
- name: zookeeper-np
image: zookeeper:3.5.6
ports:
- containerPort: 30005
- containerPort: 30006
- containerPort: 30007
env:
- name: ZOO_MY_ID
value: "1"
Run Code Online (Sandbox Code Playgroud)
上面的清单将创建三个 pod,如下所示:
NAME READY STATUS STARTS AGE
pod/zookeeper-np-0 1/1 Running 0 203s
pod/zookeeper-np-1 1/1 Running 0 137s …Run Code Online (Sandbox Code Playgroud) 我已经在我的 Kubernetes 集群上部署了一个有状态的集合应用程序。它有持久卷等和一个副本。我面临的问题是,当我关闭运行有状态集的节点时,pod 不会在新节点上重新启动。它继续等待节点启动并最终在同一节点上重新启动。StatefulSet 规范中是否有一些我缺少的设置。我已经按照 Kubernetes 指南中提到的示例进行了设置:https ://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#components
我错过了什么?
任何人都可以指出如何使用 mongo 客户端使用命令行客户端或使用连接字符串从 .net core 程序连接到 mongo 数据库实例?
我们在 digitalocean 中创建了一个带有命名空间的示例集群,假设是mongodatabase。
我们安装了带有 3 个副本的 mongo statefulset。我们能够使用以下命令成功连接 kubectl --kubeconfig=configfile.yaml -n mongodatabase exec -ti mongo-0 mongo 但是当我们从不同的命名空间或默认命名空间使用以下格式的 pod 名称连接时,它不起作用。
kubectl --kubeconfig=configfile.yaml exec -ti mongo-0.mongo.mongodatabase.cluster.svc.local mongo
Run Code Online (Sandbox Code Playgroud)
其中mongo-0.mongo.mongodatabase.cluster.svc.local位于pod-0.service_name.namespace.cluster.svc.local中(也尝试了 pod-0.statfulset_name.namespace.cluster.svc.local 和 pod-0。 service_name.statefulsetname.namespace.cluster.svc.local) 等,
任何人都可以帮助在命令行中以及从 java/.net core 等程序连接 mongo 客户端时使用正确的 dns 名称/连接字符串吗?
另外,我们应该在这里使用 kubernetes 部署而不是有状态集吗?
从 Kubernetes v1.18 开始,v2beta2 API 允许通过 Horizontal Pod Autoscalar (HPA) 行为字段配置扩展行为。我计划将具有自定义指标的 HPA 应用于 StatefulSet。
我正在查看的用例是使用自定义指标(例如我的应用程序上的用户会话数)进行扩展,但 HPA 根本不会缩小。K8s SIG 自动缩放增强功能也描述了此用例 - “HPA 的可配置缩放速度 >> 故事 4:照常缩放,不要缩小”。
behavior:
scaleDown:
policies:
- type: pods
value: 0
Run Code Online (Sandbox Code Playgroud)
用户会话可能会保持活动状态几分钟到几小时。从 StatefulSet 的 1 个副本开始,随着用户会话数量达到上限(使用 Prometheus 收集器公开,随后使用 HPA 自定义指标选项进行配置),应用程序 Pod 将横向扩展。新的 Pod 将开始为新用户提供服务。
由于这是一个 StatefulSet 并且不能突然缩小,因此我正在寻求有关当新副本上的用户会话降至 0 时缩小规模的方法的帮助。上面的链接说缩小可以通过单独的过程来控制。不知道该怎么做?寻找一些指点。
谢谢。
kubernetes kubernetes-statefulset kubernetes-pod horizontal-pod-autoscaling
我正在部署两个具有相同映像的有状态 Pod,作为无头服务运行。我希望将单独的环境变量传递给在 statefulset pod 内运行相同图像的容器。谁能告诉我如何实现这一目标?
我一直在阅读kubernetes 中的活性和就绪探针,我想用它们来检查集群是否已经启动。
问题是如何为整个 statefulset 配置就绪探针,而不是单个 pod/容器。
可以使用简单的 HTTP 检查来确定准备情况,但我遇到的问题是 readinessCheck 似乎适用于容器/pod 而不是集合本身。
对于我使用的软件,在集群形成之前,HTTP 端点不会出现;这意味着每个单独的 pod 都不会通过 readinessCheck,直到所有三个都启动并找到另一个。
我现在在 Kubernetes 中看到的行为是创建了 3 个副本中的第一个,并且在第一个通过 readinessCheck 之前,Kubernetes 甚至不会尝试创建副本 2 和 3,这从未发生过,因为所有三个都必须启动让它有机会通过它。
我正在尝试在kubernetes环境中为我的statefulset(for elasticsearch)设置HPA。我正计划使用cpu利用率来扩展statefulset。我已经从https://github.com/stefanprodan/k8s-prom-hpa/tree/master/metrics-server创建了度量服务器。
而我的用于statefulset的HPA yaml如下:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: dz-es-cluster
spec:
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: StatefulSet
name: dz-es-cluster
minReplicas: 2
maxReplicas: 3
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 80
Run Code Online (Sandbox Code Playgroud)
但是在hpa中获取输出如下:
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale False FailedGetScale the HPA controller was unable to get the target's current scale: the server could not find the requested resource
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedGetScale 1m …Run Code Online (Sandbox Code Playgroud) 如何ClusterIP=None在 Google Cloud Platform 中的 Kubernetes 上公开 StatefulSet 服务(cassandra、mysql 等)?
我需要更改 ClusterIP 配置吗?或者我需要配置 Google Cloud NAT?或者我需要改变其他事情?
谢谢
编辑:我想从互联网上的任何地方从外部IP连接到cassandra
EDIT2:我想解决方案是使用LoadBalance代替ClusterIP,但是当我使用 时LoadBalance,Cassandra 节点找不到种子节点。然后我仍然使用ClusterIP=NoneCassandra 集群,并创建了另一个 POD 以type=LoadBalance连接到 Cassandra 并连接到外部。现在它可以工作了:)
活性探针应该触发失败容器的重新启动。他们是否尊重默认的有状态集部署和扩展保证。例如,如果同一状态集中的多个 pod 的活性探测同时失败,K8S 会尝试一次重新启动一个容器还是并行地重新启动所有容器?