Pod に複数のコンテナが含まれる場合に、kubectl logs
コマンドを実行すると次のように1つのコンテナを選択するようにとエラーになります。
$ kubectl logs nginx
error: a container name must be specified for pod nginx, choose one of: [app sidecar]
kubectl logs
コマンドで対象のコンテナを指定するには --container
(-c
) フラグを使用します。
$ kubectl logs nginx --container app
しかしながら、メインのコンテナとサイドカーコンテナという構成の場合、おそらく多くの場合で確認したいログは、メインのコンテナのものです。これをいちいち毎回指定しないといけないというのも面倒です。
Kubernetes 1.18 の kubectl から、kubectl.kubernetes.io/default-logs-container
annotation で kubectl logs
コマンドでログ出力するデフォルトのコンテナを指定できるようになりました。
例えば次の Pod マニフェストでは、app
と sidecar
の2つのコンテナが含まれています。
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'
kubectl.kubernetes.io/default-logs-container
annotation で app
が指定されているため、次のようにコンテナの指定なしに kubectl logs
コマンドを実行すると app
コンテナが選択されます。
$ 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