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 PODNAME
wenn 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
, bash
oder 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, -c
kö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 date
wird 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
Date
Befehl 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 logs
nicht in Bezug auf exec
wurde 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-pod
Kapsel mit busybox
undhttpd
$ 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'