在 Kubernetes Pod 中安装 Curl 到 BusyBox 是否可行?

30

我正在使用Busybox来检测Kubernetes v1.18 Pods中的网络问题。我创建了以下Busybox:

apiVersion: v1
kind: Pod
metadata:
    name: busybox
    namespace: default
spec:
    containers:
    - name: busybox
    image: busybox:1.28
    command:
        - sleep
        - "3600"
    imagePullPolicy: IfNotPresent
    restartPolicy: Always

并登录以查找Kubernetes集群的网络状况:

Translated text:

并登录以查找Kubernetes集群的网络状况:

 kubectl exec -it busybox /bin/bash

令我惊讶的是busybox不包含curl命令。为什么busybox软件包不包含curl命令?我正在搜索互联网并发现文档没有介绍如何将curl添加到busybox中。我尝试安装curl,但无法找到方法。是否有任何方式将curl软件包添加到busybox中?

8个回答

39

简短的回答是,你无法这样做。

为什么?

因为Busybox没有像yum、apk或apt-get这样的包管理器。

实际上你有两个解决方案:

1. 使用修改过的Busybox

你可以使用其他的Busybox镜像,例如progrium/busybox,它提供了opkg-install作为包管理器。

image: progrium/busybox

接着:

kubectl exec -it busybox -- opkg-install curl

2. 如果您担心使用过多的镜像,您可以使用Alpine

image: alpine:3.12

那么:

kubectl exec -it alpine -- apk --update add curl

17

不。相反,考虑使用 alpine 作为基础镜像,它包含了BusyBox和一个包管理器,或者构建(或查找)一个预先安装所需工具的自定义镜像。

BusyBox 是一个单一二进制文件,其中包含许多常见 Linux 工具的实现。 BusyBox 文档 包括所包含命令的列表。你不能将更多命令“安装”到其中而不编写 C 代码。

BusyBox 包含 wget 的实现,这可能适用于您的目的(wget -O- http://other-service)。


6

BusyBox有wget的子集。相比于附带Busybox的curl,你的操作系统中curl的使用模式更加复杂。

为了澄清我的意思,请在你的操作系统中运行以下命令:

$ wget --help | wc -l
207

在 Busybox 容器内运行 wget 的帮助命令应该会为您提供一个最小的子集包。
$ docker run --rm busybox wget --help 2>&1 | wc -l
20

在K8s中,您可以运行以下命令:
$ kubectl run -i --tty --rm busybox --image=busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # wget
BusyBox v1.33.1 (2021-06-07 17:33:50 UTC) multi-call binary.

Usage: wget [-cqS] [--spider] [-O FILE] [-o LOGFILE] [--header 'HEADER: VALUE'] [-Y on/off]
    [--no-check-certificate] [-P DIR] [-U AGENT] [-T SEC] URL...

Retrieve files via HTTP or FTP

    --spider    Only check URL existence: $? is 0 if exists
    --no-check-certificate  Don't validate the server's certificate
    -c      Continue retrieval of aborted transfer
    -q      Quiet
    -P DIR      Save to DIR (default .)
    -S          Show server response
    -T SEC      Network read timeout is SEC seconds
    -O FILE     Save to FILE ('-' for stdout)
    -o LOGFILE  Log messages to FILE
    -U STR      Use STR for User-Agent header
    -Y on/off   

如果您的使用情况需要使用curl,我建议使用Alpine。Alpine是busybox加上一个最小的包管理器和libc实现,因此您可以轻松地执行“apk add --no-cache curl”来获取真正的curl(甚至可以执行“apk add --no-cache wget”来获取真正的wget而不是BusyBox的wget)。

6
如其他人所说,答案是否定的,您需要使用另一张镜像。
以下是可用的镜像:
- 官方curl alpine基础映像:https://hub.docker.com/r/curlimages/curl,使用curlimages/curl - Busyboxplus映像:https://hub.docker.com/r/radial/busyboxplus,使用radial/busyboxplus:curl - Nixery,使用nixery.dev/curl 镜像大小:
$ docker images -f "reference=*/*curl"
REPOSITORY           TAG       IMAGE ID       CREATED       SIZE
curlimages/curl      latest    ab35d809acc4   9 days ago    11MB
radial/busyboxplus   curl      71fa7369f437   8 years ago   4.23MB
nixery.dev/curl      latest    aa552b5bd167   N/A           56MB

radial/busyboxplus:curl已经非常古老,但至今仍然能够使用。 - Pithikos

4

从源网站安装curl二进制文件

binary-url替换为从curl.se找到的二进制文件的URL。

export BINARY_URL="<binary-url>"
wget $BINARY_URL -O curl && install curl /bin; rm -f curl

使用 busybox:latest 镜像进行编程工作


3

正如 @abdennour 所建议的那样,我不再坚持使用 busybox。 Alpine 是一个非常轻量级的 Linux 容器镜像,正如其他人在这里建议的一样,你可以安装任何UNIX工具来完成你的故障排除任务。事实上,我在我的 dotfiles 中使用这个函数在 .bashrc 中旋转一个方便的短暂准备好的 Alpine pod:

## This function takes an optional argument to run a pod within a Kubernetes NS, if it's not provided it fallsback to `default` NS.
function kalpinepod () { kubectl run -it --rm --restart=Never --image=alpine handytools -n ${1:-default} -- /bin/ash }

❯ kalpinepod kube-system
If you don't see a command prompt, try pressing enter.
/ # cat /etc/resolv.conf
search kube-system.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.245.0.10
options ndots:5
/ # apk --update add curl openssl
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
(1/6) Installing ca-certificates (20191127-r5)
(2/6) Installing brotli-libs (1.0.9-r3)
(3/6) Installing nghttp2-libs (1.42.0-r1)
(4/6) Installing libcurl (7.74.0-r1)
(5/6) Installing curl (7.74.0-r1)
(6/6) Installing openssl (1.1.1j-r0)
Executing busybox-1.32.1-r3.trigger
Executing ca-certificates-20191127-r5.trigger
OK: 9 MiB in 20 packages

3

1
Radial使用busybox images的覆盖层添加了cURL。 docker pull radial/busyboxplus:curl 他们还有第二个镜像,其中包含cURL + Git。 docker pull radial/busyboxplus:git

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接