设为首页 收藏本站
查看: 1324|回复: 0

[经验分享] kolla管理openstack容器

[复制链接]

尚未签到

发表于 2017-12-4 19:07:45 | 显示全部楼层 |阅读模式
  本文以nova-api容器为例,说明kolla如何将nova-api配置文件传入容器,容器如何启动nova-api服务并读取配置文件
  注:第一部分比较无趣,二三部分 会有意思一些

1. nova-api容器参数


  •   nova-api容器定义
      
    ansible.roles.nova.defaults.main.yml中定义了nova的所有容器及容器参数,下面的代码nova-api容器的定义, 注意代码中第一条, 对于所有容器kolla都有类似的定义:将/etc/kolla下的配置目录,作为volume挂载到容器内的/var/lib/kolla/config_files目录上,供容器启动时读取
      

      nova-api:  
    container_name: "nova_api"
      
    group: "nova-api"
      
    image: "{{ nova_api_image_full }}"
      
    enabled: True
      
    privileged: True
      
    volumes:
      # 将用户nova-api服务配置目录/etc/kolla/nova-api传入容器,映射为/var/lib/kolla/config_files/,并设置为只读
      - "{{ node_config_directory }}/nova-api/:{{ container_config_directory }}/:ro"
      # 容器时钟和虚拟机时钟同步
      - "/etc/localtime:/etc/localtime:ro"
      # 宿主机内核,mount给容器之后,容器可以启用宿主机未启用的内核模块
      - "/lib/modules:/lib/modules:ro"
      # openstack日志目录
      - "kolla_logs:/var/log/kolla/"

  •   nova-api容器操作定义
      
    ansible.roles.nova.handlers.main.yml中定义了对nova各个容器的操作及其参数,下面的代码是nova-api服务restart的参数,注意该函数的名称虽然是restart nova-api,但是action是recreate_or_restart_container,如果restart nova-api容器时,该容器不存在,restart函数会创建该容器并启动。
      
    由于nova的服务都是无状态应用,重启容器和重新创建容器没有区别,所以kolla在handler中仅仅定义了restart or recreate操作,但是对于mariadb容器,handler把创建和重启容器分开来,handler包括中定义了start_container,recreate_or_restart_container两个操作

  

- name: Restart nova-api container  vars:
  service_name: "nova-api"
  service: "{{ nova_services[service_name] }}"
  config_json: 略
  nova_conf: 略
  policy_json: 略
  nova_api_container: 略
  kolla_docker:
  action: "recreate_or_restart_container"
  common_options: "{{ docker_common_options }}"
  name: "{{ service.container_name }}"
  image: "{{ service.image }}"
  privileged: "{{ service.privileged | default(False) }}"
  volumes: "{{ service.volumes|reject('equalto', '')|list }}"
  when:
  略
  


  • nova-api容器创建  
    ansible.library.kolla_docker.py中定义了所有容器创建的函数 create_container

  

    def create_container(self):  self.changed = True
  # 获取创建容器的volume配置等容器创建参数
  options = self.build_container_options()
  # 调用docker driver创建容器
  self.dc.create_container(**options)
  def build_container_options(self):
  #生成volume参数
  volumes, binds = self.generate_volumes()
  return {
  'detach': self.params.get('detach'),
  'environment': self._format_env_vars(),
  'host_config': self.build_host_config(binds),
  'labels': self.params.get('labels'),
  'image': self.params.get('image'),
  'name': self.params.get('name'),
  'volumes': volumes,
  'tty': True
  }
  def generate_volumes(self):
  # self.params在初始化时使用1中的kolla_docker参数定义
  volumes = self.params.get('volumes')
  # 解析字符串,略
  for vol in volumes:
  #解析字符串,略
  return vol_list, vol_dict
  

