Kubernetes在Deployment内的容器之间共享卷

pnwntuvh  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(2)|浏览(127)

在发布这个问题之前,我遵循了这个答案How to mimic '--volumes-from' in Kubernetes,但它对我不起作用。
我有两个容器:

*node:其镜像包含与应用相关的所有文件(/var/www内部)
*nginx:需要访问node镜像里面的文件(特别是我所有资产所在的/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键中,但我得到了:npm start上的/var/www/package.json not found
然后我把它移到initContainers里面,但现在我只有一个通知,它失败了,但它没有告诉我为什么。查看日志也不显示任何详细信息。
请注意,当我删除卷部分时,npm start工作正常。


的数据

qvk1mo1f

qvk1mo1f1#

我假设您的资产已经打包在/var/www的映像中。如果您在该路径上挂载一个emptyDir卷,那么那里的所有内容都将被emptyDir卷的内容覆盖-最初它什么都没有。这意味着您的所有资产都将通过该装载删除-这就是您的节点服务器最有可能失败的原因。
您要做的是将emptyDir卷挂载到其他路径,比如/data。然后用cp -r /var/www/* /data覆盖节点容器cmd,以将资源复制到pwa-disk卷中。现在,您可以将此卷挂载到nginx容器中。
我认为对initContainers的工作原理存在误解。它们注定要终结。它们运行之前运行任何其他容器-在你的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: {}

字符串

rsl1atfo

rsl1atfo2#

我刚刚在kubernetes中遇到了shareProcessNamespace,并认为这将非常适合这个用例。
请参阅:https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/

apiVersion: apps/v1
kind: Deployment
metadata:
  name: datasharing
spec:
  selector:
    matchLabels:
      app: datasharing
  template:
    metadata:
      labels:
        app: datasharing
    spec:
      shareProcessNamespace: true
      containers:
        - name: data
          image: ubuntu
          imagePullPolicy: IfNotPresent
          command: ["/bin/bash", "-c"]
          args: ["trap 'echo signal;exit 0' SIGINT; sleep infinity"]
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
          lifecycle:
            postStart:
              exec:
                command:
                  - /bin/sh
                  - -c
                  - mkdir -p /DATA && touch /DATA/empty_test_file
        - name: nginx
          image: nginx:stable
          imagePullPolicy: IfNotPresent
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
          ports:
            - containerPort: 8080
          env:
            - name: GET_DATA_PROC_DIR
              value: 'find /proc -maxdepth 1 -type d -regex "/proc/[0-9]*" | head -2 | tail -1'
          lifecycle:
            postStart:
              exec:
                command:
                  - /bin/sh
                  - -c
                  - ln -s $(eval $GET_DATA_PROC_DIR)/root/DATA /mnt/DATA

字符串
在这个例子中,我们有一个数据容器,只是把一个空文件放在/DATA中,另一个容器(在这个例子中是nginx)通过在/proc中找到第二个PID来创建一个symlink
这是可行的,因为数据容器是容器数组中的第一个,并且必须在shareProcessNamespace中具有第二个PID

相关问题