有没有办法在单个裸机 kubernetes 节点上实现动态存储配置?我需要为具有多个副本的 StatefulSet 动态配置存储卷。
因为我还没有找到。
我有我的部署,我在其中定义了 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) 有时,我需要对 StatefulSet 中的所有 Pod 进行滚动替换,以便所有 PV 也从头开始重新创建。这样做的原因是摆脱所有使用旧版本加密密钥的底层硬盘驱动器。此操作不应与常规滚动升级相混淆,为此我仍然希望卷能够在 Pod 终止后继续存在。到目前为止,我认为最好的例程如下:
我对第 5 步不满意。我希望 StatefulSet 为我重新创建 PVC,但不幸的是它没有。我必须自己做,否则 Pod 创建失败并出现以下错误:
Warning FailedScheduling 3s (x15 over 15m) default-scheduler persistentvolumeclaim "foo-bar-0" not found
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?
我有一个有 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才能访问。
我的 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
考虑跨 3 个可用区的 Statefulset(Cassandra 使用官方 K8S 示例):
每个 Cassandra Pod 都使用一个 EBS 卷。所以自然而然就有了亲和力。例如,cassandra-0 无法移动到“zone-b”,因为它的卷位于“zone-a”中。都好。
如果某些 Kubernetes 节点/worker 发生故障,它们将被替换。Pod 将在新节点上再次启动并重新附加其 EBS 卷。看上去就像什么都没发生一样。
现在,如果整个可用区“zone-a”出现故障并且在一段时间内不可用(意味着 cassandra-0 由于同一区域中的 EBS 的亲和力而无法再启动)。你剩下:
只要“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 + 并且遇到 …
我正在 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) 我发现大量文章和文档描述了 Kubernetes 上有状态应用程序的 StatefulSet 相对于 Deployment 的优势。我无法弄清楚的是相反的情况:与 Deployments 相比,StatefulSet 的缺点,特别是对于无状态应用程序。
有人可以解释一下为什么不总是对有状态和无状态应用程序使用 StatefulSets 吗?
我已经使用自动滚动策略部署了 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) 我想知道是否有任何方法可以为 StatefulSet 中的 Pod 设置 DNS,以便我可以直接调用它们。
我已经阅读了 Kubernetes 文档,但没有看到任何有用的内容。
kubernetes ×9
apache-kafka ×1
deployment ×1
devops ×1
dynamic ×1
okd ×1
openshift ×1
spring-kafka ×1
storage ×1