标签: kubernetes-statefulset

单个裸机节点上的动态存储配置

有没有办法在单个裸机 kubernetes 节点上实现动态存储配置?我需要为具有多个副本的 StatefulSet 动态配置存储卷。

因为我还没有找到。

storage dynamic kubernetes kubernetes-statefulset

6
推荐指数
0
解决办法
998
查看次数

StatefulSet 重新创建 pod,为什么?

我有我的部署,我在其中定义了 postgres statefulSet,但是我没有 PVC,所以如果 pod 死了 - 所有数据都消失了。如果我将列出所有豆荚,我会看到下图:

pod1 - Running - 10 min
pod2 - Running - 10 min
postgresPod - Running - 10 min
Run Code Online (Sandbox Code Playgroud)

一段时间后,我再次列出豆荚,如下所示:

pod1 - Running - 10 min
pod2 - Running - 10 min
postgresPod - Running - 5 min
Run Code Online (Sandbox Code Playgroud)

如您所见,postgresPod 运行了 5 分钟。我“描述”了 statefulset 并在下面看到:

Type     Reason               Age                From                    Message
  ----     ------               ----               ----                    -------
  Normal   SuccessfulCreate     5m **(x2 over 10m)**  statefulset-controller  create Pod postgresPod in StatefulSet x-postgres successful
  Warning  RecreatingFailedPod  5m                statefulset-controller  StatefulSet …
Run Code Online (Sandbox Code Playgroud)

deployment kubernetes devops kubernetes-statefulset

6
推荐指数
2
解决办法
1514
查看次数

使用新的 PersistentVolume 重新创建由 StatefulSet 管理的 Pod

有时,我需要对 StatefulSet 中的所有 Pod 进行滚动替换,以便所有 PV 也从头开始重新创建。这样做的原因是摆脱所有使用旧版本加密密钥的底层硬盘驱动器。此操作不应与常规滚动升级相混淆,为此我仍然希望卷能够在 Pod 终止后继续存在。到目前为止,我认为最好的例程如下:

  1. 删除PV。
  2. 删除 PVC。
  3. 删除 Pod。
  4. 等待所有删除完成。
  5. 手动重新创建在步骤 2 中删除的 PVC。
  6. 等待新 Pod 完成 StatefulSet 中其他 Pod 的数据流传输。
  7. 对于下一个 Pod,从步骤 1. 开始重复。

我对第 5 步不满意。我希望 StatefulSet 为我重新创建 PVC,但不幸的是它没有。我必须自己做,否则 Pod 创建失败并出现以下错误:

Warning  FailedScheduling   3s (x15 over 15m)  default-scheduler   persistentvolumeclaim "foo-bar-0" not found
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?

kubernetes kubernetes-statefulset

6
推荐指数
2
解决办法
7031
查看次数

按主机名动态路由到特定 StateFulSet POD

我有一个有 2 个副本的 StatefulSet。我想创建一个端点,以便能够访问该副本的任何一个,并传递主机名 ID,并且如果我将其扩展到更多副本,则需要可以访问新的 Pod。

我可以像这样创建一个 Ingress:

apiVersion: voyager.appscode.com/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  namespace: default
spec:
  rules:
  - host: appscode.example.com
    http:
      paths:
      - path: /0
        backend:
          hostNames:
          - web-0
          serviceName: nginx-set
          servicePort: '80'
      - path: /1
        backend:
          hostNames:
          - web-1
          serviceName: nginx-set
          servicePort: '80'

Run Code Online (Sandbox Code Playgroud)

这样,GETonappscode.example.com/0将被路由到web-0pod。但是,我怎样才能以动态的方式做到这一点呢?如果我将副本更改为 3,我将需要手动创建一条新的 pod 路径web-2才能访问。

kubernetes kubernetes-ingress kubernetes-statefulset

6
推荐指数
1
解决办法
1233
查看次数

将 Kubernetes Statefulset Pod 移动到另一个节点

我的 k8s 集群最初有 2node 和 1master,我使用 3pod 部署了 statefulset,因此带有 PVC 的 3pod 在 2 个节点上运行。现在我将节点从 2 个增加到 3 个。所以现在 k8s 是 3nodes 和 1master。我想将其中一个有状态 pod 移动到新添加的节点而不删除 PVC,以便 3 个 pod 将分布在每个 3 个节点上。我尝试删除 pod,但它在同一节点上创建,而不是在新节点上创建(这是预期的)。谁能告诉我是否可以将一个 Pod 移动到另一个节点而不删除 PVC?这是可以实现的吗?或任何替代解决方案,因为我不想删除 PVC。

kubernetes kubernetes-pvc kubernetes-statefulset kubernetes-pod

6
推荐指数
1
解决办法
7418
查看次数

Kubernetes 有状态集、可用区和卷声明:可用区失败时会发生什么

考虑跨 3 个可用区的 Statefulset(Cassandra 使用官方 K8S 示例):

  • cassandra-0 -> 区域 a
  • cassandra-1 -> 区域 b
  • cassandra-2 -> c 区

