容器周邊開源工具新秀:Sysdig和Calico
伴隨著容器技術的普及和落地,許多圍繞在容器與 微服務生態圈周邊的開源工具也逐漸獲得社區的關注和投入。其中有許多工具的名字已經廣為人知,比如服務發現 工具Etcd和Consul,日志收集工具組合Elasticsearch、Logstash和Kiba n a,任 務編排工具 Fleet、Kubernetes和Mesos等。這些工具之所以出名, 一方面是由于它們解決了實際生產中遇到的問題,另一方面則是由于項目主導者和參與者的大力宣傳。與此相對的,在社區中同樣存在著許多十分優秀但出鏡率并不高的開源項目。
在今年CoreOS Fest 大會接近尾聲的時候,會場上出現了兩個值 得關注的話題,演講者分別展示了 S y sdig和Calico在CoreOS系統中的運用,這兩個產品都是與容 器密切相關的開源工具,它們分別補充了現有容器技術在特定功能領域方面的不足。即使 是在CoreOS Fest 已經過去幾個月的現在看來,在Sysdig和Calico各自所處 的領域內,它們都依然是無可替代的選擇。本文將從安裝和使用兩個方面分別介紹這兩個工具的使用場景。
容器監控器 Sysdig
S ysdig 【1】是S ysdig Cloud 公 司開發的一款開源的系統運行信息和網絡流監控軟件,早先在網絡上的一些文章也對它有所介紹,但幾乎都只關注于它對主機的監控和管理功能。而 Sysdig之所以能夠出現在CoreOS Fest上,一個重要的原 因,就是它在近期的版本中 【2】將容器的監控納入了其首位支持的特性。
通 過 Sysdig工 具,用戶能夠很方便地查看到主機上所有應用程序的 CPU、文 件 I/O、網絡訪 問狀況,這個工具最初的產生就是為了取代傳統服務器上的一系列系統檢測工具如 strace、tcpdump、htop、iftop、lsof等。它的Logo被設計為一個鏟 子的輪廓,寓意著 Sysdig對 系統信息的強大挖掘能力。
新版本的Sysdig在設計上充分運用了容器技術的成果,這主要體現在兩個方面。一方面 是 Sysdig提供了 可以快速運行的 Docker容器 鏡像,這使得用戶能夠很方便地在任何安裝了 Docker的Linux環 境中快速使用它進行系統數據的收集和分析。另一方面是 S y sd i g專 門提供了容器級別的信息采集命令,支持查看指定容器之間的網絡流量、查看特定容器的 CPU使用量等。
對于 大多數的 Linux發行版,都 可以通過下面這個命令直接安裝 Sysdig工具。
$ curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | sudo bash或者通過以下命令 ,用 Docker快速啟動一個包含有Sysdig命令的控制臺【3】。
$ docker run -i -t --name sysdig --privileged -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/usr:ro sysdig/sysdig
安裝完Sysdig后 ,下面介紹一下它的使用。 Sysdig令的默認作用域是 整個主機 ,用戶需要通過 “ container.name”參數將作用域限定為指定容器,我 們將重點討論這種情況的應用場景。
首先運行一交互 模式的 Ubuntu容器 ,命名為 ubuntu01,它將作為被監控的容器
$ docker run -it --rm --name ubuntu01 ubuntu /bin/bash
在接下來 的所有命令中,都會使用“ cont ainer.name=ubuntu01 ”參數,這樣就將監控的作用域限定 在這個容器相關的系統資源上。
不加其他參數 的 sysdig命令的作用相 當于 tcpdump, 它將打印出指定容器中所有的網絡數據到控制臺上,可以使用 -w將捕獲的數據寫入指定的文件中。保存的 抓包文件除了通過專用軟件如 wireshark進行分析,也 可以直接用 sysdig的-r參數讀取出來再打印到控制臺。
$ sysdig container.name=ubuntu01默認情況下,這個命令的 輸出顯示的是容器中運行的進程在主機上的實際 PID號。使用-p參數可以改變輸 出內容的格式,給命令加上 -pcontainer參數(可簡寫 為 -pc),就 會額外打印出進程所處的容器名稱,以及在容器中的 PID信息。
此外,使用-c參數可以指定監控的操作類型,Sysdig提 供了幾十種客供查看和監控的系統數據。包括 CPU使 用率、文件 I/O、網絡流量、系統錯誤、系統日志、性 能瓶頸甚至監控指定用戶的行為。例如,在 Sysdig的Shell輸入:
$ sysdig -pc -c topprocs_cpu container.name=ubuntu01Sysdig將顯示屬于ubuntu01容器中的所有進程的CPU使用情況,并以CPU使用率排序。顯示內容舉例如下:
CPU% Process Host_pid Container_pid container.name
--------------------------------------------------------------------------------
0.00% bash 3997 1 ubuntu01
此時如果在ubuntu01容器中開始“apt-getupdate”的操作,同時在Sysdig的Shell輸入:
$ sysdig -pc -c topprocs_net container.name=ubuntu01
就能夠 看到容器中所有進程的網絡使用情況了。顯示內容舉例如下:
Bytes Process Host_pid Container_pid container.name
--------------------------------------------------------------------------------
62.58KB http 4491 22 ubuntu01
S y sdi g 還支持一些復雜的數據過 濾操作,例如下面這個命令能夠監控 ubuntu01容器中所 有由 c a t進程 發起的“ open”系統調用。
$ sysdig -pc proc.name=cat and evt.type=open and container.name=ubuntu01在Sysdig提供的 命令中,有個十分有趣的“ spy_ users ”功能,可以實時監控指定容器的用戶輸入內 容。例如,在 Sysdig的Shell輸入以下命令:
$ sysdig -pc -c spy_users container.name=ubuntu01
回到ubuntu01容器中,執行一個“ ls —color=auto” 命令,然后就會看到剛剛輸入命令實時的回顯在了 Sysdig的Shell里面。顯示內容舉例如下:
3997 11:30:19 root@ubuntu01) ls --color=auto
這些 示例僅僅是展示了 Sysdig能 力的冰山一角,在目前的其他系統監控類工具中,筆者還沒有看到像 Sysdig這 樣功能如此強大、而又對容器支持這樣好的。所以,對于經常使用容器作為產品運行方式的用戶,這是一款值得深入了解的“故障排查神器”。
容器級防火墻 Calico
在傳 統的服務應用架構設計中,通常會將各種服務模塊按照功能類型進行分層,例如 Web應 用服務、核心業務服務、數據庫服務等,在層與層之間通過防火墻限定上層服務對下層服務的訪問規則。如圖 1所示。
圖1 傳統應用架構通用的分層設計
而對 于容器化的服務場景,許多用戶往往傾向于構建 由大量可橫向擴展的、獨立的小單元組成的微服務式 架構。在這樣的架構中,主機節點的個數和 IP地址都 是快速變化的,且在業務服務單元之間存在很多相互調用的情況,也需要進行訪問的安全控制,這使得分層防火墻的思路不再可行。
Calic o 【4】是Metaswitch Ne tworks公司提供的 一種容器級路由和防火墻工具,它能夠在容器級別上為每個容器實例或 Kubernetes的Pod實例指定訪問規則,達到服 務間可控的訪問。從原理上說, Calico是通過修 改每個主機節點上的 iptables和路由表規 則實現容器間數據路由和訪問控制,并通過 Etcd協調節點配置信 息的。因此 Calico服 務本身和許多分布式服務一樣,需要運行在集群的每一個節點上。
Calico的Logo被設計 成一只玩毛線球的斑點貓,仿佛說明它能夠將亂如毛線團的容器網絡通信整理得規規整整。由于不同的容器調度框架對網絡結構和容器調度單元的實現上并不一致, Calico針對許多主流 的應用場景分別進行了定制,例如直接用于 Doc k e r 、直接用于Rkt、作為lib n etwo r k插件、作為Kubernetes插件、作為Mesos插件等場景。與Kubernetes結合使用時,它還 能夠替代其他網絡規劃工具,例如 F l ann e l,直接接管 集群不同節點間的網絡通信路由功能。
下面重點介紹Calico直接用于Docker的場景 ,它是 Calico最基本、也最具代表性的一種使用方法。
Calico的安裝 可以通過它的控制客戶端工具完成,這個命令行工具可以從 Calico的Github倉 庫直接下載。下面的命令將其放到系統的 /opt/b i n/目錄中,以方便 使用:
$ wget -O /opt/bin/calicoctl https://github.com/projectcalico/calico-docker/releases/download/v0.6.0/calicoctl $ chmod +x /opt/bin/calicoctl
為了演示Calico提供的跨節點路由功能,下面將在 兩個主機節點上分別啟動 Calico服務。啟動的命令 為“ calicoctl node ”,這個命令會在當前節點通過Docker啟動 一個部署有 Calico服務的容器,并在 后臺保持運行。
$ hostname core-01 $ sudo calicoctl node No IP provided. Using detected IP: 10.0.2.15 Calico node is running with id: … $ docker ps CONTAINER ID IMAGE COMMAND … NAMES d0388bcdca86 calico/node:v0.6.0 "/sbin/my_init" … calico-node
在另一個節點也將Calico服務啟動起來。
$ hostname core-02 $ sudo calicoctl node No IP provided. Using detected IP: 10.0.2.16 Calico node is running with id: …
在每個節點上分別運行 兩個 Docker容器,并 將網絡模 式設置為none,然后通過“calicoctl container add”命 令將容器添加到 C a lico服務的 管理之下,首先是節點 core-01:
$ hostname core-01 $ docker run --net=none --name docker-01-A -tid ubuntu:15.10 $ docker run --net=none --name docker-01-B -tid ubuntu:15.10 $ sudo calicoctl container add docker-01-A 192.168.0.1 $ sudo calicoctl container add docker-01-B 192.168.0.2
然后在節點core-02做 相同操作,注意容器的命名差異。
$ hostname core-02 $ docker run --net=none --name docker-02-A -tid ubuntu:15.10 $ docker run --net=none --name docker-02-B -tid ubuntu:15.10 $ sudo calicoctl container add docker-02-A 192.168.0.3 $ sudo calicoctl container add docker-02-B 192.168.0.4
由 于目前還未在 Calico中添加任何規則,這四個容器 之間是無法 ping通的。接下來 ,先創建兩個訪問組“ GROUP_A”和“GROUP_01”,這個操作 可以在任意的一個節點上完成。
$ calicoctl profile add GROUP_A Created profile GROUP_A $ calicoctl profile add GROUP_01 Created profile GROUP_01
最后將容器docker-01-A和docker-02 -A 添加到訪問組GRO UP_A 中,將容 器 doc ker-01-A 和doc ker-01-B 添加到訪問中GROUP_01中。注意“calicoctl container ”命令必須在 運行有指定容器的主機上運行,首先是主機 core-01。
$ hostname core-01 $ calicoctl container docker-01-A profile append GROUP_A Profiles GROUP_A appended $ calicoctl container docker-01-A profile append GROUP_01 Profiles GROUP_01 appended $ calicoctl container docker-01-B profile append GROUP_01 Profiles GROUP_01 appended
然后是主機core-02。
$ hostname core-02 $ calicoctl container docker-02-A profile append GROUP_A Profiles GROUP_A appended
圖2 示例配置形成的網絡結構
以上配置形成的網絡結構如圖2所示。若使用ping命令驗 證容器兩兩之間的可訪問性,可以 發 現只要同屬一個訪問組的兩個容器之間,不論它們是否處在相同物理節點,相互訪問都是成功,反之則無法連接。
- 容器docker-01-A能夠同 時和 docker-02 -A 和docker-01-B通信
- 容器docker-01-B和docker-02-A都只能與docker-01-A通信
- 容器docker-02-B與其他任何容器之間都不能通信
上面這個案例很好的解釋了“容器級防火墻”的含 義。實際上,對于比較大型的服務集群,手工修改每一個容器的 IP地址 和訪問規則是不現實的, Calico內 置了對常見的容器擴展庫(例如 libnetwork)和調度 框架(例如 K u bernetes和Mesos)的插件方式支持,
其底層工作原理與上面演示的直接用于Docker的情況基本一致,同時利用這些擴展和框架的功能簡化 了訪問規則的配置方法。比如將 C a lico與Kubernetes進行集成時,僅需要安裝Kubernetes的Calico插件,并 在啟動 Kub e rnetes Node 節點 的 kub e let進 程時,添加 network_plugin參數指定Calico作為其網絡層的 地址分配工具即可。 Calico將允許用戶在創建Pod和Serv i ce描 述文件時,使用 Kubernetes內置的標簽功能和特 殊的“ projectcalico.org/policy”屬性【5】設 置基于標簽過濾數據的防火墻訪問規則。這樣就很容易將防火墻規則通過 Pod和Ser vice 描述文件的方式固化 起來,從而免去每次手工配置,達到基礎實施即代碼( Infrastructureas Code )的作用。
小結
任何一 項趨于成熟的技術領域,總是伴隨著生態圈周邊眾多工具的支持。目前,容器技術領域已經形成了圍繞集群編排、服務部署、監控管理等方面的一整套體系。組成這個體系的設施,除了 Docker、R k t、Intel Clear這些核心容器組件,還有包括許多的輔 助工具。它們有些作為獨當一面的系統工具形式存在,例如 Sysdig,有些則主要以其他核心組件的插件形式存在, 例如 Calico。
這篇文章中介紹的兩種容器輔助工具雖然僅僅是這一 龐大生態圈中的 冰山一角,然而它們很好地擴擴展了容器技術在監控和安全方面的能力,在實際生產中的作用不容小覷。
參考資料
【2】準確地說是2015年3月2日發布的0.1.98版本
【3】在比較 特殊的 CoreOS系統中,由于系統目錄是只 讀的,必須使用這種方法運行 Sysdig
【4】 http://www.projectcalico.org/
【5】https://github.com/projectcalico/calico-docker/blob/master/docs/kubernetes/KubernetesPolicy.md
作者簡介
林帆, 生在80后尾巴的IT攻城獅,ThoughtWorks成都辦公室CloudOps小 組成員,平時喜歡在業余時間研究 DevOps相關的應用,目前在備考AWS認證和推廣Docker相關技術。
(責編/周建丁 zhoujd at csdn dot net)