#docker #nginx #kubernetes #persistent-volumes #persistent-volume-claims
#докер #nginx #kubernetes #постоянные тома #постоянные требования к объему
Вопрос:
У меня есть кластер из 3 узлов (1 главный и 2 рабочих узла). У меня есть развертывание, запущенное с изображением pod как nginx на одном из рабочих узлов. Ниже приводится его явное определение:-
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
run: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
run: nginx
spec:
volumes:
- name: logs
emptyDir: {}
containers:
- image: nginx
name: nginx
resources: {}
volumeMounts:
- name: logs
mountPath: /var/log/nginx
Если я отслеживаю журналы nginx, я вижу, что журналы генерируются в местоположении как /var/log/nginx:-
vagrant@mykubemaster:~/my-k8s/sidecar$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-5bb7d5c6dd-hjxnr 1/1 Running 0 8m8s
vagrant@mykubemaster:~/my-k8s/sidecar$ kubectl exec nginx-5bb7d5c6dd-hjxnr -- tail -f /var/log/nginx/access.log
10.32.0.1 - - [06/Jan/2021:02:43:11 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
10.32.0.1 - - [06/Jan/2021:02:43:56 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
10.32.0.1 - - [06/Jan/2021:02:46:11 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
10.32.0.1 - - [06/Jan/2021:02:46:17 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
10.32.0.1 - - [06/Jan/2021:02:48:29 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
Однако проблема в том, что если я подключаюсь по ssh к рабочим узлам (обоим) и даже к главному узлу, я не вижу никакой папки, поскольку nginx создается в /var/log, где хранится этот файл (access.log), который я могу очень хорошо передавать, используя -f и —tail командовать?
Насколько я понимаю, когда мы монтируем том, Pod использует хранилище виртуальной машины, в котором модуль был подготовлен. Если на node02, то в некотором месте, как указано в манифесте на Node02.
Я был бы очень признателен, если бы вы помогли мне разобраться в этом и найти путь к файлу.
Ответ №1:
Вы храните журналы в emptyDir
томе. Это не должно быть постоянным или для доступа извне модуля; у него нет фиксированного местоположения в хост-системе, и содержимое там будет потеряно, как только модуль будет удален.
В конкретном случае image: nginx
образ Docker Hub nginx
по умолчанию настроен на запись своих журналов доступа в стандартный вывод контейнера. Если вы удалите volumes:
и volumeMounts:
, тогда kubectl logs deployment/nginx
вам будут показаны журналы доступа. Затем администратор кластера может развернуть сборщик журналов для пересылки этих журналов куда-либо еще; см., Например, Использование агента регистрации узлов в документации Kubernetes .
Этот же совет применим к большинству других процессов: установите ведение журнала для перехода к стандартным выводам процесса, а не к файлу, и Kubernetes соберет его, и вы можете развернуть средство пересылки для отправки журналов куда-нибудь еще, если вам понадобится просмотреть их позже.
Комментарии:
1. спасибо и действительно оценил это. Теперь мне все ясно 🙂