【问题标题】:Clear Kubernetes persistent volume on new image清除新映像上的 Kubernetes 持久卷
【发布时间】:2021-01-17 16:47:27
【问题描述】:

我部署了一个带有自定义 docker 镜像的 wordpress,该镜像将自定义主题复制到该镜像中,该镜像被部署到具有持久卷的 kubernetes 集群中。

初始部署效果很好,网站按预期显示。当我更新主题并部署新的 docker 映像时,问题就出现了,因为持久卷,主题文件似乎没有更新到 docker 映像中的新版本主题。

部署新镜像时是否有清除/重置 wp-content/themes/my-theme 目录的方法?

感谢任何帮助,下面的代码示例。

Dockerfile:

FROM wordpress:latest
COPY ./my-thtme /usr/src/wordpress/wp-content/themes/my-theme

永久卷声明:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress
spec:
    accessModes:
        - ReadWriteMany
    resources:
        requests:
            storage: 2Gi
    storageClass: "nfs"

部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      imagePullSecrets:
        - name: gitlab-auth
      containers:
        - name: wordpress
          image: registry.gitlab.com/user/wordpress:1234
          imagePullPolicy: IfNotPresent
          env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql
            - name: WORDPRESS_DB_USER
              value: mysql_wordpress
            - name: WORDPRESS_DB_NAME
              value: wordpress
            - name: WORDPRESS_DB_TABLE_PREFIX
              value: _wp
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: mysql-password
          volumeMounts:
          - name: wordpress-data
            mountPath: /var/www/html/wp-content
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
      volumes:
      - name: wordpress-data
        persistentVolumeClaim:
          claimName: wordpress

【问题讨论】:

  • Kubernetes 不会对卷的内容做任何事情;如果你想在升级时有一些特定的行为,你需要自己在容器代码中实现它。
  • 如果在Pod 中的应用容器启动之前存在,可以使用initContainer 从持久卷中清除文件。

标签: wordpress docker kubernetes gitlab


【解决方案1】:

有不止一种方法可以做到这一点。您可以在Deployment 规范中添加initContainer 以在Pod 中的应用容器启动之前从Persistent Volume 中删除现有文件。例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      imagePullSecrets:
        - name: gitlab-auth
      initContainers:
      - name: init-theme
        image: "alpine:3"
        command: ["sh", "-c", "if [ -d /var/www/html/wp-content/my-theme ]; then rm -rf /var/www/html/wp-content/my-theme; fi"]
        volumeMounts:
          - name: workdpress-data
            mountPath: /var/www/html/wp-content
      containers:
      ...
      volumes:
      - name: wordpress-data
        persistentVolumeClaim:
          claimName: wordpress

【讨论】:

  • 这是一个现实解决方案的一半。我的问题是它在应用程序的每次复制上都执行。例如,如果我们从 1 个 pod 变为 3 个,它将在每个 pod init 上运行 init 容器,这是不可取的。考虑在部署新映像之前将其作为部署更新的工作来清除卷中的主题。
猜你喜欢
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2018-12-09
  • 1970-01-01
相关资源
最近更新 更多