Определить контейнер по умолчанию при использовании контейнера sidecar

Определить контейнер по умолчанию при использовании контейнера sidecar

Я использую keycloak gatekeeper в качестве вспомогательного контейнера для нескольких модулей в моем кластере, чтобы включить SSO для этих служб.

Но когда я пытаюсь выполнить exec, просмотреть логи и т. д.; он спрашивает, какой контейнер я хочу использовать, вместо того, чтобы просто войти в него. Есть ли способ определить контейнер по умолчанию, который он будет использовать для чего-то, например, kubectl exec -it PODNAMEкогда я не передаю флаг -c?

решение1

То, о чем вы спрашиваете, в настоящее время работает, но очень ограниченно. Согласнодокументация по kubectl execвы можете пропустить -cфлаг:

-c, --container="": Имя контейнера. Если не указано, будет выбран первый контейнер в поде.

но вы также должны указать какое-либо действие/команду, например date, bashили sh.

Получите вывод от запуска 'date' из модуля 123456-7890, используя первый контейнер по умолчанию kubectl exec 123456-7890 date

Я упоминаю, что это очень ограничено, так как это будет использоватьпервый контейнериз списка, который был указан в манифесте YAML. Если вы будете использовать -cфлаг, вы можете указать, какой из них вы хотите execute.

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

Выход

Без использования какой-либо команды:

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

При использовании команды dateбудет использован первый контейнер из YAML/описания модуля.

$ 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

Dateкоманда с указанным модулем

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

Аннотация Kubectl exec — контейнер по умолчанию

В одном изУлучшения Githubвы можете найти информацию о том, что планируется внедрить эту функцию в стабильной версии Kubernetes (1.23).

Это будет выглядеть так:

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

Аннотации журналов Kubectl — контейнер по умолчанию

Подобная функция, но относительно logsне execбыла введена в kubectl 1.18. Она была упомянута вТред на Github. Чтобы добиться этого, вам нужно добавить новую аннотацию.kubectl.kubernetes.io/default-logs-container=<containerName>

Сценарий моего test-podстручка с busyboxиhttpd

$ 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'

Связанный контент