【问题标题】:Cloud Build kubectl - How to Apply Output of Previous Step to Kubernetes ClusterCloud Build kubectl - 如何将上一步的输出应用到 Kubernetes 集群
【发布时间】:2020-02-02 17:10:00
【问题描述】:

我有一个简单的 cloudbuild.yaml 文件,它运行 Bazel 命令。此命令以日志输出形式返回 Kubernetes 配置。

我的目标是获取第一步的输出并将其应用到我的 Kubernetes 集群。

steps:
  - name: gcr.io/cloud-builders/bazel
    args: ["run", "//:kubernetes"]

  - name: "gcr.io/cloud-builders/kubectl"
    args: ["apply", "<log output of previous step>"]
    env:
      - "CLOUDSDK_COMPUTE_ZONE=europe-west3-a"
      - "CLOUDSDK_CONTAINER_CLUSTER=cents-ideas"

更新

我尝试了以下方法:

- name: gcr.io/cloud-builders/bazel
  entrypoint: /bin/bash
  args:
    [
      "bazel",
      "run",
      "//:kubernetes",
      " > kubernetes.yaml",
    ]

- name: "gcr.io/cloud-builders/kubectl"
  args: ["apply", "-f", "kubernetes.yaml"]
  env:
    - "CLOUDSDK_COMPUTE_ZONE=europe-west3-a"
    - "CLOUDSDK_CONTAINER_CLUSTER=cents-ideas"

然后我得到这个错误:

Running: kubectl apply -f kubernetes.yaml
error: the path "kubernetes.yaml" does not exist

【问题讨论】:

    标签: kubernetes google-kubernetes-engine bazel kubectl google-cloud-build


    【解决方案1】:

    以下是安装卷的方法:

    https://cloud.google.com/cloud-build/docs/build-config#volumes

    基本加:

      volumes:
      - name: 'vol1'
        path: '/persistent_volume'
    

    然后在写入/读取文件时引用完整路径/persistent_volume/filename/

    【讨论】:

    • 这似乎是要走的路......但我总是收到我的路径不存在的错误。有没有办法查看卷目录?
    • 您只需添加一个ls 命令。使用ls 为您想要的每个目录创建另一个步骤。
    【解决方案2】:

    将同一目录(不是文件)卷挂到两个步骤中。

    将 Bazel 命令输出通过管道传输到文件。

    kubectl apply --filename= 步骤中引用该文件

    示例

    options:
      volumes:
        - name: test
          path: /test
    steps:
      - name: busybox
        args:
          - "ls"
          - "-l"
          - "/test"
      - name: busybox
        entrypoint: "/bin/sh"
        args:
          - "-c"
          - "touch /test/freddie"
      - name: busybox
        args:
          - "ls"
          - "-l"
          - "/test"
      - name: busybox
        args:
          - "cp"
          - "/test/freddie"
          - "/workspace"
      - name: busybox
        args:
          - "ls"
          - "-l"
          - "/workspace"
    

    使用options 定义volumes 将音量应用于所有步骤;您也可以在每个步骤中简单地重复volumes

    这个例子——希望——展示了如何使用默认的/workspace 和用户定义的/test 卷在卷中创建一个文件(并将这个文件复制到默认的/workspace 卷到证明它是添加的。

    输出:

    BUILD
    Starting Step #0
    Step #0: Already have image: busybox
    Step #0: total 0
    Finished Step #0
    Starting Step #1
    Step #1: Already have image: busybox
    Finished Step #1
    Starting Step #2
    Step #2: Already have image: busybox
    Step #2: total 0
    Step #2: -rw-r--r--    1 root     root             0 Feb  4 17:53 freddie
    Finished Step #2
    Starting Step #3
    Step #3: Already have image: busybox
    Finished Step #3
    Starting Step #4
    Step #4: Already have image: busybox
    Step #4: total 4
    Step #4: -rw-r--r--    1 1000     1000           460 Feb  4 17:53 cloudbuild.yaml
    Step #4: -rw-r--r--    1 root     root             0 Feb  4 17:53 freddie
    Finished Step #4
    PUSH
    DONE
    

    【讨论】:

    • 我已经尝试过了,但我得到了一个错误(见更新的问题)。但这可能是因为我不知道如何在 cloudbuild 文件中挂载目录
    • here。您可以参考(或定义您自己的)默认挂载 (/workspace)。然后你可以&gt; /workspace/kubernetes.yaml["apply","--filename","/workspace/kubernetes.yaml"]。请告诉我进展如何。
    • 这似乎是要走的路......但我总是收到我的路径不存在的错误。有没有办法查看卷目录?
    【解决方案3】:

    正如每个人在这里已经建议的那样,使用volumes

    像这样调整你的 cloudbuild.yaml 文件:

    - name: gcr.io/cloud-builders/bazel
      entrypoint: /bin/bash
      args:
        [
          "bazel",
          "run",
          "//:kubernetes",
          " > /workspace/kubernetes.yaml",
        ]
    
    - name: "gcr.io/cloud-builders/kubectl"
      args: ["apply", "-f", "/workspace/kubernetes.yaml"]
      env:
        - "CLOUDSDK_COMPUTE_ZONE=europe-west3-a"
        - "CLOUDSDK_CONTAINER_CLUSTER=cents-ideas"
    

    【讨论】:

    • /workspace 是所有容器共享的默认卷,方便您使用。您不需要显式安装它。您可以按照提供的文档附加自定义卷。
    • 不幸的是:error: the path "/workspace/kubernetes.yaml" does not exist
    • 我自己使用this example 对其进行了测试,无论是自定义音量还是/workspace 默认音量都可以正常工作。所以错误源于步骤 1,在bazel run 期间。您能否通过仅使用args: ["run", "//:kubernetes"] 运行来检查它是否在构建期间向/stdout 实际输出任何内容。如果它不输出任何内容,则不会创建 kubernetes.yaml 并导致下一步出错。此外,第一步不需要“bazel”参数。默认情况下它在那里。
    • 哦,忘记入口点了,请忽略我之前评论中的最后一句话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2020-06-05
    • 2022-01-02
    • 1970-01-01
    • 2021-03-10
    • 2021-02-10
    相关资源
    最近更新 更多