Kubernetes在部署中的容器之间共享卷

时间:2017-09-24 12:01:32

标签: kubernetes kubectl

在发布此问题之前,我遵循了这个答案How to mimic '--volumes-from' in 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 found上的npm start

然后我把它移到了initContainers里面,但现在我只注意到它失败了,但它并没有告诉我原因。查看日志也不会显示任何详细信息。

请注意,当我删除音量部分时,npm start可以正常工作。

enter image description here

1 个答案:

答案 0 :(得分:4)

我认为您的资产已经打包在/var/www的图片中。如果您在该路径上安装emptyDir卷,那么所有内容都会被emptyDir卷的内容覆盖 - 最初什么都不是。这意味着您的所有资产都将通过该挂载删除 - 这就是您的节点服务器很可能失败的原因。

您要做的是将emptyDir卷安装在其他路径上,例如/data。然后,您使用cp -r /var/www/* /data覆盖节点容器cmd,将资产复制到pwa-disk卷中。现在,您可以将此卷装入nginx容器中。

我认为对initContainers的工作方式存在误解。他们打算终止。他们运行 BEFORE 启动任何其他容器 - 在您的initContainers成功终止之前,您的pod中没有其他容器启动。因此,您很可能不希望将节点服务器作为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: {}