是否可以将 curl 安装到 kubernetes pod 中的 busybox
Is it possible to install curl into busybox in kubernetes pod
我正在使用 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集群网络情况:
kubectl exec -it busybox /bin/bash
让我吃惊的是busybox不包含curl。为什么 busybox 包不包含 curl 命令?我在网上搜索,发现文档没有讨论如何将 curl 添加到 busybox 中。我尝试安装 curl,但发现无法执行此操作。无论如何要将 curl 包添加到 busybox 中?
没有。将 alpine
视为包含 BusyBox 和包管理器的基础映像,或者构建(或查找)预装了您需要的工具的自定义映像。
BusyBox 构建为单个二进制文件,其中包含许多常见 Linux 工具的实现。 BusyBox documentation 包含包含命令的列表。你不能在不编写 C 代码的情况下向其中“安装”更多命令。
BusyBox 确实包含 wget
的实现,它可能适合您的目的 (wget -O- http://other-service
)。
简而言之,你不能。
为什么?
因为 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
正如@abdennour 所建议的,我不再坚持使用 busybox
。正如其他人在此处建议的那样,Alpine 是一个非常轻量级的 Linux 容器映像,您可以在其中轻松安装任何类似 UNIX 的工具来完成故障排除任务。事实上,我在 .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
BusyBox 有 wget
的子集。在您的 OS 中,curl 的使用模式比 Busybox 自带的要复杂得多。
为了阐明我的意思,运行 在您的 OS 中添加以下内容:
$ wget --help | wc -l
207
虽然 运行ning wget 在 Busybox 容器内的帮助应该给你一个最小的子集包:
$ 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
,它是 busybox
+ 最小包管理器和 libc
实现,这样您可以简单地做 apk add --no-cache curl
并获得真正的 curl
(甚至 apk add --no-cache wget
以获得“真正的”wget 而不是 BusyBox 的 wget
)。
Radial 叠加了 busybox images 添加 cURL。 docker pull radial/busyboxplus:curl
他们还有第二张带有 cURL + Git 的图像。 docker pull radial/busyboxplus:git
或者只是将静态构建的 curl 复制到 Busybox 中:
https://github.com/moparisthebest/static-curl/releases
我正在使用 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集群网络情况:
kubectl exec -it busybox /bin/bash
让我吃惊的是busybox不包含curl。为什么 busybox 包不包含 curl 命令?我在网上搜索,发现文档没有讨论如何将 curl 添加到 busybox 中。我尝试安装 curl,但发现无法执行此操作。无论如何要将 curl 包添加到 busybox 中?
没有。将 alpine
视为包含 BusyBox 和包管理器的基础映像,或者构建(或查找)预装了您需要的工具的自定义映像。
BusyBox 构建为单个二进制文件,其中包含许多常见 Linux 工具的实现。 BusyBox documentation 包含包含命令的列表。你不能在不编写 C 代码的情况下向其中“安装”更多命令。
BusyBox 确实包含 wget
的实现,它可能适合您的目的 (wget -O- http://other-service
)。
简而言之,你不能。
为什么?
因为 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
正如@abdennour 所建议的,我不再坚持使用 busybox
。正如其他人在此处建议的那样,Alpine 是一个非常轻量级的 Linux 容器映像,您可以在其中轻松安装任何类似 UNIX 的工具来完成故障排除任务。事实上,我在 .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
BusyBox 有 wget
的子集。在您的 OS 中,curl 的使用模式比 Busybox 自带的要复杂得多。
为了阐明我的意思,运行 在您的 OS 中添加以下内容:
$ wget --help | wc -l
207
虽然 运行ning wget 在 Busybox 容器内的帮助应该给你一个最小的子集包:
$ 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
,它是 busybox
+ 最小包管理器和 libc
实现,这样您可以简单地做 apk add --no-cache curl
并获得真正的 curl
(甚至 apk add --no-cache wget
以获得“真正的”wget 而不是 BusyBox 的 wget
)。
Radial 叠加了 busybox images 添加 cURL。 docker pull radial/busyboxplus:curl
他们还有第二张带有 cURL + Git 的图像。 docker pull radial/busyboxplus:git
或者只是将静态构建的 curl 复制到 Busybox 中: https://github.com/moparisthebest/static-curl/releases