另外,容器的特点之一,就是希望它是无状态的,我们可能随时会重新创建一个容器,如果日志只是简单地存在容器里,那么每次重建容器,日志内容也就丢失了。这里你可能会想到,用 docker volume 不就解决问题了么。
事实上,kolla 做的更好。它用了更专业日志收集工具 Fluentd 来汇总所有服务产生的日志。具体的技术细节我们以后有空再深入研究。
现在我们只需要知道,所有的日志文件在容器外面就可以查看,它们集中存放在 /var/log/kolla/ 目录中。
这里虚机创建失败的问题,我们可以查看 nova-compute 日志:
vi /var/log/kolla/nova/nova-compute.log从错误提示可以看到,是因为 kvm 的问题,我们使用的是虚拟机,所以没法支持这个特性,必须修改一下,使用纯软件的(即 qemu)虚拟化。
在虚拟机中创建虚机还可以通过开启 KVM 嵌套虚拟化的特性来实现,但是 VirtualBox 貌似不支持。
修改配置(错误的方式)配置文件在容器中的位置和我们平常环境中的并无不同:
[root@control01 ~]# docker exec -it nova_compute bash (nova-compute)[nova@control01 /]$ cd /etc/nova/ (nova-compute)[nova@control01 /etc/nova]$ ls api-paste.ini nova.conf policy.json release rootwrap.conf我们先按照常规方法修改,将下面的 kvm 修改为 qemu 后保存退出:
(nova-compute)[nova@control01 /]$ cd /etc/nova/ (nova-compute)[nova@control01 /etc/nova]$ vi nova.conf [libvirt] connection_uri = qemu+tcp://10.10.10.1/system virt_type = kvm改完配置之后的问题是,如何重启服务让修改生效呢?
重启服务如果你对 docker 比较熟悉的话,应该知道容器里面是没有 systemd 的,服务都是在前台运行。所以不能用下面的命令:
$ sudo systemctl restart openstack-nova-compute那怎么去重启服务呢?
其实非常简单,直接重启容器就可以了!
$ sudo docker restart nova_compute不过,重启完容器之后,如果你细心点再去看一看,会发现刚才的修改消失了!
如果配置有问题,容器启动可能会失败,可以刷几次 docker ps 命令确保容器的状态成功。
修改配置(正确的姿势)如果是对 docker 有所理解的话,其实上面直接在容器内修改配置的时候就应该有疑义。如果配置信息仅仅是保存在容器内的话,那容器重建怎么办?
所以这里的问题和日志文件是类似的,我们首先想到的肯定还是 docker volume 来实现。不过现在的现象显然也不太对劲:如果配置文件是存储在 volume 中,修改为什么会在容器重启后失效呢?
实际上,kolla 确实使用 volume 挂载了配置文件,但是并没有直接挂载到对应的位置,其中又添加了一次处理,我们先来看宿主机上配置文件所在的位置:
[root@control01 ~]# cd /etc/kolla/nova-compute [root@control01 nova-compute]# ls config.json nova.conf注意到其中的 config.json 在容器里面是看不到的,而 nova.conf 和容器内的是一致的。
kolla 的大致处理流程是这样的:
把这个目录挂载到容器的 /var/lib/kolla/config_files 目录
在容器的启动脚本中加了处理配置的脚本:kolla_set_configs
kolla_set_configs 根据 /var/lib/kolla/config_files/config.json 中的配置来处理配置文件
现在看一下 config.json 中的内容,是不是很好理解了:
{ "command": "nova-compute", "config_files": [ { "source": "/var/lib/kolla/config_files/nova.conf", "dest": "/etc/nova/nova.conf", "owner": "nova", "perm": "0600" } ], }在宿主机下更改 /etc/kolla/nova-compute/nova.conf,并再次重启容器,再次创建虚机。这次应该没有问题了。
总结查服务:
docker ps -a查日志:
cd /var/log/kolla改配置:
cd /etc/kolla/<service_name>重启服务:
docker restart <container_name>只需要记住这几个常用的操作命令就可以了,相较于之前需要记忆每个服务不同的名字,是不是方便了很多呢?
更详细的操作过程可以去 B站看视频