将wordpress和mysql数据恢复到kubernetes卷

gv8xihay  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(331)

我目前正在同一集群的kubernetes pods上运行mysql、wordpress和我的自定义node.js+express应用程序。一切都很正常,但我的问题是,如果我必须重新运行部署、服务和持久卷,所有数据都将被重置。
我已经对wordpress进行了广泛的配置,希望保存所有的数据,并在重新部署之后再次插入。这怎么可能呢?还是我在想什么不对劲的事?我用的是mysql:5.6 and wordpress:4.8-apache images.
我还想将我的配置传递给我的其他团队成员,这样他们就不必再次配置wordpress了。
这是我的mysql-deploy.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: hidden
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql

      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

这是wordpress-deploy.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: NodePort
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          value: hidden
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim
7lrncoxx

7lrncoxx1#

这怎么可能呢?还是我在想什么不对劲的事?
最好将配置思维从直接在基本容器示例上工作转变为配置容器映像/清单。这里有几种方法,只是一些指针:
基于引用的映像创建自己的dockerfile,并将配置文件捆绑在其中。如果配置或多或少是静态的,并且可以使用env vars或docker映像的不常见构建来处理,但需要docker注册表处理才能使用k8s,那么这种方法是可行的。在这种方法中,您将添加所有更改的文件来构建docker的上下文,然后 COPY 把他们带到适当的地方。
创建configmaps并将它们作为需要更改的配置文件装载到容器文件系统上。这样,您仍然可以使用直接引用的基本图像,但更改仅限于kubernetes清单,而不是重建docker图像。这种情况下的方法是标识容器上所有更改的文件,然后从中创建kubernetes configmaps,最后适当地装载。我不知道您正在更改哪些内容,但下面是如何在configmap中放置nginx config的示例:

kind: ConfigMap
apiVersion: v1
metadata:
  name: cm-nginx-example
data:
  nginx.conf: |

     server {
        listen 80;

        ...
        # actual config here
        ...

      }

然后将其安装在容器中的适当位置,如下所示:

...
containers:
 - name: nginx-example
   image: nginx
   ports:
   - containerPort: 80
   volumeMounts:
     - mountPath: /etc/nginx/conf.d
       name: nginx-conf
 volumes:
 - name: nginx-conf
   configMap:
     name: cm-nginx-example
     items:
     - key: nginx.conf
       path: nginx.conf
...

在需要配置的地方装载持久卷(子路径),并在持久卷上保留配置。
就我个人而言,我可能会选择configmaps,因为您可以轻松地共享/编辑那些与k8s部署和配置细节不会丢失一些神秘的'广泛的工作',但可以审查,调整和存储到一些代码版本控制系统的版本跟踪。。。

相关问题