Consul (KV) 在重启 Kubernetes 集群时擦除所有数据

问题描述 投票:0回答:1

目前在做Spring微服务(Eureka Implementation)项目。我们使用 Consul KV 来管理分布式配置。我们正在 Kubernetes 集群上部署服务。

我面临的问题是,每当我为 Consul 重新启动集群时,它都会删除 KV 的所有数据。我通过 Deployment.yaml 文件在本地使用 docker 镜像创建 Kubernetes 集群。 consul 请参考下面的 Deployment.yaml 文件

apiVersion: v1
kind: Service
metadata:
  name: consul
  labels:
    app: consul
spec:
  clusterIP: None
  ports:
    - port: 8500
      name: consul
  selector:
    app: consul
    
---
    
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: consul
spec:
  serviceName: consul
  replicas: 1
  selector:
    matchLabels:
      app: consul
  template:
    metadata:
      labels:
        app: consul
    spec:
      containers:
      - name: consul
        image: hashicorp/consul:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8500
---

apiVersion: v1
kind: Service
metadata:
  name: consul-lb
  labels:
    app: consul
spec:
  selector:
    app: consul
  type: NodePort
  ports:
  - port: 80
    targetPort: 8500

经过一些研究,我发现我们可以在配置中指定 -data-dir 位置,所以我修改了 StatefulSet kind yaml 如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: consul
spec:
  serviceName: consul
  replicas: 1
  selector:
    matchLabels:
      app: consul
  template:
    metadata:
      labels:
        app: consul
    spec:
      containers:
      - name: consul
        image: hashicorp/consul:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8500
        args:
            - "agent"
            - "-server"
            - "-data-dir=/home/consul/data"

但是在这个 Consul UI 没有启动之后,所以需要一些帮助来解决,所以即使在我删除 Consul 集群后它也会存储数据。 PS:我尝试用 helm 部署集群,它正在持久化数据,但我不知道如何创建该集群 StatefulSet,因此我可以在其他服务中使用静态 url 引用它。 谢谢!

kubernetes consul consul-kv
1个回答
0
投票

请注意,k8s

pods
默认情况下是短暂的,即使您将它们部署为
StatefulSet
.

StatefulSet
为您提供具有定义名称的
pod
选项,例如。
consul-0
而不是标准的
consul-<<random string>>
。它还会跟踪部署
pod
的位置,以防您有不同的区域并且需要将
pod
部署在与
storage
相同的区域中。

清单中缺少的是

volumeMounts
volumeClaimTemplates
部分。如果您将数据目录设置为
/home/consul/data
,您的清单应该类似于:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: consul
spec:
  serviceName: consul
  replicas: 1
  selector:
    matchLabels:
      app: consul
  template:
    metadata:
      labels:
        app: consul
    spec:
      containers:
      - name: consul
        image: hashicorp/consul:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8500
        args:
          - "agent"
          - "-server"
          - "-data-dir=/home/consul/data"
        volumeMounts:
        - name: consul-data
          mountPath: /home/consul/data
  volumeClaimTemplates:                       # volume claim template will create volume for you so you don't need to define PVC
  - metadata:
      name: consul-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"    # you can get this with kubectl get sc
      resources:
        requests:
          storage: 1Gi

关于

consul
UI 的第二个问题我不会有太大帮助,因为我从未使用过
consul
但我可以建议再次部署
helm chart
并检查参数是如何传递到那里的。

© www.soinside.com 2019 - 2024. All rights reserved.