每个 Cassandra Pod 都使用一个 EBS 卷。所以自然而然就有了亲和力。例如,cassandra-0 无法移动到“zone-b”,因为它的卷位于“zone-a”中。都好。

如果某些 Kubernetes 节点/worker 发生故障,它们将被替换。Pod 将在新节点上再次启动并重新附加其 EBS 卷。看上去就像什么都没发生一样。

现在,如果整个可用区“zone-a”出现故障并且在一段时间内不可用(意味着 cassandra-0 由于同一区域中的 EBS 的亲和力而无法再启动)。你剩下:

  • cassandra-1 -> 区域 b
  • cassandra-2 -> c 区

只要“zone-a”不可用,Kubernetes 将永远无法启动 cassandra-0。这一切都很好,因为 cassandra-1 和 cassandra-2 可以处理请求。

现在,如果除此之外,另一个 K8S 节点出现故障或者您设置了基础设施的自动扩展,则最终可能需要将 cassandra-1 或 cassandra-2 迁移到另一个 K8S 节点。这应该不是问题。

根据我的测试,K8S 不会这样做,因为 pod cassandra-0 已离线。它永远不会自我修复 cassandra-1 或 cassandra-2(或任何 cassandra-X),因为它希望首先恢复 cassandra-0。cassandra-0 无法启动,因为它的卷处于已关闭且无法恢复的区域。

因此,如果您跨区域使用Statefulset + VolumeClaim + 并且遇到 …

amazon-web-services kubernetes kubernetes-statefulset

5
推荐指数
1
解决办法
3662
查看次数

在 Kubernetes 中更新 Kafka 导致停机

我正在 Kubernetes 中运行 4 个代理 Kafka 集群。复制因子为 3,ISR 为 2。

此外,还有一个生成消息的生产者服务(运行 Spring 流)和一个从主题读取消息的消费者服务。现在我尝试用滚动更新的方式更新Kafka集群,希望不会出现停机,但是在更新过程中,生产者的日志中充满了这个错误:

org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition.
Run Code Online (Sandbox Code Playgroud)

根据我的计算,当 1 个代理宕机时,应该不会有问题,因为最小 ISR 是 2。但是,生产者服务似乎不知道滚动更新并继续向同一个代理发送消息......

有什么想法如何解决吗?

这是我的 kafka.yaml

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: kafka
  namespace: default
  labels:
    app: kafka
spec:
  serviceName: kafka
  replicas: 4
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: kafka
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9308"
    spec:
      nodeSelector:
        middleware.node: "true"
      imagePullSecrets:
      - name: nexus-registry
      terminationGracePeriodSeconds: 300
      containers:
      - name: kafka
        image: kafka:2.12-2.1.0
        imagePullPolicy: IfNotPresent …
Run Code Online (Sandbox Code Playgroud)

apache-kafka kubernetes spring-kafka kubernetes-statefulset

5
推荐指数
0
解决办法
592
查看次数

Kubernetes 上无状态应用程序的 StatefulSet 与 Deployment

我发现大量文章和文档描述了 Kubernetes 上有状态应用程序的 StatefulSet 相对于 Deployment 的优势。我无法弄清楚的是相反的情况:与 Deployments 相比,StatefulSet 的缺点,特别是对于无状态应用程序。

有人可以解释一下为什么不总是对有状态和无状态应用程序使用 StatefulSets 吗?

kubernetes kubernetes-deployment kubernetes-statefulset

5
推荐指数
1
解决办法
1041
查看次数

如果 Pod 未处于运行状态,则 statefulset 无法回滚

我已经使用自动滚动策略部署了 mongo 有状态 pod,下面是它的模板。部署成功,Pod 进入 Running 状态。

- apiVersion: apps/v1beta1
  kind: StatefulSet
  metadata:
    name: mongo
  spec:
    serviceName: "mongo"
    podManagementPolicy: Parallel
    replicas: 3
    strategy:
      type: Rolling
    template:
      metadata:
        labels:
          role: mongo
          environment: test
      spec:
        terminationGracePeriodSeconds: 10
        containers:
          - name: mongo
            image: mongo:4.0
            imagePullPolicy: Always
            command:
              - mongod
              - "--replSet"
              - rs0
              - "--bind_ip"
              - 0.0.0.0
              - "--smallfiles"
              - "--noprealloc"
            ports:
              - containerPort: 27017
            volumeMounts:
              - name: mongo-persistent-storage
                mountPath: /data/db
          - name: mongo-sidecar
            image: cvallance/mongo-k8s-sidecar
            env:
              - name: MONGO_SIDECAR_POD_LABELS
                value: "role=mongo,environment=test"
    updateStrategy: …
Run Code Online (Sandbox Code Playgroud)

openshift kubernetes-statefulset okd

5
推荐指数
1
解决办法
248
查看次数

如何在 Kubernetes 中设置 Pod DNS

我想知道是否有任何方法可以为 StatefulSet 中的 Pod 设置 DNS,以便我可以直接调用它们。

我已经阅读了 Kubernetes 文档,但没有看到任何有用的内容。

kubernetes kubernetes-statefulset

5
推荐指数
1
解决办法
146
查看次数