Knative - kubernetes yaml 从 google 云存储挂载数据
Knative - kubernetes yaml to mount data from google cloud storage
我是使用 YAML 文件进行 Kubernetes 和 Cloudrun 部署的新手,如果这个问题应该非常基础,请原谅。
问题:我有文件存储在云存储中。我想在容器启动我的 docker 入口点之前将这些文件下载到本地装载中。
It is my understanding that KNative does not support volumes or
persistentVolumeClaims.
如有理解错误请指正
让我用下面的图片更好地解释一下,
在 Kubernetes pod 内部,我将容器启动分为 3 个部分。
- 从 GCS(Google 云存储)下载文件的预挂钩 -> 这会将文件从 google 存储复制到本地安装。可以使用某种带有 cloudsdk 映像的初始化容器,然后使用 gsutils 将文件复制下来。
- 本地挂载文件系统 -> prehook 将写入此挂载。具有“容器映像”的容器也可以访问此挂载。
- 容器图像 -> 这是我在容器中的主要容器图像 运行。
我正在寻找适用于 cloudrun 的 Knative 服务解决方案。我该如何解决?
另外,是否可以在没有Knative服务的情况下使用yaml文件来创建cloudrun服务?
如您所说,Knative 合约不允许挂载或认领卷。所以,你无法实现这一点(目前,在云端 运行 托管)。
另一方面,Pod 允许这样做,但 Knative 是“Pod”的特殊版本:没有持久卷,也不能定义容器列表,它是一个只有一个容器的 pod(+网格(大部分时间是 Istio)部署时注入的 sidecar)
对于你的附加问题,Cloud 运行 实现了 Knative API。因此,您需要提供 Knative 服务 YAML 文件来配置您的服务。
如果要写入文件,可以在内存分区/tmp
中进行。因此,在您的容器启动时,下载文件并将它们存储在那里。但是,如果您更新文件,需要推送更新,则需要手动推送到云存储。
此外,已经下载文件并将其存储在 /tmp
目录中的其他 运行 个实例将不会在 Cloud Storage 中看到文件更改;这只是新实例。
更新 1:
如果您想在容器启动“之前”下载文件,您有 2 个解决方案:
- “之前”是不可能的,你可以在启动时这样做:
- 容器启动
- 下载文件,启动你所需要的
- 使用您的网络服务器提供流量。
之前的解决方案有 2 个问题
- 服务冷启动受到服务前下载的影响
- 文件的最大大小受实例最大内存大小的限制(
/tmp
目录是内存中的文件系统。如果您的配置为 2Gb,则大小为最大 2Gb 减去您的应用程序的内存占用)
- 第二种解决方案是使用容器映像中已存在的文件构建容器。
- 无冷启动影响
- 无内存限制
- 降低您的敏捷性,您需要通过文件更改来构建和部署新修订版。
更新 2:
对于解决方案 1,它不是 Knative 解决方案,它在您的代码中!我不知道你的语言和框架,但在启动时,你需要使用 Google Cloud Storage 客户端库从你的代码中下载你需要的文件。
告诉我你的服务器启动情况,我可以尝试为你提供一个例子!
对于解决方案 2,文件不在您的 git 存储库中,但仍在您的云存储中。您的 Docker 文件看起来像这样
FROM google/cloud-sdk:alpine as gcloud
WORKDIR /app
# IF you aren't building your image on Cloud Build, you need to be authenticated
#ARG KEY_FILE_CONTENT
#RUN echo $KEY_FILE_CONTENT | gcloud auth activate-service-account --key-file=- && \
# Get the file(s)
gsutil cp gs://my-bucket/name.csv .
FROM golang:1.15-buster as builder
WORKDIR /app
COPY go.* ./
....
RUN go build -v -o server
FROM debian:buster-slim
# Copy the binary to the production image from the builder stage.
COPY --from=builder /app/server /app/server
COPY --from=gcloud /app/name.csv /app/name.csv
# Run the web service on container startup.
CMD ["/app/server"]
您也可以想象在 Docker 构建命令之前下载文件并简单地在 Docker 文件中执行复制。我不知道你的容器创建管道,但它是你可以重复使用的想法!
我是使用 YAML 文件进行 Kubernetes 和 Cloudrun 部署的新手,如果这个问题应该非常基础,请原谅。
问题:我有文件存储在云存储中。我想在容器启动我的 docker 入口点之前将这些文件下载到本地装载中。
It is my understanding that KNative does not support volumes or persistentVolumeClaims.
如有理解错误请指正
让我用下面的图片更好地解释一下,
在 Kubernetes pod 内部,我将容器启动分为 3 个部分。
- 从 GCS(Google 云存储)下载文件的预挂钩 -> 这会将文件从 google 存储复制到本地安装。可以使用某种带有 cloudsdk 映像的初始化容器,然后使用 gsutils 将文件复制下来。
- 本地挂载文件系统 -> prehook 将写入此挂载。具有“容器映像”的容器也可以访问此挂载。
- 容器图像 -> 这是我在容器中的主要容器图像 运行。
我正在寻找适用于 cloudrun 的 Knative 服务解决方案。我该如何解决?
另外,是否可以在没有Knative服务的情况下使用yaml文件来创建cloudrun服务?
如您所说,Knative 合约不允许挂载或认领卷。所以,你无法实现这一点(目前,在云端 运行 托管)。
另一方面,Pod 允许这样做,但 Knative 是“Pod”的特殊版本:没有持久卷,也不能定义容器列表,它是一个只有一个容器的 pod(+网格(大部分时间是 Istio)部署时注入的 sidecar)
对于你的附加问题,Cloud 运行 实现了 Knative API。因此,您需要提供 Knative 服务 YAML 文件来配置您的服务。
如果要写入文件,可以在内存分区/tmp
中进行。因此,在您的容器启动时,下载文件并将它们存储在那里。但是,如果您更新文件,需要推送更新,则需要手动推送到云存储。
此外,已经下载文件并将其存储在 /tmp
目录中的其他 运行 个实例将不会在 Cloud Storage 中看到文件更改;这只是新实例。
更新 1:
如果您想在容器启动“之前”下载文件,您有 2 个解决方案:
- “之前”是不可能的,你可以在启动时这样做:
- 容器启动
- 下载文件,启动你所需要的
- 使用您的网络服务器提供流量。
之前的解决方案有 2 个问题
- 服务冷启动受到服务前下载的影响
- 文件的最大大小受实例最大内存大小的限制(
/tmp
目录是内存中的文件系统。如果您的配置为 2Gb,则大小为最大 2Gb 减去您的应用程序的内存占用)
- 第二种解决方案是使用容器映像中已存在的文件构建容器。
- 无冷启动影响
- 无内存限制
- 降低您的敏捷性,您需要通过文件更改来构建和部署新修订版。
更新 2:
对于解决方案 1,它不是 Knative 解决方案,它在您的代码中!我不知道你的语言和框架,但在启动时,你需要使用 Google Cloud Storage 客户端库从你的代码中下载你需要的文件。
告诉我你的服务器启动情况,我可以尝试为你提供一个例子!
对于解决方案 2,文件不在您的 git 存储库中,但仍在您的云存储中。您的 Docker 文件看起来像这样
FROM google/cloud-sdk:alpine as gcloud
WORKDIR /app
# IF you aren't building your image on Cloud Build, you need to be authenticated
#ARG KEY_FILE_CONTENT
#RUN echo $KEY_FILE_CONTENT | gcloud auth activate-service-account --key-file=- && \
# Get the file(s)
gsutil cp gs://my-bucket/name.csv .
FROM golang:1.15-buster as builder
WORKDIR /app
COPY go.* ./
....
RUN go build -v -o server
FROM debian:buster-slim
# Copy the binary to the production image from the builder stage.
COPY --from=builder /app/server /app/server
COPY --from=gcloud /app/name.csv /app/name.csv
# Run the web service on container startup.
CMD ["/app/server"]
您也可以想象在 Docker 构建命令之前下载文件并简单地在 Docker 文件中执行复制。我不知道你的容器创建管道,但它是你可以重复使用的想法!