转载

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

提纲:

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 宿主机的本地磁盘上,
    o 日志位置的统一:/data/application/logs
    o 日志文件名称的统一: 日志类型-工程名-环境-容器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?

K8s 就是 Kubernetes 的缩写。

在2014年11月时,K8s 还需要一些未开源的部件来完成网络配置,所以我们选择了当时更成熟易用的 Mesos+Marathon。由于 K8s 作为容器编排工具可以架设在 Mesos 之上,K8s 也越来越成熟,所以后续不排除选型 Mesos+K8s。

接下来说一下调用安全。

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

Docker 镜像的存储和管理,对应于 Docker-Registry。

可以看到,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 的用户名密码。

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 ... .html ;

5,2014,搭建docker-registry时使用自签名ssl证书认证问题, https://www.webmaster.me/serve ... .html ;

6,2015,从Docker Hub和docker-registry看优秀的后端服务设计实现, http://dockone.io/article/142 ;

7,马全一, https://github.com/containerops/wharf ;

8,Marathon API doc, https://mesosphere.github.io/m ... .html ;

9,2014,Docker入门教程之Docker Remote API;

10,2015,郑昀,容器私有云和持续发布都要解决哪些基础问题 第一集;

-EOF-

- 欢迎订阅我的微信订阅号『老兵笔记』,请扫描二维码关注:

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

正文到此结束
Loading...