【问题标题】:How to save SQL storage data in running preemtible instance?如何在运行的抢占式实例中保存 SQL 存储数据?
【发布时间】:2019-08-18 22:40:09
【问题描述】:
我正在努力降低在 Google Cloud Platform 上运行 Kubernetes 集群的成本。
我将节点池移至抢占式 VM 实例。我有 1 个用于 Postgres 的 pod 和 4 个用于 Web 应用程序的节点。
对于 Postgres,我创建了 StorageClass 来使数据持久化。
令人惊讶的是,也许不是,一天后所有存储数据都被清除了。
如何使 GCP 中的特定节点不可抢占?
或者,您能建议在这种情况下该怎么做吗?
【问题讨论】:
标签:
kubernetes
google-cloud-platform
persistence
devops
gcloud
【解决方案1】:
我想我找到了解决办法。
- 通过以下方式在 gcloud 上创建磁盘:
gcloud compute disks create --size=10GB postgres-disk
gcloud compute disks create --size=[SIZE] [NAME]
- 删除所有 StorageClasses、PV、PVC
- 配置部署文件:
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
selector:
matchLabels:
app: postgres
replicas: 1
template:
metadata:
labels:
app: postgres
role: postgres
spec:
containers:
- name: postgres
image: postgres
env:
...
ports:
...
# Especially this part should be configured!
volumeMounts:
- name: postgres-persistent-storage
mountPath: /var/lib/postgresql
volumes:
- name: postgres-persistent-storage
gcePersistentDisk:
# This GCE PD must already exist.
pdName: postgres-disk
fsType: ext4
【解决方案2】:
您可以在 Google Kubernetes Engine 集群中使特定节点不可抢占,如 official documentation 中所述。
设置具有可抢占和不可抢占节点池的集群的步骤是:
- 创建集群:在 GCP Console 中,转到 Kubernetes Engine -> 创建集群,然后根据需要配置集群。
- 在该配置页面的节点池下,单击添加节点池。输入默认和新池的节点数。
- 要使其中一个池可抢占,请单击池名称下的 Advance edit 按钮,选中 Enable preemptible nodes (beta) 框,然后保存更改.
- 点击创建。
那么您可能只想在不可抢占的节点上安排特定的 pod。为此,您可以use node taints。
【解决方案3】:
您可以使用名为 GKE google kubernetes 集群的 GCP 托管服务。
并且存储类更改导致的存储数据被擦除可能不会保留策略和PVC。
我认为最好使用托管服务。