If your pod contains multiple containers, running kubectl logs
command will result in an error asking you to select one container as follows:
$ kubectl logs nginx
error: a container name must be specified for pod nginx, choose one of: [app sidecar]
Use the --container
(-c
) flag to specify the target container with kubectl logs
command.
$ kubectl logs nginx --container app
However, in the case of the main container and a sidecar container configuration, the logs you probably want to see in most cases are the main container’s. It is troublesome to have to specify the main container every time.
Since kubectl v1.18, you can use the kubectl.kubernetes.io/default-logs-container
annotation to specify the default container for logs.
For example, the following Pod manifest contains two containers, app
and sidecar
.
apiVersion: v1
kind: Pod
metadata:
name: nginx
annotations:
kubectl.kubernetes.io/default-logs-container: app
spec:
containers:
- name: app
image: nginx
- name: sidecar
image: busybox
command:
- sh
- -c
- 'while true; do echo $(date); sleep 1; done'
In this manifest, app
container is specified in kubectl.kubernetes.io/default-logs-container
annotation, so if you run the kubectl logs
command without specifying a container as follows, the app
container is selected.
$ kubectl logs nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up