容器私有雲和持續發布都要解決哪些基礎問題 第二集


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM