我正在 Udemy 参加初级 kubernetes 课程。
我正在尝试(作为一项教育任务)仅使用 command/args 元素在容器上安装任何任意包。
apiVersion: v1
kind: Pod
metadata:
labels:
run: curl-nginx
name: curl-nginx
spec:
containers:
- image: alpine
name: curl-nginx
args:
- /bin/sh
- -c
- apk update;
- apk upgrade;
- apk add curl;
- while true; do curl nginx-loadbalancer >> /tmp/curl.txt 2>&1 ; done;
restartPolicy: Always
但是 pod 没有执行 while 循环,即使它正在执行 apk 命令(如日志所证明):
$ kc logs curl-nginx
fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/main/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/community/aarch64/APKINDEX.tar.gz
v3.18.4-8-g72c62a84ddf [https://dl-cdn.alpinelinux.org/alpine/v3.18/main]
v3.18.4-7-g75aa72add9b [https://dl-cdn.alpinelinux.org/alpine/v3.18/community]
OK: 19941 distinct packages available
我看到的失败(来自 kc 描述 pod):
Warning BackOff 2s (x3 over 21s) kubelet Back-off restarting failed container curl-nginx in pod curl-nginx_dev(613a7fa7-952a-4d2a-b226-df87aa866f06)
我不知道为什么 k8s 不执行 while 循环。
请注意,我知道这(上述)不是推荐的 PROD 方法,最好是(而且我已经成功地完成了这两个方法):
- 使用预加载的包创建新映像;或者
- exec 到容器中并手动安装它们。
因此,请不要提出这些或其他建议。
我尝试在 command/args 部分安装 pkgs 作为练习,以更好地了解命令的使用方式。因此,我想了解我的 while 循环语法有什么问题。
此外,第三个选项位于线程中,但我无法弄清楚如何将 configmap 连接到 pod,并且上述线程没有帮助。但是,我仍然倾向于仅基于使用命令/参数来找出解决方案。
apiVersion: v1
kind: ConfigMap
metadata:
name: curl-nginx-cm
data:
entrypoint: |
#!/bin/bash
set -xe
apk update
apk upgrade
apk add curl
---
apiVersion: v1
kind: Pod
metadata:
labels:
run: curl-nginx
name: curl-nginx
spec:
containers:
- image: alpine
name: curl-nginx
args:
- /bin/sh
- -c
- while true; do curl nginx-loadbalancer >> /tmp/curl.txt 2>&1 ; done;
dnsPolicy: ClusterFirst
restartPolicy: Always
我认为这是一种反模式:如果您的服务需要特定的包,您应该构建适当的映像并将其推送到注册表,然后使用自定义映像创建部署。
您的
args
配置有错误。请记住,该sh -c
命令采用单个参数——要执行的脚本。当你写下这个:你正在写:
尝试在命令行运行它,您会看到它运行该
pk update
命令......并忽略其他所有内容。一般来说,如果你想在 Pod 启动时运行 shell 脚本,你可以这样做:这使用 YAML 块文字 quote(
|
) 将包含的脚本(保留换行符)作为参数传递给sh -c
.文档中明确介绍了这一点。
关于
command
vsargs
:args 作为参数传递给命令。大多数容器镜像都有一个默认命令来接收您的参数,但在这种情况下,我们不关心镜像默认执行的操作;我们想要运行一个 shell 脚本。我们可以覆盖命令。
考虑到这一点,我们可以像这样重写上面的清单: