Definir el contenedor predeterminado al usar el contenedor sidecar

Definir el contenedor predeterminado al usar el contenedor sidecar

Utilizo keycloak gatekeeper como contenedor complementario para varios pods en mi clúster para habilitar el SSO para esos servicios.

Pero cuando intento ejecutar, ver registros, etc. me pregunta qué contenedor quiero usar en lugar de simplemente entrar en él. ¿Hay alguna manera de definir el contenedor predeterminado que usará para algo como kubectl exec -it PODNAMEcuando no paso la -cbandera?

Respuesta1

Lo que estás pidiendo actualmente funciona pero es muy limitado. De acuerdo adocumentación ejecutiva de kubectlte puedes perder -cla bandera:

-c, --container="": Nombre del contenedor. Si se omite, se elegirá el primer contenedor del grupo.

pero también debe especificar alguna acción/comando datecomo basho sh.

Obtenga resultados al ejecutar 'fecha' desde el pod 123456-7890, utilizando el primer contenedor de forma predeterminada kubectl exec 123456-7890 fecha

Menciono que es muy limitado, ya que esto usaráprimer contenedorde la lista que se especificó en el manifiesto YAML. Si va a utilizar -cla bandera, puede especificar cuál desea execute.

spec:
  containers:
  - image: httpd
    name: httpd
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox

Producción

Sin usar ningún comando:

$ kubectl exec -ti test-pod
error: you must specify at least one command for the container

Al usar el comando date, usará el primer contenedor de YAML/descripción del pod.

$ kubectl exec -ti test-pod -- date
Defaulting container name to httpd.
Use 'kubectl describe pod/test-pod -n default' to see all of the containers in this pod.
Mon Jan  4 14:06:27 UTC 2021

Datecomando con pod especificado

$ kubectl exec -ti test-pod -c busybox -- date
Mon Jan  4 14:06:36 UTC 2021

Anotación ejecutiva de Kubectl: contenedor predeterminado

En uno de losMejoras de GithubPuede encontrar información de que existe un plan para introducir esta función en la versión estable de Kubernetes (1.23).

Se vería así:

kubectl annotate pod test-pod kubectl.kubernetes.io/default-exec-container=<conatinerName>

Anotación de registros de Kubectl: contenedor predeterminado

Una característica similar pero logsno execse introdujo en kubectl 1.18. Fue mencionado enHilo de Github. Para lograr eso tienes que agregar una nueva anotación.kubectl.kubernetes.io/default-logs-container=<containerName>

Escenario mi test-podpod con busyboxyhttpd

$ kubectl logs test-pod
error: a container name must be specified for pod test-pod, choose one of: [busybox httpd]

$ kubectl annotate pod test-pod kubectl.kubernetes.io/default-logs-container=httpd
pod/test-pod annotated

$ kubectl logs test-pod
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.4.1.12. Set the 'ServerName' directive globally to suppress this message
[Mon Jan 04 14:05:08.191117 2021] [mpm_event:notice] [pid 1:tid 140379730310272] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations
[Mon Jan 04 14:05:08.191428 2021] [core:notice] [pid 1:tid 140379730310272] AH00094: Command line: 'httpd -D FOREGROUND'

$ kubectl logs test-pod -c httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.4.1.12. Set the 'ServerName' directive globally to suppress this message
[Mon Jan 04 14:05:08.191117 2021] [mpm_event:notice] [pid 1:tid 140379730310272] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations
[Mon Jan 04 14:05:08.191428 2021] [core:notice] [pid 1:tid 140379730310272] AH00094: Command line: 'httpd -D FOREGROUND'

información relacionada