4

I have an python application whose docker build takes about 15-20 minutes. Here is how my Dockerfile looks like more or less

FROM ubuntu:18.04
...
COPY . /usr/local/app
RUN pip install -r /usr/local/app/requirements.txt
...
CMD ...

Now if I use skaffold, any code change triggers a rebuild and it is going to do a reinstall of all requirements(as from the COPY step everything else is going to be rebuild) regardless of whether they were already installed. iIn docker-compose this issue would be solved using volumes. In kubernetes, if we use volumes in the following way:

apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- image: test:test
name: test-container
volumeMounts:
- mountPath: /usr/local/venv # this is the directory of the 
# virtualenv of python
    name: test-volume
volumes:
- name: test-volume
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

will this extra requirements build be resolved with skaffold?

4

3 回答 3

4

我不能专门为 skaffold 说话,但可以改进容器映像构建。如果有可用的层缓存,则仅在requirements.txt更改时重新安装依赖项。这记录在“添加或复制”最佳实践中。

FROM ubuntu:18.04
...
COPY requirements.txt /usr/local/app/
RUN pip install -r /usr/local/app/requirements.txt
COPY . /usr/local/app
...
CMD ...

如果模块版本定义松散并且说您想要一个新的补丁版本,您可能需要触发更新。我发现要求应该是特定的,因此版本不会在您不知情/测试的情况下滑到您的应用程序下方。

Kaniko 集群内构建

对于 kaniko 构建以使用默认情况下没有持久存储的集群中的缓存,kaniko 需要安装持久卷 ( ) 或具有可用层--cache-dir的容器映像存储库 ( )。--cache-repo

于 2019-08-29T03:39:23.423 回答
3

如果您的目标是加快开发流程:您可以切换到基于同步的开发流程进行一次部署,然后更新正在运行的容器中的文件,而不是每次更改代码行时都触发全新的部署流程编辑代码时。

Skaffold 支持文件同步,如果您在本地计算机上更改它们,则可以直接更新已部署容器内的文件。但是,文档状态“文件同步是 alpha”(https://skaffold.dev/docs/how-tos/filesync/)我完全同意不久前使用它:同步机制只是单向的(没有从容器同步回本地)和相当多的错误,即在切换 git 分支、安装依赖项等时它经常崩溃,这可能很烦人。

如果您想要一个更稳定的基于同步的 Kubernetes 开发替代方案,并且非常容易上手,请查看 DevSpace:https ://github.com/devspace-cloud/devspace

我是 DevSpace 的维护者之一并开始了这个项目,因为 Skaffold 对我们的团队来说太慢了,而且当时它没有文件同步。

于 2019-08-28T23:38:02.593 回答
1

@Matt 的回答是一个很好的最佳实践(+1)——skaffold它本身并不能解决底层缓存失效问题,这导致必须在每次构建期间重新安装要求。

python为了提高性能,您可以将所有包缓存在volume挂载在您的 pod 中,例如:

apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- image: test:test
  name: test-container
volumeMounts:
- mountPath: /usr/local/venv
    name: test-volume
- mountPath: /root/.cache/pip
    name: pip-cache
volumes:
- name: test-volume
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4
- name: pip-cache
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

这样,如果构建缓存失效并且您必须重新安装,您requirements.txt可以通过从缓存中获取它们来节省一些时间。

如果您正在构建,kaniko您还可以使用 将基本图像缓存到永久磁盘kaniko-warmer,例如:

...
volumeMounts:
...
- mountPath: /cache
    name: kaniko-warmer
volumes:
...
- name: kaniko-warmer
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

运行kaniko-warmerpod 内部:docker run --rm -it -v /cache:/cache --entrypoint /kaniko/warmer gcr.io/kaniko-project/warmer --cache-dir=/cache --image=python:3.7-slim --image=nginx:1.17.3. 你skaffold.yaml可能看起来像:

apiVersion: skaffold/v1beta13
kind: Config
build:
  artifacts:
  - image: test:test
    kaniko:
      buildContext:
        localDir: {}
      cache:
        hostPath: /cache
  cluster:
    namespace: jx
    dockerConfig:
      secretName: jenkins-docker-cfg
  tagPolicy:
    envTemplate:
      template: '{{.DOCKER_REGISTRY}}/{{.IMAGE_NAME}}'
deploy:
  kubectl: {}
于 2019-08-29T20:07:03.897 回答