容器私有云和持续发布都要解决哪些基础问题 第二集

郑昀编著 创建于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-
posted @ 2015-11-20 17:23  旁观者  阅读(...)  评论(... 编辑 收藏