本文作者為RojerChen,原文網址為http://rojerchen.blogspot.tw/2015/12/container-summit-2015.html
今年的 Container Summit 2015 實在是相當的精彩,這兩天的研討會著重在 Container 技術在雲端上的應用 (Google、Azure、daocloud、Mesos、RANCHER、和信雲端)、資源運用 (微博) 、CI (貝格樂)、DevOps 、Docker 1.9.x、Docker swarm。
除了內容精彩、講師陣容豪華之外,會議場地與餐點也都準備得相當不錯!全天候咖啡與點心供應實在是太貼心了,難怪有人說辦活動只要餐點準備好,評價就至少有 80分!唯一的缺點大概就是會場的網路很爛,只好用自己的手機上網 XD
這兩天這麼多的主題中,我最喜歡微博、Docker In CI、DevOps 這三場,這幾場聽起來超有感覺的,透過 Container 技術可以讓 DevOps 更容易,省去了不少時間與資源成本,而這是採用 docker 能夠帶來的實質改善。 以下就是相關的筆記:
※Container的過去、現在與未來
- docker 讓 infar as a code
- 讓開發與營運可以擁有共通的版本
- 從單一主機執行,跨入多主機架構,不再是單機開發或測試模式
※Mesos 大建大規模 Container 平台
- 特點
- resource management
- 把資源公平分散出去
- 將 IP 給某一個 Container ,你不需要知道這個 Container 再哪一台機器,但是你可以用這個 IP 找到該 Container
- programming abstractions
- security
- monitoring , debugging , logging
- resource management
- Mesos 提供 API 使用
- 各種不同的 framework 都可以在Mesos這個平台上使用
※Docker in CI:Cacoo與Backlog導入Docker的經驗分享
- 日本人用台語自我介紹,超強!
- 公司業務介紹
- Backlog (http://backlogtool.com/tw)
- Cacoo
- Typetalk
- 利用 Docker 的特性來做 CI
- 測試遇到的瓶頸
- 分支問題
- 太多開發人員、太多分支
- 需要經過單元測試後才可以 review
- 測試環境
- 不同開發環境,需要不同的測試環境與工具
- 速度
- 整合測試前必須先完成單元測試後才可以進行,需要等很久
- 分支問題
- 使用 Docker 的優點
- 容易設定 slave
- 啟動快速,只要啟動 docker 後就可以執行測試了
- 簡化環境設定
- 只需要 dockerfile 就可以達到需求
- 加速
- 自己有架設 docker register
- 資源利用
- 測試完畢後就可以將 container 移除,節省資源
- 權限問題
- in some case , test should be run by non-root user
- owner of host directory inside container is indefinite
- writing build result to host directory by non-root user can fail
- change ownership to non-root user during build time
- copy build result from container
- no permission issue
- complicate
- Docker in CI
- good place to start docker
- ci becomes common practice
- installing docker in ci doesn’t change many things
- we could have best practice in this area
- good place to start docker
- 日本在production 應用案例
- 容易設定 slave
※新浪微博大規模基於Docker的混合雲應用實踐
- 業務背景
- 業務量變化非常大、瞬間的峰值很高,需要大量的設備以確保服務在尖峰期間能夠正常
- 業務突發狀況
- 突發事件、三節(元旦、春晚、耶誕節)、紅包飛
- 日常推撥
- 資源浪費
- 每個業務單位有各自的設備,以確保尖峰期間服務能夠正常
- 每個業務都有設備閒置,造成資源浪費
- 設備
- 申請週期過長
- 機房空間有限
- 目標
- 個業務除了有各自的保留空間外,有部分的空間如10%設備會共通用,
- 讓共用的空間做靈活的彈性轉移
- 大陸業界處理方式:12306 (類似台鐵訂票網站)
- 目前有兩個資料儲存中心,但是仍舊有問題
- 額外申請阿里雲,用來應付尖峰流量
- 雲端
- 使用阿里雲
- 持續部屬不會用在雲端,單純用來扛尖峰值
- 拉專線,兩個機房各 1G 專線,三節尖峰狀態拉 10G 專線
- 拉專線才可以降低延遲時間,使用公有雲方式處理速度太慢
- Docker Registry
- 有自己的 Docker Registry 用來做版本管理
- Docker 有升級過,額外用 Nginx 做處理,得知目前服務請求要用 V1 or V2 Registry
- 具有內部私有機房,並透過專線與阿里雲溝通
- docker
- swarm
- mesos (離線數據分析用)
- dispatch (自行開發任務系統)
- 後端服務為JAVA
- 前端服務 PHP
- 有一個共用的資源池,當其他系統有需要資源再做調配
- 大規模集群操作自動化
- 設備申請
- 內:共享池
- 外:阿里雲
- 初始化
- 標準化
- 配置管理
- 安裝、升級自動化、操作 API 化
- RPM+Puppet MasterLess
- 業界可能透過 CoreOS、RancherOS、Atomic、DCOS 來做初始化,但是對微博來說,這樣成本過高,所以自己做初始化。
- 服務上線
- 容器動態調度
- 服務彈性擴充
- 各項業務有10%的設備提供做為共享使用
- 資源不足時進行申請,使用後歸還
- 具有報警平台、業務監控
- 部屬模式
- 優先調度內網共享
- 擴充容,單次操作時間 < 5min
- 設備申請
※群暉科技運用Docker研發新世代產品之路
- NAS 提供 Docker 服務遇到的困難
- 網路
- NAT Port Mapping
- 使用 open vswitch 方式處理網路問題
- 儲存空間
- 讓 DMS 上共用同一份 docker image
- stateless data:like image or library
- stateful data:user data、documents、images
- 利用 DSM 升級,自動調整 config 檔案
- 用 BTRFS subvolume 的 quote 機制,限制 docker dsm 用量
- 支援 snapshot 、backup
- 安全性
- cgroup
- capability
- apparmor
- namespace
- read-only sysfs
- sysfs 設定為唯讀
- procfs 部分路徑唯讀
- 網路
- 內部使用案例
- demo site:讓每一個使用者資料隔離,不會讀到前一個使用者看到的資料
- QC
- 模擬多 client 情境效能測試
- 保存/還原測試問題環境
※兩大平臺完整結合: 談Windows Container & Azure Container service
- windows 世界的 container 技術
- docker vm extension
- hyper-v containers
- visual studio tooling
- continuous integration with visual studio online
- docker trust repository
- 可以用 power shell 或是用 docker command
- MS自己的 container
- Server Core
- Nano Server
- 最佳化 for container 的 os
- 原生支援 docker command
- 使用 Apache Mesos Scale
- Apache Mesos on Windows Server
※擁抱或對抗?談Docker對傳統DevOps工具鏈的衝擊
- Slide
- DevOps
- How to recreate your system (如何在另外一個地方重新建立、從無到有)
- How to safely change your system (如何改變你的系統)
- When something has gone wrong (當系統發生狀況,如何快速地知道與解決)
- detection
- recovery
- diagnosis
- 除了 DB 之外,其他服務很難裸機,通常都用 VM 來處理,但是使用VM一開始就會消耗硬體10%資源
- Container OS
- 是否OS要不要這麼肥?
- 作業系統瘦身
- CoreOS
- Windows Nano Server
- Snappy Ubuntu Core
- VMWare Photon
- Red Hat Atomic
- container per vm
- 每一個 container 的用途是用來跑單一VM
- unikernel
- MirageOS、Boxfuse
- boxfuse 把東西 convert 成 image 並丟到AWS上run
- docker
- immutable image
- versioned image
- devlprod parity
- 以後電腦的功用是開好SSH、系統參數設定完後,剩下就交給Docker
- 是否OS要不要這麼肥?
- pets and cattle
- 差別
- 有名字
- 是否可以拋棄
- 傳統 AP (寵物開發)
- 很難移植、必須好好照顧
- 牲畜開發法
- 由電腦幫你決定要丟到哪一台電腦上執行
- 可以容易複製與轉移
- 參考12 factors
- docker swarm、Mesos....
- kubernetes
- rolling upgrade
- canary deployment
- 差別
※如何在Kubernetes上持續部署微服務型應用
- simple microservice
- program language : go
- backend (json)
- frontend (html)
- kubernetes
- manage a cluster of lunux containers as a single system
- opensource
- 5 basic things
- cluster
- one master and at least one node
- kubernetes as a managed service
- pod (感覺就像docker一樣)
- co-located docker containers
- containers share volumes and localhost
- pod.yaml (很像 docker compose,給 master 使用)
- Service
- abstraction to communicate with pods
- have frontend & backend services
- namespace
- have own resources
- cluster
- Continuous Depolyment
- commit often
- deploy every commit
- validate and rollback deploys
- minimize human interaction
- code -> test -> commit -> push -> build -> test
- continuous deployment
- Jenkins workflow plugin
- docker image 要設定別名,這樣之後才可以管理
※深入理解Dockerfile、Docker映像檔以及Docker容器
- docloud 公司業務介紹 (http://www.daocloud.io)
- daoship
- 持續交付流水線
- daohub
- 可追朔的交付件倉庫
- 突破城牆! Docker hub 鏡像
- daocloud
- 快雲端網的容器集群管理
- daoship
- Agenda
- Docker introduction
- 容器技術:有效分配與管理物理資源,實現資源隔離
- 對容器來說,關注的點有沒有 linux kernel
- 資源隔離 ( 除了CPU、RAM、kernel 也是一種資源,
- 鏡像技術
- 打破代碼即應用的觀念,從系統環境開始,自底至上打包應用
- let infar as a code
- windows 對 ap 層實現容器技術
- dependency、configuration
- docker 化實踐
- dockerfile -> docker image (can ship anywhere) -> docker container
- dockerfile 定義一切
- 容器技術:有效分配與管理物理資源,實現資源隔離
- Dockerfile
- cache
- 先看作這一步動作的時候 Image 有沒有變,沒有變再看看
- cache
- docker image
- 一個 image 由多個層來組合
- 一些資料不應該存入,如 hosts、hostname、resolv.conf
- docker container
- 不存在傳統的 init 進程
- 缺少基本的服務進程
- 與內和進程通信能力薄弱
- docker 比較適合高層次的AP,如果是跟系統硬體設備比較相關,要管理和監控比較不足
- cache
- docker 服務的最終交付
- 受到資源的隔離與控制
- 收到權限的控制
- linux container & linux kernel 都是 root
- container 內部與 container 外度的 root 有巨大的差異
- 支撐用戶應用的運行
- docker engine 對於 docker container 有比較好的管理
- Docker introduction
※和信雲端 Container 實戰經驗
- container cluster
- scale
- full tolerance
- container 角度,增加 container instance
- benefits of collaboration
- cloud native computing
- more than just the container
- hybrid cloud
※深入瞭解 Docker Container Networks
- 網路處理機制
- bridge (很久以前一開始 RUN 的版本)
- none (啥鬼都沒有)
- host ( container和主機網路組態相同)
- container
- used-defined network
- 以前只有在同一台底下的container 可以互相溝通,現在不同台主機的container 可以互相溝通
- docker network commands
- docker network create/connect/ls/rm/disconnect/inspect
- 不同 bride 的 container 不能相通
- inspect 可以看到每個 container 底下網路的狀況
- overlay network (讓不同台主機的 container 可以彼此互連)
- prepare a key value store
- add cluster options to each docker engine
- docker engine run 起來要加參數
- --cluster-store=consul://ip:8500
- --cluster-advertiser=eth1:2376
- docker engine run 起來要加參數
- create on overlay network on one of the host
- host 上要 create overlay network 所有有加入這個 consul 的 device 就可以看到
- 可以一台主機在Azure,另外一台在digital ocean ,兩台再串起來
- eth0 用來做 overlay network
- weave network plugin
- 有好用的介面讓你看狀況
※用Docker Swarm打造多主機叢集環境
- Slide
- 讓一個 container 讓多個 container 存取
- docker machine 啟動 swarm master 再啟動 swarm node
- Port Allow
- 特種不同的雲端平台需要開的 PORT 不同
- docker engine port (TCP 2375)
- VXLAN:UDP4789
- 注意Kernel版本
- 透過 key-store 讓swarm master node 知道彼此位置
※Q&A
- docker 版本更新很快,該如何跟上步調?
- 參考雲端服務者使用的版本
- 雲端服務提供的版本一定不是最新版,但是該版本會和雲端服務整合的最好才會提供該版本服務
- 知道每個版本的功能,升級上去並做測試,不要用 x.x.0 的版本
- 微博經驗
- 大量的測試、壓測之後才上線
- 目前也只有用過 1.3.x , 1.6.2 這兩個版本
- 記憶體問題 JVM
- 如果要考量scale與穩定性,自己要做好記憶體管理,了解 memory limit、heap size
- JCCONF 有人講過相關的主題,可以參考 連結
- eBay 經驗
- 主機裝 VM,每個 VM 底下再裝 Docker or Container
- performance 對 eBay 不是考量
- 人的 development cost 比較高
- 結論:有錢真好
- 擁抱 docker 有甚麼 business model
- 是一個趨勢
- 以前的程式只能在舊的OS執行,OS升級後程式還要繼續支援,這樣能夠降低 dependency
- 彈性調度資源、硬體資源的管理、自動化的安裝
- 自我思考
- 思考開發、維護對現有工作可以帶來的改變
- 調整開發思維 (寵物與畜生牲畜)
- 發明一個新的 container 技術不是太困難,但是要做得像 docker 一樣好,擁有好的 ecosystem 、並且把使用者從 docker 轉移到其他的 container 技術才是困難的。