【问题标题】:How to get a list of docker images given some kubernetes template?给定一些 kubernetes 模板,如何获取 docker 镜像列表?
【发布时间】:2021-01-10 11:33:45
【问题描述】:

为简化起见,我想列出一个 helm 图表中定义的所有 docker 图像。

例如,假设我有以下一组模板:

$ helm template jenkins/jenkins

https://charts.jenkins.io/

然后,我想以某种方式使用kubectl 来解析此结果,以便我可以应用过滤器,例如:

kubectl get pods -l k8s-app=kube-dns -o jsonpath={.items[*].spec.containers[*].name}

把清单还给我。但是,该命令是获取 pod。有什么线索吗?

编辑:我找到了一种方法:

❯ helm template jenkins/jenkins | kubectl apply -f - --dry-run=client -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | sort | uniq
bats/bats:1.2.1
jenkins/jenkins:2.263.1
kiwigrid/k8s-sidecar:0.1.275

有一个缺点:kubectl 需要连接到集群。我想防止这种情况发生。

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    您可以使用不同的 jsonpath 来获取所有图像:

    kubectl get pods -A -o jsonpath="{..image}"

    如果您只想要独特的图片:kubectl get pods -A -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | sort -u

    -A 替换为图表或清单的命名空间。

    如果你的机器上有清单但没有部署,当然,你可以直接grep:grep 'image: ' *.yml

    你也可以使用 Go 模板语法:

    kubectl get pods -A -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}} {{end}}{{end}}"

    如果您在给定的命名空间中有多个图表,我认为 grepping 将是最好的方法:helm template some-chart | grep 'image:'

    编辑:

    由于这将在 CI 中运行,因此最好使用一点代码来避免潜在的误报。这个 Python 脚本可以解决问题:

    #!/usr/bin/env python3
    import sys
    import yaml  # pip install PyYAML
    from nested_lookup import nested_lookup  # pip install nested-lookup
    
    template = ""
    
    for line in sys.stdin:
        template += line
    
    parts = template.split('---')
    for p in parts:
        y = yaml.safe_load(p)
        matches = nested_lookup("image", y)
        if (len(matches)):
            print("\n".join(matches))
    

    用法:helm template jenkins/jenkins | ./this-script.py。它会打印出每次出现的图像,因此如果您只想要唯一的图像,您需要将所有 matches 放入一个列表中,然后在打印之前将其唯一(或将其通过管道传输到 sort -u)。

    【讨论】:

    • 其实所有的chart都没有安装,我也不想安装。或者,我不想连接到集群。考虑到我的要求,您的最后一个选项对我来说似乎非常可行。
    • 我找到了另一种方式,需要一个集群(我编辑了我的问题,请看一下)。您是否相信您的方法(模板 + grep)将始终作为我的解决方案工作?我这么说是因为我想在 CI 中运行它,所以如果你的方法运行良好,这将阻止我之前必须执行昂贵的 kind create cluster
    • 不,grep 方式并不能保证总是好的,因为模板中的某处可能存在带有单词image: 的字符串或注释。一些代码可能会有所帮助,请查看我更新的答案。
    • 哇,太棒了。非常感谢!
    猜你喜欢
    • 2017-08-26
    • 1970-01-01
    • 2016-08-03
    • 2018-08-09
    • 2018-02-14
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多