zoukankan      html  css  js  c++  java
  • 容器私有云和持续发布都要解决哪些基础问题 第二集

    郑昀编著 创建于2015/10/30 最后更新于2015/11/20
    关键词:Docker,容器,持续集成,持续发布,私有云,Jenkins,Mesos,Marathon

    本文档适用人员:广义上的技术人员
    提纲:
    1. 集装箱还是卷挂载?
    2. Host Networking 还是 Bridge Networking?
    3. 容器要固定IP吗?
    4. 容器内部如何获取宿主机的IP?
    5. 容器日志如何收集?
    6. Apache Mesos 还是 Google K8s?
    7. 如何保证 Registry 镜像Pull/Push安全?
    8. 如何保证 Marathon API 和 Docker API 调用安全?

      在构建基于容器的私有云以及相应的持续发布时,还需要解决这些基础问题。延续上一篇

    0x04 容器日志如何收集?

      仍采用我们惯常的 ELK 方案。即,
    1. 与开发者约定好日志文件的路径规范,日志就落在容器所在 Mesos Slave 宿主机的本地磁盘上,
      • 日志位置的统一:/data/application/logs
      • 日志文件名称的统一:日志类型-工程名-环境-容器Tag-主机名,这样 Logstash 就能把重要信息从文件名里抽离出来了:
        • 应用日志位置:/data/application/logs/日志类型_${APPNAME}_${APPENV}_${APPIMGTAG}_${HOSTNAME}_%d{yyyyMMdd}.log, 比如 aether 的日志位置为:/data/appliaction/logs/weberror_aether_nor_8_778283_20150819.log 
        •  trace(鹰眼)日志位置:/data/application/logs/tracing/tracing_${APPNAME}_${APPENV}_${APPIMGTAG}_${HOSTNAME}_%d{yyyyMMddhh}.log,比如 aether 的 trace 日志位置为:/data/appliaction/logs/tracing/tracing_aether_nor_8_778283_2015081912.log 
        • 针对于 ENV 采用简写的形式,取每个环境的前3个字符来指代该环境:
          • 开发联调(dev)
          • 常规(nor)
          • 紧急(eme)
          • 特殊(spe)
          • 镜像(mir)
          • 生产(pro)
    2. 启动 Logstash Agent 去收集日志,上传给 Logstash,
    3. 我们基于 Kibana 查询和分析日志,尤其是我们的异常日志分析与汇总。

    0x05 Apache Mesos还是Google K8s?

      mesos VS k8s
      K8s 就是 Kubernetes 的缩写。
      在2014年11月~2015年1月,K8s 还需要一些未开源的部件来完成网络配置,所以我们选择了当时更成熟易用的 Mesos+Marathon。由于 K8s 作为容器编排工具可以架设在 Mesos 之上,K8s 也越来越成熟,所以后续不排除选型 Mesos+K8s。
     
      接下来说一下调用安全。

    0x06 如何保证Registry镜像Pull/Push安全?

      Docker 镜像的存储和管理,对应于 Docker-Registry,它是用 Python 语言开发的。它由三个组件构成:
    1. Docker Index
      • Web UI 
      • Meta-data 元数据存储(附注、星级、公共库清单) 
      • 访问认证 
      • token 管理 
    2. Docker Registry
      • 存储镜像、以及镜像层的家族谱系 
      • 没有用户账户数据 
      • 不知道用户的账户和安全性 
      • 把安全和认证委托给 docker-hub 来做,用 token 来保证传递安全 
      • 不需要重新发明轮子,支持多种存储后端 
      • 没有本地数据库 
    3. 后端存储
      • 因为镜像最终是以 tar.gz 的方式静态存储在服务端
      • 适用于对象存储而不是块存储
      • registry 存储驱动
      • 官方支持的驱动有文件、亚马逊AWS S3、ceph-s3、Google gcs、OpenStack swift,glance
      可以看到,Docker-Registry 缺省没有安全权限的设置,任何人都可以 pull 和 push,所以安全和认证由 Docker Index(即 Docker-Hub)处理。
      但目前我们没有引入 Docker Index 角色,只是在 Docker Registry 前面架设了一层 Nginx 负责 Basic-Auth 身份认证和 SSL 加密传输,之所以如此是因为2014年10月发布的 Docker 1.3 开始强制 Basic Authentication 而且必须使用 HTTPS 访问 Registry,如下图所示:
    jenkins->registry
     
      也就是说,Jenkins 需要持有用于 Basic Auth 的用户名密码以及 SSL 证书。下面引用 larrycaiyu 的制图来说明 Nginx+Registry 的服务是如何组成的:
    nginx->registry
     
      关于 SSL 自签名证书(Serf-signed certification),可以参考这两篇文章 搭建docker-registry时使用自签名ssl证书认证问题 和 Building private Docker registry with basic authentication

    0x07 如何保证Marathon API和Docker API调用安全?

      我们的持续集成管理平台(Codename:Touchstone)会调用 Marathon REST API 进行容器部署工作,如下图所示。
    touchstone->marathon
     
      其中,Marathon REST API 支持 Basic Auth 和 SSL,如官方文档 SSL and Basic Access Authentication 所示,所以 Touchstone 需要持有用于 Basic Auth 的用户名密码。
      2014年4月,Docker 0.10 引入了 TLS auth,内置了 TLS/SSL 证书安全,这样 Docker Remote API 才不再裸奔。目前,我们在 Mesos Slave 宿主机的 Docker Daemon 配置文件 /etc/sysconfig/docker 里启用了 --tlsverify:
    OPTIONS='--tlsverify 
    --tlscacert=/root/.docker/ca.pem --tlscert=/root/.docker/cert.pem --tlskey=/root/.docker/key.pem …………
      于是乎,Java 开发的 Touchstone 通过界面配置并将如下信息存储到它的数据库里:
    • 访问远端 Marathon REST API 所需的用户名密码和 SSL 证书;
    • 访问远端 Docker Remote API 所需的 SSL 证书。
     
    ——未完待续——
    欢迎订阅我的微信订阅号『老兵笔记』,请扫描二维码关注:
    老兵笔记订阅号二维码
    转载时请注明“转载自旁观者-博客园”或者给出本文的原始链接。
     
    附录A:参考资源
    1,2015,闲谈Kubernetes 的主要特性和经验分享,http://www.dockone.io/article/578
    2,2015,Swarm、Fleet、Kubernetes、Mesos - 编排工具的对比分析,http://dockone.io/article/823
    3,2015,Docker Registry的定制和性能分析,http://dockone.io/article/375
    4,2014,用Nginx来做私有docker registry的安全控制,http://www.larrycaiyu.com/2014/12/01/private-docker-registry-with-nginx.html
    5,2014,搭建docker-registry时使用自签名ssl证书认证问题,https://www.webmaster.me/server/docker-registry-with-self-signed-ssl-certificate.html
    6,2015,从Docker Hub和docker-registry看优秀的后端服务设计实现,http://dockone.io/article/142
     
    -EOF-
  • 相关阅读:
    7月的尾巴,你是XXX
    戏说Android view 工作流程《下》
    “燕子”
    Android开机动画bootanimation.zip
    戏说Android view 工作流程《上》
    ViewController里已连接的IBOutlet为什么会是nil
    My first App "Encrypt Wheel" is Ready to Download!
    iOS开发中角色Role所产生的悲剧(未完)
    UIScrollView实现不全屏分页的小技巧
    Apple misunderstood my app,now my app status changed to “In Review”
  • 原文地址:https://www.cnblogs.com/zhengyun_ustc/p/dockernow2.html
Copyright © 2011-2022 走看看