问题标签 [kubernetes-statefulset]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
kubernetes - 是否需要对有状态集使用无头服务?
关于无头服务有几个问题:
- 是否需要对有状态集使用无头服务?我也可以将正常的 service.yml 用于有状态集吗?
- 是否需要使用服务和无头服务?我可以只使用无头服务吗?
- 我可以不使用 pod 来附加到服务而不是无头服务吗?
kubernetes - 有状态集的 Kubectl rollout 重启
根据kubectl 文档,kubectl rollout restart
适用于部署、守护程序集和有状态集。它可以按预期进行部署。但是对于有状态集,它只重新启动 2 个 pod 中的一个 pod。
如您所见,pod alertmanager-main-1 已重新启动,其年龄为 20 岁。而 statefulset alertmanager 中的另一个 pod,即 pod alertmanager-main-0 还没有重启,它的年龄是 21h。知道如何在更新了它使用的一些配置映射后重新启动有状态集吗?
[更新 1] 这是 statefulset 配置。如您所见,.spec.updateStrategy.rollingUpdate.partition
未设置。
kubernetes - 用一些环境变量替换 configmap 内容
我正在运行一个使用volumeClaimTemplates 的statefulset。那里一切都很好。
我还有一个 configmap,我想基本上用这个配置文件投影到的每个 pod 的 pod 名称替换一些条目;例如,如果 configmap 数据是:
然后对于名为 的 statefulset pod mypod-0
,配置文件应该包含ThisHost=mypod-0
和ThisHost=mypod-1
for mypod-1
。
我怎么能这样做?
kubernetes - 在 Kubernetes 中配置 StatefulSet 的 Pod 的起始索引
从文档中我们都知道:
对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 将被分配一个从 0 到 N-1 的整数序号,该序号在 Set 中是唯一的。
例子:
上面的清单将创建三个 pod,如下所示:
问题:
有没有办法将此起始索引 (0) 配置为从任何其他整数(例如 1、2、3 等)开始?
例如,要从 3 开始上述 pod 索引,以便创建的 pod 如下所示:
或者如果 statefulset 只有一个副本,它的序数不是零而是其他整数(例如12),所以创建的唯一 pod 将被命名为pod/zookeeper-np-12?
kubernetes - 为单个副本设置有状态是否是矫枉过正?
我需要以“最多一次”语义运行我的应用程序。在任何给定时间只运行我的应用程序的一个实例或根本不运行,这绝对是至关重要的
起初我使用具有单个副本的资源类型“部署”,但后来我意识到在网络分区期间,我们可能无意中运行了多个实例。
当我在 kubernetes 中搜索最常用的语义时,我偶然发现了“有状态集”。进一步阅读,这些示例处理了容器需要持久卷并且通常这些容器运行多个副本的情况。我的应用程序甚至没有使用任何卷。
如果节点无法访问,我还阅读了关于杀死 pod 的容忍度。鉴于容忍可以处理 pod 无法访问的情况,有状态设置对我的用例来说是否过度杀伤?
我正在证明使用有状态集是合理的——因为即使在那个时候节点变得无法访问并且达到了容忍秒数,并且 kubelet 意识到它已与网络断开并杀死进程,kubernetes 可以启动另一个实例。而且我相信有状态的集合也可以防止这种极端情况。
我对吗?有没有其他方法可以实现这一目标?
kubernetes - 使用与 StatefulSet 中的其他 1 个 Pod 相同的 PVC 调度作业
在 Kubernetes 集群中,我希望能够安排一个作业(使用 CronJob),该作业将挂载与给定 StatefulSet 的 1 个 Pod 相同的卷。哪个 Pod 是运行时决定,取决于在调度 Job 时在 Pod 上设置的标签。
我想很多人会想知道为什么,因此描述一下我们正在做什么和试图做什么:
当前设置
我们有一个为 PostgreSQL 数据库提供服务的 StatefulSet。(一个主,多个副本)我们希望能够从 StatefulSet 的其中一个 pod 创建备份。
对于 PostgreSQL,我们已经可以使用 进行网络备份pg_basebackup
,但是我们正在运行多 TB 的 PostgreSQL 数据库,这意味着完全流式备份(使用pg_basebackup
)是不可行的。
我们目前使用pgBackRest
备份数据库,它允许增量备份。
由于增量备份pgBackRest
需要访问数据卷和 WAL 卷,因此我们需要在与 PostgreSQL 实例相同的 Kubernetes Node 上运行 Backup Container,我们目前甚至在单独的 Container 中的同一个 Pod 中运行它。
在容器内部,一个小 api 环绕pgBackRest
,可以通过向POST
api 发送请求来触发,目前这个触发是使用 CronJobs 完成的。
缺点
- 每个 PostgreSQL 实例在 Pod 中都有多个容器,1 个用于服务 Postgres,1 个用于服务于一个小包装器
pgBackRest
- 作业日志仅显示成功的备份触发器,实际的备份日志是备份容器的一部分
- 将运行备份的 Pod 可能在相对较旧的配置上运行,更改备份配置需要重新调度 Pod,这可能意味着 PostgreSQL 主节点的故障转移。
建议的设置
让 CronJob 调度一个与 StatefulSet 的 Pod 具有相同 Volume 的 Pod。这将允许备份使用这些卷。
但是,它需要哪些卷是一个运行时决定:我们可能希望在连接到主卷的卷上运行备份,或者我们可能希望使用副本的卷进行备份。主/副本可能随时更改,因为 PostgreSQL 主的自动故障转移是解决方案的一部分。
目前,这是不可能的,因为我无法在 CronJob 规范中找到任何方法来使用来自 k8s api 的信息。
什么有效,但不是很好:
- 使用调度作业的 CronJob
- 这个 Job 查询 k8s api 并调度另一个Job
例如,我们可以使用以下运行时信息让一个作业创建另一个作业:
以上可能最好由操作员提供,而不仅仅是使用 CronJob,但我想知道是否有人对上述问题有解决方案。
缺点
- 作业日志仅显示成功的备份触发器,实际的备份日志是另一个作业的一部分
- 作业需要权限来安排 Pod,需要另一个角色/角色绑定
- 在 Bash 中使用 heredocs 会使事情更难阅读/解析/理解
概括
长话短说,但这些是我们想要满足的约束:
- 运行 PostgreSQL 数据库的备份
- 这些是多 TB 数据库
- 所以需要增量备份
- 因此,我们需要挂载一个已经运行的 Pod 的同一个 PV
- 因此,我们需要在与 PV 相同的 K8s 节点上运行 Pod(或容器)
- 我们希望能够在 CronJob 规范中表达这一点,而不必进行运行时 kubernetes api 调用
kubernetes - StatefulSet 重新创建 pod,为什么?
我有我的部署,在那里我定义了 postgres statefulSet,但是我没有 PVC,所以如果 pod 死了 - 所有数据都消失了。如果我要列出所有豆荚,我会看到下图:
一段时间后,我再次列出 pod 并查看以下内容:
如您所见,postgresPod 运行了 5 分钟。我“描述”了 statefulset 并在下面看到:
所以我的问题是我怎么知道为什么statefulSet 会重新创建 pod?有没有额外的日志?可能它与机器的资源有某种关系,或者 pod 是在另一个节点上创建的,该节点在那个特定时刻拥有更多资源?
有任何想法吗?
kubernetes - Kubernetes 上无状态应用程序的 StatefulSets 与 Deployments
我发现大量文章和文档描述了 StatefulSets 相对于 Kubernetes 上的有状态应用程序部署的优势。我无法弄清楚的是相反的:与部署相比,StatefulSets 的缺点,特别是对于无状态应用程序。
有人可以解释一下为什么不总是将 StatefulSets 用于有状态和无状态应用程序?
kubernetes - Redis Pod 无法加入 Redis 集群
我想在 kubernetes 中创建 6 个节点的 redis 集群。我正在使用 Minikube 运行kubernetes。
下面是我创建 6 节点集群的实现。
创建有状态集后,我正在从其中一个 pod 中执行 redis create cluster 命令。
这些都是 pod 的 ips。有了这个我可以启动我的集群。但是一旦我使用手动删除单个 pod
例如删除IP地址为:172.17.0.6:6379的redis节点,它应该是master。删除后redis集群状态为:
一段时间后它变为:
由于 redis 集群提供了自动故障转移,但 pod 的 redis 无法自动加入集群?
或者我应该手动将该 pod 加入集群吗?
kubernetes - Kubernetes:如何删除 StatefulSet 管理的特定 pod 而无需重新创建它?
我有一个有 2 个 pod 的 StatefulSet。它有一个无头服务,每个 pod 都有一个 LoadBalancer 服务,可以让全世界都使用它。
假设 pod 名称是 pod-0 和 pod-1。
如果我想删除 pod-0 但保持 pod-1 处于活动状态,我无法做到这一点。
我试过了
这会删除它,但随后会重新启动它,因为 StatefulSet 副本设置为 2。
所以我尝试了
这将删除 pod-0,删除 pod-1,然后重新启动 pod-0。我猜是因为当副本设置为 1 时,StatefulSet 想要保持 pod-0 处于活动状态而不是 pod-1。
但是如何保持 pod-1 处于活动状态并删除 pod-0?