容器私有云和持续发布都要解决哪些基础问题 第二集
郑昀编著 创建于2015/10/30 最后更新于2015/11/20
关键词:Docker,容器,持续集成,持续发布,私有云,Jenkins,Mesos,Marathon
本文档适用人员:广义上的技术人员
提纲:
- 集装箱还是卷挂载?
- Host Networking 还是 Bridge Networking?
- 容器要固定IP吗?
- 容器内部如何获取宿主机的IP?
- 容器日志如何收集?
- Apache Mesos 还是 Google K8s?
- 如何保证 Registry 镜像Pull/Push安全?
- 如何保证 Marathon API 和 Docker API 调用安全?
在构建基于容器的私有云以及相应的持续发布时,还需要解决这些基础问题。延续上一篇。
0x04 容器日志如何收集?
仍采用我们惯常的 ELK 方案。即,
- 与开发者约定好日志文件的路径规范,日志就落在容器所在 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)
- 启动 Logstash Agent 去收集日志,上传给 Logstash,
- 我们基于 Kibana 查询和分析日志,尤其是我们的异常日志分析与汇总。
0x05 Apache Mesos还是Google K8s?
VS
K8s 就是 Kubernetes 的缩写。
在2014年11月~2015年1月,K8s 还需要一些未开源的部件来完成网络配置,所以我们选择了当时更成熟易用的 Mesos+Marathon。由于 K8s 作为容器编排工具可以架设在 Mesos 之上,K8s 也越来越成熟,所以后续不排除选型 Mesos+K8s。
接下来说一下调用安全。
0x06 如何保证Registry镜像Pull/Push安全?
Docker 镜像的存储和管理,对应于 Docker-Registry,它是用 Python 语言开发的。它由三个组件构成:
- Docker Index
- Web UI
- Meta-data 元数据存储(附注、星级、公共库清单)
- 访问认证
- token 管理
- Docker Registry
- 存储镜像、以及镜像层的家族谱系
- 没有用户账户数据
- 不知道用户的账户和安全性
- 把安全和认证委托给 docker-hub 来做,用 token 来保证传递安全
- 不需要重新发明轮子,支持多种存储后端
- 没有本地数据库
- 后端存储
- 因为镜像最终是以 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 需要持有用于 Basic Auth 的用户名密码以及 SSL 证书。下面引用 larrycaiyu 的制图来说明 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 进行容器部署工作,如下图所示。
其中,Marathon REST API 支持 Basic Auth 和 SSL,如官方文档 SSL and Basic Access Authentication 所示,所以 Touchstone 需要持有用于 Basic Auth 的用户名密码。
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;
8,Marathon API doc,https://mesosphere.github.io/marathon/docs/ssl-basic-access-authentication.html;
9,2014,Docker入门教程之Docker Remote API;
10,2015,郑昀,容器私有云和持续发布都要解决哪些基础问题 第一集;
-EOF-