如何在skaffold.yml中命名版本化图像

时间:2019-05-29 10:32:30

标签: kubernetes jib skaffold

我有一个多模块Maven项目(Spring Boot),我使用JIB Maven插件生成了docker映像,但是如何在支架中命名映像?我正在推送到本地docker repo,而Skaffold afaik不支持模板。建议在Skaffold中引用这些图像?

请记住,对于每个模块单独的图像,我需要将其命名为:

 ${image.registry.host}:${image.registry.port}/${project.artifact} 

所以别无选择,只能将它们参数化为pom。

我现在是否需要将主机名和端口名放入skaffold文件中?处理此atm的最佳方法是什么?而Kubernetes部署描述符中的名称又如何呢?

  <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>jib-maven-plugin</artifactId>
            <version>${jib-maven-plugin.version}</version>
            <configuration>
                <!--If you want custom base image and push  registry, use below configuration replace above-->
                <from>
                    <image>openjdk:8-jdk-alpine</image>
                </from>
                <to>
                        **<image>${image.registry.host}:${image.registry.port}/${project.artifactId}**:${project.version}</image>
                </to>
                <container>
                    <jvmFlags>
                        <jvmFlag>-Djava.security.egd=file:/dev/./urandom</jvmFlag>
                        <jvmFlag>-Xdebug</jvmFlag>
                        <jvmFlag>-Duser.timezone=GMT+08</jvmFlag>
                    </jvmFlags>
                          <mainClass>com.example.jib.JibApplication</mainClass>
                    <ports>
                        <port>8080</port>
                    </ports>
                </container>
                    <allowInsecureRegistries>true</allowInsecureRegistries>
            </configuration>
        </plugin>


What goes in the Scaffold.yml for image name?

apiVersion: skaffold/v1beta4
kind: Config
# Enforce SKaffold to use Jib
build:
  local:
  push: false
# Generated artifact
artifacts:
    **- image: lvthillo/my-app. ??????????? HOW SHOULD I NAME THIS?
      image: module2/ ???????**
# Use jibMaven
      jibMaven: {}
   # Execute deployment.yml
deploy:
      kubectl:
      manifests:
      - kubernetes/deployment.yml

这是Kubernetes部署描述符。

图片应在此处使用什么名称?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-deployment
spec:
  replicas: 1
selector:
  matchLabels:
     app: spring-boot-jib
template:
   metadata:
     labels:
       app: spring-boot-jib
   spec:
   containers:
      - name: spring-boot-jib-pod

      **image: lvthillo/my-app.   ????????? What name here???**
      imagePullPolicy: IfNotPresent
      ports:
        - name: http
          containerPort: 8080

   apiVersion: v1
   kind: Service
   metadata:
    name: spring-boot-jib-service
  spec:
  type: NodePort
  ports:
      - protocol: TCP
        port: 8080
        nodePort: 32321
  selector:
      app: spring-boot-jib

1 个答案:

答案 0 :(得分:0)

当将Jib与Skaffold一起使用时,Skaffold是主要角色,它会覆盖Jib使用的图像参考。 Skaffold将决定应使用的映像名称,并将在Kubernetes清单中重写映像引用以在部署之前进行匹配。

如果您是针对诸如Minikube之类的本地集群开发的,那么Skaffold会导致将映像直接加载到Minikube的Docker守护程序中;他们永远不会被推送到实际的注册表。 (用副臂术语,Skaffold将调用jib:dockerBuild而不是jib:build到注册表。)因此,您可以将生产图像参考保存在skaffold.yaml中。

如果要推送到注册表,则根据设置有三个选项:

  1. 如果您具有本地设置或针对每个开发人员的设置,请保留生产图像参考,并让开发人员使用Skaffold的--default-repo选项:它将转换并替换以下内容的 repository 部分skaffold.yaml中指定的图像引用指向该新存储库。

  2. 如果开发人员可以在同一注册表和存储库中混合使用,则Skaffold taggers应该确保开发人员的推送映像不会冲突。您可以使用[envTemplate标签机根据$USER等环境信息生成不同的图像标签。

  3. 您可以使用Skaffold's profilespatches覆盖图像。创建正确的JSON修补程序可能会遇到一些失败或失败的感觉,但是它非常强大。

我个人使用--default-repo方法。