我有一个容器在pod中运行,我希望能够每周监控它的内容。我想为它写一个Kube cronjob。有最好的方法吗?
目前,我正在本地机器中运行一个脚本来执行kubectl exec my-container
并监视该容器中目录的内容。
kubectl exec my-container
对我来说非常好。如果你想在pod(Kubernetes CronJob(中运行kubectl
,你可能需要看看这个。
还有其他方法,但从长远来看,这可能有些过头了。例如:
-
您可以设置Fluentd或tail/grep sidecar(或者
ls
,如果您使用的是二进制文件?(,将该文件的内容或部分内容发送到Elasticsearch集群。 -
您可以在Kubernetes中设置Prometheus,以获取pod安装的文件系统的指标。您可能需要在pod中使用自定义导出器,或者使用其他方法来导出pod中装入点中的文件。这是一个类似的例子。
您可以在pod的另一个sidecar中运行脚本。
- 定义一个空目录
volume
- 将此
volume
装载为您的内容目录 - 还要将这个目录装载到sidecar,这样它就可以访问并能够进行监视
示例:
apiVersion: v1
kind: Pod
metadata:
name: monitor-by-sidecar
spec:
restartPolicy: Never
volumes: # empty directory volume
- name: shared-data
emptyDir: {}
containers:
- name: container-which-produce-content # This container is main application which generate contect. Suppose in /usr/share/nginx/html directory
image: debian
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
command: ["/bin/bash", "-c"]
args:
- while true;
do
echo "hello world";
echo "----------------" > /usr/share/nginx/html/index.html;
cat /usr/share/nginx/html/index.html;
done
- name: container-which-run-script-to-monitor # this container will run your monitor scripts. this container mount main application's volume in /pod-data directory and run required scripts.
image: debian
volumeMounts:
- name: shared-data
mountPath: /pod-data
command: ["/bin/sh", "-c"]
args:
- while true;
do
echo "hello";
sleep 10;
ls -la /pod-data/;
cat /pod-data/index.html;
done
示例说明
- 第一个容器(名为容器,用于生成内容(是主要应用程序,它在
/usr/share/nginx/html
中装载emptyDir
卷。在此目录中,主应用程序将生成数据 - 第二个容器(名为的容器,运行脚本来监视(将在
/pod-data
目录中装载相同的emptyDir
卷(名为共享数据,也由/usr/share/nginx/html
目录中的主应用程序装载(。该/pod-data
包含主应用程序在/usr/share/nginx/html
目录中生成的全部数据。然后,您可以在此目录上运行脚本