Definieren Sie den Standardcontainer, wenn Sie einen Sidecar-Container verwenden

Definieren Sie den Standardcontainer, wenn Sie einen Sidecar-Container verwenden

Ich verwende Keycloak Gatekeeper als Sidecar-Container für mehrere Pods in meinem Cluster, um SSO für diese Dienste zu aktivieren.

Aber wenn ich versuche, etwas auszuführen, Protokolle anzuzeigen usw., werde ich gefragt, welchen Container ich verwenden möchte, anstatt ihn einfach aufzurufen. Gibt es eine Möglichkeit, den Standardcontainer zu definieren, der beispielsweise verwendet wird, kubectl exec -it PODNAMEwenn ich das Flag nicht übergebe -c?

Antwort1

Was Sie verlangen, funktioniert derzeit, aber es ist sehr begrenzt. Lautkubectl exec-DokumentationSie können die Flagge verpassen -c:

-c, --container="": Containername. Wenn dieser weggelassen wird, wird der erste Container im Pod ausgewählt

Sie müssen aber auch eine Aktion/einen Befehl wie date, bashoder angeben sh.

Holen Sie sich die Ausgabe vom Ausführen von „date“ von Pod 123456-7890, wobei standardmäßig der erste Container verwendet wird: kubectl exec 123456-7890 date

Ich erwähne, dass es sehr begrenzt ist, da dieserster Containeraus der Liste, die im YAML-Manifest angegeben wurde. Wenn Sie ein Flag verwenden, -ckönnen Sie angeben, welches Sie möchten execute.

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

Ausgabe

Ohne einen Befehl zu verwenden:

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

Durch die Verwendung des Befehls datewird der erste Container aus YAML/Beschreibung des Pods verwendet.

$ 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

DateBefehl mit angegebenem Pod

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

Kubectl-Exec-Annotation – Standardcontainer

In einem derGithub-ErweiterungenSie finden Informationen, dass geplant ist, diese Funktion in der stabilen Kubernetes-Version (1.23) einzuführen.

Es würde so aussehen:

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

Kubectl-Protokollanmerkungen – Standardcontainer

Ähnliche Funktion, aber logsnicht in Bezug auf execwurde eingeführt in kubectl 1.18. Es wurde erwähnt inGithub-Thread. Um das zu erreichen, müssen Sie eine neue Annotation hinzufügenkubectl.kubernetes.io/default-logs-container=<containerName>

Szenario meine test-podKapsel mit busyboxundhttpd

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

verwandte Informationen