Estou fazendo o curso de Kubernetes para iniciantes na Udemy.
Estou tentando (como uma tarefa educacional) instalar qualquer pacote arbitrário em um contêiner usando apenas elementos de comando/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
Mas o pod não está executando o loop while, embora esteja executando os comandos apk (conforme comprovado pelos logs):
$ 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
A falha que estou vendo (do pod kc description):
Warning BackOff 2s (x3 over 21s) kubelet Back-off restarting failed container curl-nginx in pod curl-nginx_dev(613a7fa7-952a-4d2a-b226-df87aa866f06)
E não sei por que o k8s não está executando o loop while.
Observe que eu sei que este (o acima) não é o método PROD recomendado e é melhor fazê-lo (e já fiz os dois com sucesso):
- crie uma nova imagem com pacotes pré-carregados; OU
- exec no contêiner e instale-os manualmente.
Então, por favor, não faça nenhuma dessas ou outras sugestões.
Estou tentando instalar os pacotes na seção command/args como um exercício para entender melhor como os comandos são usados. Portanto, quero aprender o que há de errado com minha sintaxe de loop while.
Além disso, uma terceira opção foi colocada no thread , mas NÃO consigo descobrir como conectar o configmap ao pod e o thread mencionado acima não é útil. No entanto, ainda estou inclinado a descobrir a solução baseada apenas no uso de comandos/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
Eu diria que isso é um antipadrão: se você precisar de pacotes específicos para o seu serviço, você deve criar imagens apropriadas e enviá-las para um registro e, em seguida, criar implantações usando suas imagens personalizadas.
Você tem erros em sua
args
configuração. Lembre-se de que osh -c
comando leva um único argumento – o script a ser executado. Quando você escreve isso:Tu estás a escrever:
Tente executar isso na linha de comando e você verá que ele executa o
pk update
comando... e ignora todo o resto. Geralmente, se quiser executar um script de shell quando o pod for iniciado, você faria algo assim:Isso usa a citação literal do bloco YAML (
|
) para passar o script incluído - preservando novas linhas - como argumento parash -c
.Isso é abordado explicitamente na documentação .
Em relação
command
a vsargs
:Os argumentos são passados como argumentos para o comando. A maioria das imagens de contêiner possui um comando padrão que receberá seus argumentos, mas neste caso não nos importamos com o que a imagem faz por padrão; queremos executar um script de shell. Podemos simplesmente substituir o comando.
Com isso em mente, poderíamos reescrever o manifesto acima assim: