首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kubernetes StorageClass不保留现有数据

kubernetes StorageClass不保留现有数据
EN

Stack Overflow用户
提问于 2019-04-10 19:57:15
回答 1查看 2.4K关注 0票数 2

当pod被删除并与postgresql数据库一起部署回时,我的Kubernetes StorageClass卷不会保留现有的数据。当我删除pod时,会创建新的pod,但是数据库是空的。

我跟踪了不同版本的教程(https://kubernetes.io/docs/concepts/storage/persistent-volumes/)的不同版本,但似乎没有什么能奏效。

我粘贴所有的YAML文件,因为问题可能在组合中。

storage-google.yaml

代码语言:javascript
复制
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: spingular-pvc
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 7Gi
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  zone: us-east4-a

jhipsterpress-postgresql.yml

代码语言:javascript
复制
apiVersion: v1
kind: Secret
metadata:
  name: jhipsterpress-postgresql
  namespace: default
  labels:
    app: jhipsterpress-postgresql
type: Opaque
data:
  postgres-password: NjY0NXJxd24=
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jhipsterpress-postgresql
  namespace: default
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: jhipsterpress-postgresql
    spec:
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: spingular-pvc
      containers:
      - name: postgres
        image: postgres:10.4
        env:
        - name: POSTGRES_USER
          value: jhipsterpress
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: jhipsterpress-postgresql
              key: postgres-password
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/
---
apiVersion: v1
kind: Service
metadata:
  name: jhipsterpress-postgresql
  namespace: default
spec:
  selector:
    app: jhipsterpress-postgresql
  ports:
  - name: postgresqlport
    port: 5432
  type: LoadBalancer

jhipsterpress-deployment.yml

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jhipsterpress
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jhipsterpress
      version: "v1"
  template:
    metadata:
      labels:
        app: jhipsterpress
        version: "v1"
    spec:
      initContainers:
        - name: init-ds
          image: busybox:latest
          command:
            - '/bin/sh'
            - '-c'
            - |
                while true
                do
                  rt=$(nc -z -w 1 jhipsterpress-postgresql 5432)
                  if [ $? -eq 0 ]; then
                    echo "DB is UP"
                    break
                  fi
                  echo "DB is not yet reachable;sleep for 10s before retry"
                  sleep 10
                done
      containers:
      - name: jhipsterpress-app
        image: galore/jhipsterpress
        env:
        - name: SPRING_PROFILES_ACTIVE
          value: prod
        - name: SPRING_DATASOURCE_URL
          value: jdbc:postgresql://jhipsterpress-postgresql.default.svc.cluster.local:5432/jhipsterpress
        - name: SPRING_DATASOURCE_USERNAME
          value: jhipsterpress
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: jhipsterpress-postgresql
              key: postgres-password
        - name: JAVA_OPTS
          value: " -Xmx256m -Xms256m"
        resources:
          requests:
            memory: "256Mi"
            cpu: "500m"
          limits:
            memory: "512Mi"
            cpu: "1"
        ports:
        - name: http
          containerPort: 8080
        readinessProbe:
          httpGet:
            path: /management/health
            port: http
          initialDelaySeconds: 20
          periodSeconds: 15
          failureThreshold: 6
        livenessProbe:
          httpGet:
            path: /management/health
            port: http
          initialDelaySeconds: 120

jhipsterpress-service.yml

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: jhipsterpress
  namespace: default
  labels:
    app: jhipsterpress
spec:
  selector:
    app: jhipsterpress
  type: LoadBalancer
  ports:
  - name: http
    port: 8080

当我包含一个保留策略时,我得到了以下错误:

代码语言:javascript
复制
@cloudshell:~ (academic-veld-230622)$ kubectl apply -f storage-google.yaml
error: error validating "storage-google.yaml": error validating data: 
ValidationError(PersistentVolumeClaim.spec): unknown field "persistentVolumeReclaimPolicy" in io.k8s.api.core.v1.PersistentVolumeClaimSpec; if you choose to ignore these errors, turn validation off with --validate=false

如果你知道一个完整的公众形象的例子(在postgresql中,我可以让它和Mongo一起工作),我会非常感激的。

多亏了所有人。

EN

回答 1

Stack Overflow用户

发布于 2019-04-10 23:50:20

请注意,为了工作,您需要动态地提供PVC以满足其需求,然后在PVC和PV之间将有一个永久的绑定,并且每次工作负载使用PVC时,它都会使用相同的PV。本节选特别指出:

如果动态地为新的PVC提供PV,则循环将始终将该PV绑定到PVC。

如果在您的示例中,Google持久磁盘是由PVC提供的,并且您可以验证GCP上每次使用的PV是相同的,那么它可能是删除所有数据的pod启动过程中的一个问题。(您使用/var/lib/postgresql/ vs /var/lib/postgresql有什么原因吗?)

另外,persistentVolumeReclaimPolicy: Retain适用于PV,而不是PVC。对于动态配置的PV,值为Delete。在您的情况下,它将不适用,因为您的动态配置卷应该绑定到您的PVC。换句话说,您不是在回收卷。

尽管如此,部署DB的推荐方法是使用StatefulSets,类似于使用volumeClaimTemplatemysql示例。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55620417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档