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

Ha *_* Ja 2 kubernetes kubectl

在发布此问题之前,我遵循以下答案:如何在Kubernetes中模仿“ --volumes-from”,但它对我不起作用。

我有2个容器:

  • 节点:其图像包含与应用程序相关的所有文件(在内部/var/www
  • nginx:它需要访问节点映像内的文件(尤其是/clientBuild我拥有所有资产的文件夹)

节点映像内部是什么:

$ docker run node ls -l
> clientBuild/
> package.json
> ...
Run Code Online (Sandbox Code Playgroud)

的一部分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/;
}
Run Code Online (Sandbox Code Playgroud)

以及部署设置:

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: {}
Run Code Online (Sandbox Code Playgroud)

我第一次尝试将两个图像在相同的containers钥匙,但我得到:/var/www/package.json not foundnpm start

然后我将其移入,initContainers但是现在我只知道它失败了,但没有告诉我原因。查看日志也不显示任何详细信息。

请注意,当我删除体积部分时,该npm start工程正常。

在此处输入图片说明

fis*_*x01 5

我假设您的资产已经打包在的映像中/var/www。如果emptyDir在该路径上安装卷,则其中的所有内容都会被emptyDir卷的内容覆盖-最初没有任何内容。这意味着您的所有资产都将通过该挂载被删除-这就是您的节点服务器很可能出现故障的原因。

您要做的是将emptyDir卷挂载到其他路径,例如/data。然后,覆盖节点容器cmd并将cp -r /var/www/* /data其复制到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: {}
Run Code Online (Sandbox Code Playgroud)

  • 将文件从一个目录复制到另一个目录可能会影响依赖于该目录路径的任何操作。除了“emptyDir”之外,是否没有任何类型可以使用来保留目录已有的内容?谢谢 (2认同)