簡體   English   中英

kubernetes php nginx 部署共享卷

[英]kubernetes php nginx deployment share volume

在 kubernetes 中,我們嘗試通過將 php 代碼部署在預先打包的容器中來對我們的 PHP 代碼進行不可變的部署。

本質上,kubernetes 卷將目錄替換為空卷,但我想保留 php 容器的數據,以便我們可以與 nginx 容器共享該數據,該容器具有配置為連接到 php 容器的 vhost。

---
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 中的現有數據?

Kubernetes 沒有像 docker-compose 這樣的機制來共享某個文件夾作為卷。 但是您可以創建 Persistent Volume (PV) 和 Persistent Volume Claim (PVC) 並在容器之間共享您的數據。 它在來自 Docs 的文檔示例中進行了描述:

用於創建 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 中的兩個容器之間共享的數據的卷。

跑到同樣的情況。 這是一個示例將容器生命周期事件的處理程序附加到您的 php-fpm 圖像 my-stuff-php,在您的情況下:

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 組合在一個圖像中。

看起來您需要一個 initContainer 來托管您的源代碼,

然后做一個 postStart 將代碼復制到一個空的目錄共享卷,

因此 php-fpm 和 nginx 都會共享這個卷

在這種情況下,如果您的應用程序將在運行時寫入文件,

nginx 和 php-fpm 也可以讀取文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM