2017-09-24 120 views
0

在發佈此問題之前,我遵循此答案How to mimic '--volumes-from' in Kubernetes,但它對我無效。Kubernetes在部署中的容器之間共享容量

我有2個集裝箱:

  • 節點:它的形象包含了所有相關的應用程序(內部/var/www
  • nginx的文件:它需要訪問節點裏面的文件圖片(尤其是/clientBuild文件夾,我擁有所有資產)

什麼是節點內圖像:

$ docker run node ls -l 
> clientBuild/ 
> package.json 
> ... 

nginx.prod.conf的一部分:

location ~* \.(jpeg|jpg|gif|png|ico|css|js|gz|map|json)$ { 
    include /etc/nginx/mime.types; 
    root /usr/local/nginx/html/clientBuild/; 
} 

而且安裝部署:

kind: Deployment 
apiVersion: extensions/v1beta1 
metadata: 
    name: pwa-app-production 
    labels: 
    app: MyApp 
spec: 
    replicas: 1 
    template: 
    metadata: 
     name: app 
     labels: 
     app: MyApp 
     env: production 
    spec: 
     containers: 
     - name: nginx 
     image: nginx 
     command: [nginx, -c, /nginx.prod.conf, -g, 'daemon off;'] 
     resources: 
      limits: 
      memory: "500Mi" 
      cpu: "100m" 
     imagePullPolicy: Always 
     volumeMounts: 
      - mountPath: /usr/local/nginx/html 
      name: pwa-disk 
      readOnly: true 
     ports: 
     - name: nginx 
      containerPort: 80 
     initContainers: 
     - name: node 
     image: node 
     command: [npm, start] 
     resources: 
      limits: 
      memory: "500Mi" 
      cpu: "100m" 
     imagePullPolicy: Always 
     volumeMounts: 
      - mountPath: /var/www 
      name: pwa-disk 
     ports: 
     - name: app 
      containerPort: 3000 
     - name: api 
      containerPort: 3001 
     volumes: 
     - name: pwa-disk 
      emptyDir: {} 

我第一次嘗試將兩個圖像在同一containers鍵,但我得到了:/var/www/package.json not foundnpm start

然後我把它移到initContainers裏面,但是現在我只是注意到它失敗了,但它沒有告訴我爲什麼。查看日誌也不會顯示任何詳細信息。

請注意,當我刪除卷部分時,npm start工作。

enter image description here

+0

節點圖像是否已與生成的資產一起打包?或者,一旦容器在你的k8s集羣中的'npm start'啓動時它們就會生成? – fishi

回答

1

我假設你的資產在/var/www已經打包在圖像內。如果您在該路徑上安裝了一個emptyDir卷,那麼所有內容都會被emptyDir卷的內容覆蓋 - 最初什麼都不是。這意味着所有資產都會通過該掛載刪除 - 這就是爲什麼您的節點服務器很可能會失敗。

你想要做的是在其他路徑上掛載emptyDir卷,比如/data。然後用cp -r /var/www/* /data覆蓋節點容器cmd,將資產複製到您的pwa-disk卷中。現在,您可以將此卷掛載到您的nginx容器中。

我認爲initContainers的工作方式存在誤解。他們打算終止。他們運行之前任何其他容器已啓動 - 您的容器內沒有其他容器啓動,直到您的initContainers已成功終止。所以很可能你不想以initContainer開始你的節點服務器。我猜你的節點服務器不應該終止,在這種情況下,你的nginx容器永遠不會啓動。相反,您可能想要在containers部分中將您的節點服務器與您的nginx一起聲明。此外,還可以將節點容器與覆蓋的cmd(cp -r /var/www/* /data)一起添加到initContainers部分,以將資產複製到卷。整個事情可能看起來像這樣:

kind: Deployment 
apiVersion: extensions/v1beta1 
metadata: 
    name: pwa-app-production 
    labels: 
    app: MyApp 
spec: 
    replicas: 1 
    template: 
    metadata: 
     name: app 
     labels: 
     app: MyApp 
     env: production 
    spec: 
     containers: 
     - name: nginx 
     image: nginx 
     command: [nginx, -c, /nginx.prod.conf, -g, 'daemon off;'] 
     resources: 
      limits: 
      memory: "500Mi" 
      cpu: "100m" 
     imagePullPolicy: Always 
     volumeMounts: 
      - mountPath: /usr/local/nginx/html 
      name: pwa-disk 
      readOnly: true 
     ports: 
     - name: nginx 
      containerPort: 80 
     - name: node 
     image: node 
     command: [npm, start] 
     resources: 
      limits: 
      memory: "500Mi" 
      cpu: "100m" 
     imagePullPolicy: Always 
     ports: 
     - name: app 
      containerPort: 3000 
     - name: api 
      containerPort: 3001 

     initContainers: 
     - name: assets 
     image: node 
     command: [bash, -c] 
     args: ["cp -r /var/www/* /data"] 
     imagePullPolicy: Always 
     volumeMounts: 
      - mountPath: /data 
      name: pwa-disk 
     volumes: 
     - name: pwa-disk 
      emptyDir: {} 
+0

謝謝你的作品! –

相關問題