目前在做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 引用它。 谢谢!
请注意,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
并检查参数是如何传递到那里的。