2. 寻找nova-api容器的启动命令


  •   nova-api
      
    通过上面的步骤,kolla将nova-api容器创建出来并启动,并且将宿主机上的/etc/kolla/nova-api作为volume挂载到容器的/var/lib/kolla/config_files上。容器启动时,会执行容器docker file中的CMD命令。而nova-api的dockerfile位于kolla项目(不是kolla-ansible)的docker.nova.nova-api.Dockerfile.j2,内容如下:
      

    # 定义父镜像为nova-base镜像  
    FROM {{ namespace }}/{{ image_prefix }}nova-base:{{ tag }}
      
    # 作者信息,略
      

      
    # 安装nova-api服务的步骤,略
      

      
    COPY extend_start.sh /usr/local/bin/kolla_nova_extend_start
      
    RUN chmod 755 /usr/local/bin/kolla_nova_extend_start
      
    USER nova
      

      这个dockerfile定义了一个基于nova-base的nova-api镜像,在nova-base镜像的基础上,主要做了两件事:安装nova-api服务,复制extend_start.sh文件为kolla_nova_extend_start文件。

  "/usr/local/bin/" 是环境变量PATH的默认值之一,将extend_start.sht文件拷贝到这个目录后,kolla_nova_extend_start成为容器里可以直接执行的一个命令。
  Dockerfile中,对容器启动时执行的命令是这个定义的CMD ["可执行命令"], 在这个dockerfile中没有定义容器启动命令CMD。


  • nova-base image  
    我们再去看一下父镜像nova-base的Dockerfile:

  

    FROM {{ namespace }}/{{ image_prefix }}openstack-base:{{ tag }}  LABEL maintainer="{{ maintainer }}" name="{{ image_name }}" build-date="{{ build_date }}"
  

  # 安装所有nova服务通用的rpm包,如:python-keystoneclient,nova-common,etc,代码略
  

  # 创建/etc/nova目录并设置权限
  COPY nova_sudoers /etc/sudoers.d/kolla_nova_sudoers
  RUN chmod 750 /etc/sudoers.d \
  && chmod 440 /etc/sudoers.d/kolla_nova_sudoers
  

  COPY extend_start.sh /usr/local/bin/kolla_extend_start
  

  RUN touch /usr/local/bin/kolla_nova_extend_start \
  && chmod 755 /usr/local/bin/kolla_extend_start /usr/local/bin/kolla_nova_extend_start
  

  在这个文件里面,kolla复制extend_start.sh生成kolla_extend_start文件。这里依然没有定义CMD。


  • openstack-base  
    我们继续看这个镜像的父镜像openstack-base的Dockerfile:

  

    FROM {{ namespace }}/{{ image_prefix }}base:{{ tag }}  

  # 安装openstack通用rpm包,如git,gcc,eventle,代码略
  

  ENV PATH /var/lib/kolla/venv/bin:$PATH
  

  RUN {{ macros.install_pip(openstack_base_pip_packages | customizable("pip_packages")) }}
  

  在这里kolla设置了环境变量PATH=/var/lib/kolla/venv/bin,这个目录下存放了nova-api文件,这样nova-api成为可在容器里直接执行的命令


  • base image  
    继续看父镜像base的Dockerfile:

  

    FROM {{ base_image }}:{{ base_distro_tag }}  

  # 创建用户组
  

  # 配置yum或者apt的源,pip源
  

  COPY set_configs.py /usr/local/bin/kolla_set_configs
  COPY start.sh /usr/local/bin/kolla_start
  COPY sudoers /etc/sudoers
  COPY curlrc /root/.curlrc
  

  # 安装并设置dumb-init
  # 创建 /var/log/kolla 并设置权限
  # 创建/usr/local/bin/kolla_extend_start 文件并设置权限
  CMD ["kolla_start"]
  

  可以看到这里生成了kolla_start文件,并且将容器启动命令设置为kolla_start,由于base镜像是所有kolla镜像的公共镜像,所以,几乎所有kolla容器启动时,执行的命令,都是kolla_start命令,之所以说几乎,是因为有个别镜像重写了CMD

3. 通过kolla_start启动nova-api
  kolla_start是一个shell脚本,内容如下:
  

#!/bin/bash  
set -o errexit
  

  
# 解析 /var/lib/kolla/config_files/目录下的config.json,将config.json中的command写入/command文件,将config.json中的config_files拷贝到指定目录。 /var/lib/kolla/config_files是由我们在1.1中定义的/etc/kolla/nova-api目录映射而来。
  
sudo -E kolla_set_configs
  

  
# 获取config.json中的command内容,对于nova-api,它的值是"nova-api"
  
CMD=$(cat /run_command)
  
ARGS=""
  

  
#执行kolla_extend_start命令,设置nova日志目录的权限,并调用kolla_nova_extend_start命令,进行判断:如果是初始化nova-api服务,执行dbsync,如果不是,什么都不做
  
. kolla_extend_start
  

  
#执行nova-api命令,启动该服务
  
echo "Running command: '${CMD}${ARGS:+ $ARGS}'"
  
exec ${CMD} ${ARGS}
  

  可以看出,所有的openstack服务都按照上面的流程启动,不同的服务:


  • 所有服务都使用/etc/kolla/服务名/config.json中command,作为服务的启动命令
  • 所有服务都使用/etc/kolla/服务名/config.json中config_files, 作为服务的配置文件
  • 所有服务都有相同的kolla_start脚本。这个脚本在kolla项目中存放的位置是kolla.docker.base.start.sh。这个脚本会先调用kolla_extend_start脚本, 然后执行服务启动命令。
  • 所有同一项目的服务有相同的kolla_extend_start脚本。以nova项目为例,这个脚本在kolla项目中存放的位置是kolla.docker.nova.nova_base.extend_start.sh。所有nova容器都使用这个脚本会创建项目日志目录,设置权限,调用容器内的kolla_nova_extend_start脚本。
  • 所有服务都有不同的kolla_项目名_extend_start脚本,以nova_api项目为例,这个脚本在kolla项目中存放的位置是kolla.docker.nova.nova_api.extend_start.sh。nova-api使用该脚本用来做服务启动前的db_sync, 垃圾清理等操作。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-420569-1-1.html 上篇帖子: openstack--neutron--router 下篇帖子: kolla-ansible安装openstack
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表