kubernetes php nginx部署共享卷

时间:2018-07-30 13:57:22

标签: php docker nginx kubernetes docker-compose

在kubernetes中,我们试图通过在预先包装的容器中部署php代码来实现对PHP代码的不可变部署。

自然地,kubernetes卷将目录替换为空卷,但我想保留php容器的数据,以便我们可以与nginx容器共享该信息,该容器已将vhost配置为连接到php容器。

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: serviceability
spec:
  replicas: 1
  template:
    metadata:
     spec:
      containers:
      - name: my-stuff-php
        image: our-php-service-in-fpm-container:latest
        ports:
        - containerPort: 9000
          name: transport
          protocol: TCP
        volumeMounts:
        - name: my-volume
          mountPath: /var/www/html
      - name: my-stuff-nginx
        image: nginx:latest
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        volumeMounts:
        - name: my-volume
          mountPath: /var/www/html
      volumes:
      - name: my-volume
        emptyDir: {}

与docker-compose相似的设置与docker-compose的行为在卷方面有所不同。

如何与nginx容器共享来自php容器的/ var / www / html中的现有数据?

3 个答案:

答案 0 :(得分:1)

Kubernetes没有像docker-compose这样的机制来共享某些文件夹作为卷。但是您可以创建持久卷(PV)和持久卷声明(PVC),并在容器之间共享数据。 documentation中对此进行了描述 文档中的示例:

用于创建PV的YAML

kind: PersistentVolume
apiVersion: v1
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/mnt/data"

比起用这个体积制作PVC

YAML:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

用于部署的YAML如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: serviceability
spec:
  replicas: 1
  template:
    metadata:
     spec:
      containers:
      - name: my-stuff-php
        image: our-php-service-in-fpm-container:latest
        ports:
        - containerPort: 9000
          name: transport
          protocol: TCP
        volumeMounts:
        - name: name: task-pv-storage
          mountPath: /var/www/html
      - name: my-stuff-nginx
        image: nginx:latest
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        volumeMounts:
        - name: name: task-pv-storage
          mountPath: /var/www/html
      volumes:
      - name: task-pv-storage
        ersistentVolumeClaim:
        claimName: task-pv-claim

因此,您将拥有包含在Pod中的两个容器之间共享的数据的卷。

答案 1 :(得分:0)

在相同情况下跑。这是您的php-fpm映像my-stuff-php的exampleAttach Handlers to Container Lifecycle Events

lifecycle:
    postStart:
      exec:
        command: ["/bin/sh", "-c", "cp -r /app/. /var/www/html"]
  1. /app目录中使用代码构建php-fpm。
  2. 使用emptyDir创建共享卷,该共享卷也是nginx文档的根。
  3. 使用上面的示例lifecycle.postStart.exec.command将源代码复制到该共享卷。

但不确定这是否是最佳方法。另一种方法是将nginx和php-fpm合并在一个图像中。

答案 2 :(得分:0)

看起来您需要一个initContainer来托管源代码,

然后创建一个帖子开始将代码复制到一个空的目录共享卷中,

因此php-fpm和nginx将共享此卷

在这种情况下,如果您的应用程序将在运行时写入文件,

nginx和php-fpm都可以读取文件