Kubernetes:如何在容器创建过程中将包安装到pod的容器中[已关闭]

omhiaaxx  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(107)

已关闭此问题为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.使用预加载的软件包创建新映像;或

  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
zxlwwiss

zxlwwiss1#

我正在尝试(作为一项教育任务)仅使用命令/args元素在容器上安装任何任意软件包。
我认为这是一个反模式:如果您需要特定的服务包,您应该构建适当的映像并将其推送到注册中心,然后使用自定义映像创建部署。
您的args配置中有错误。请记住,sh -c命令只接受一个参数--要执行的脚本。当你写这句话的时候:

args:
    - /bin/sh
    - -c
    - apk update;
    - apk upgrade;
    - apk add curl;
    - while true; do curl nginx-loadbalancer >> /tmp/curl.txt 2>&1 ; done;

你在写:

sh -c 'apk update;' 'apk upgrade;' 'apk add curl;' '...etc...'

试着在命令行运行它,你会看到它运行pk update命令.并忽略其他所有东西。一般来说,如果你想在Pod启动时运行shell脚本,你可以这样做:

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: curl-nginx
  name: curl-nginx
spec:
  restartPolicy: Always
  containers:
  - image: docker.io/alpine:latest
    name: curl-nginx
    command:
    - /bin/sh
    - -c
    - |
      apk update
      apk upgrade
      apk add curl
      while true; do
        curl nginx-loadbalancer >> /tmp/curl.txt 2>&1
      done

它使用YAML块文字引号(|)将包含的脚本(保留换行符)作为参数传递给sh -c
此外,第三个选项位于线程中,但我无法弄清楚如何连接到pod的replemap.
这在文档中有明确的说明。
关于commandargs
参数作为参数传递给命令。大多数容器镜像都有一个默认的命令来接收你的args,但是在这种情况下,我们不关心镜像在默认情况下做什么;我们要运行一个shell脚本。我们可以无视命令。
考虑到这一点,我们可以像这样重写上面的清单:

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: curl-nginx
  name: curl-nginx
spec:
  restartPolicy: Always
  containers:
  - image: docker.io/alpine:latest
    name: curl-nginx
    command:
    - /bin/sh
    - -c
    args:
      -|
        apk update
        apk upgrade
        apk add curl
        while true; do
          curl nginx-loadbalancer >> /tmp/curl.txt 2>&1
        done

相关问题