已关闭此问题为not about programming or software development。它目前不接受回答。
这个问题似乎不是关于a specific programming problem, a software algorithm, or software tools primarily used by programmers的。如果你认为这个问题与another Stack Exchange site的主题有关,你可以留下评论,解释在哪里可以回答这个问题。
12天前关闭
Improve this question
我正在Udemy上Kubernetes初级课程。
我正在尝试(作为一项教育任务)仅使用命令/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 describe 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方法,最好(我已经成功地做到了这两点):
1.使用预加载的软件包创建新映像;或
- exec到容器中并手动安装它们。
所以请不要提出这些或其他建议。
我尝试在命令/args部分安装pkgs作为练习,以更好地理解如何使用命令。因此,我想知道while循环语法有什么问题。
此外,第三个选项位于thread中,但我不知道如何将xmlmap连接到pod,并且上述线程没有帮助。然而,我仍然倾向于仅仅使用command/args来找出解决方案。
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
1条答案
按热度按时间zxlwwiss1#
我正在尝试(作为一项教育任务)仅使用命令/args元素在容器上安装任何任意软件包。
我认为这是一个反模式:如果您需要特定的服务包,您应该构建适当的映像并将其推送到注册中心,然后使用自定义映像创建部署。
您的
args
配置中有错误。请记住,sh -c
命令只接受一个参数--要执行的脚本。当你写这句话的时候:你在写:
试着在命令行运行它,你会看到它运行
pk update
命令.并忽略其他所有东西。一般来说,如果你想在Pod启动时运行shell脚本,你可以这样做:它使用YAML块文字引号(
|
)将包含的脚本(保留换行符)作为参数传递给sh -c
。此外,第三个选项位于线程中,但我无法弄清楚如何连接到pod的replemap.
这在文档中有明确的说明。
关于
command
与args
:参数作为参数传递给命令。大多数容器镜像都有一个默认的命令来接收你的args,但是在这种情况下,我们不关心镜像在默认情况下做什么;我们要运行一个shell脚本。我们可以无视命令。
考虑到这一点,我们可以像这样重写上面的清单: