鄭昀編著 創建於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?




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-