Kubernetes与docker集群管理常见问题解析
很榮幸受邀參加開源中國社區(qū)的高手問答,我是時(shí)速云團(tuán)隊(duì)的后端工程師,負(fù)責(zé)主機(jī)管理功能開發(fā)。在互動(dòng)過程中,發(fā)現(xiàn)大家在使用/調(diào)研kubernetes(簡稱k8s)過程中遇到了很多問題,這里我總結(jié)為幾點(diǎn):
l 如何搭建
l 性能(包括網(wǎng)絡(luò)性能)
l 如何管理容器
l 容器如何對(duì)外提供服務(wù)
l K8s 與docker swarm對(duì)比
下面我們對(duì)這幾個(gè)方面分別說明。
如何搭建
kubernetes項(xiàng)目本身模塊化和功能分離做得很好,優(yōu)點(diǎn)是插件支持度高、 適合多個(gè)模塊多人并行開發(fā),缺點(diǎn)是部署困難。作為一個(gè)分布式系統(tǒng)和我們的特殊國情,部署問題排查更加困難。K8s官方提供了針對(duì)多個(gè)云平臺(tái)(和本地)的多個(gè)部署方案(猛戳這里),包括本地集群(Local Machine)、IaaS(GCE、AWS、AZURE)和許多自定義方式。部署方式優(yōu)缺點(diǎn)對(duì)比參考下表,個(gè)人比較推薦Local (Docker-based)和Docker: Multi-Node。
| 本地集群(Local Machine) ,便于調(diào)試、省錢 | |
| Local (Docker-based) | 優(yōu)點(diǎn):組件都運(yùn)行在容器中,部署方便 缺點(diǎn):gcr.io在墻外,可以替換成index.tenxcloud.com;slave不能通過https方式訪問master |
| Vagrant | 優(yōu)點(diǎn):一鍵部署一個(gè)多節(jié)點(diǎn)集群;Mac用戶的福音 缺點(diǎn):需要裝virtualbox |
| Local (No VM) | 優(yōu)點(diǎn):可以使用自己編譯的etcd等組件,便于本地調(diào)試 缺點(diǎn):依賴多、配置起來有些繁瑣 |
| IaaS(GCE、AWS、AZURE),一鍵部署,爽快 | |
| GCE、AWS、AZURE | 優(yōu)點(diǎn):一鍵部署,可以用于生產(chǎn)環(huán)境 缺點(diǎn):只能用國外的機(jī)器,國內(nèi)不能用;花錢多 |
| 自定義安裝 (為發(fā)騷而生,最符合天朝國情) | |
| 裸機(jī)(適配Linux發(fā)行版)Bare Metal | 優(yōu)點(diǎn):組件定制,可以使用很多高級(jí)功能,可用于生產(chǎn)環(huán)境 缺點(diǎn):配置繁瑣,容易出錯(cuò),樂趣無窮 |
| 容器化 Docker: Multi Node | 優(yōu)點(diǎn):k8s組件均運(yùn)行在容器中,可移植性好 缺點(diǎn):gcr.io在墻外,可以換成index.tenxcloud.com |
性能(包括網(wǎng)絡(luò)性能)
大家比較關(guān)注的性能問題這里分為兩個(gè)方面:調(diào)度性能和網(wǎng)絡(luò)性能。關(guān)于調(diào)度性能,Kubernetes博客上有一篇文章專門講解,這里會(huì)簡單說明一下;關(guān)于網(wǎng)絡(luò)性能,其實(shí)是網(wǎng)絡(luò)插件的性能,關(guān)鍵因子是network overlay-ed or not。
調(diào)度性能
官方給出的數(shù)據(jù)(猛戳鏈接):目前單個(gè)kubernetes集群支持100個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)30個(gè)pod,滿足兩條性能指標(biāo):
a. “API-responsiveness”:99%的API調(diào)用能夠在1秒內(nèi)返回(list, get, update, patch, delete)
b. “Pod startup time”: 99%的pod能夠在5秒內(nèi)啟動(dòng)(鏡像提前下載好)
下面表格展示了集群pod飽和度分別在10%、25%、50%和100%時(shí)pod的啟動(dòng)時(shí)間。
| 10%-full | 25%-full | 50%-full | 100%-full | |
| 50th percentile | 0.90s | 1.08s | 1.33s | 1.94s |
| 90th percentile | 1.29s | 1.49s | 1.72s | 2.50s |
| 99th percentile | 1.59s | 1.86s | 2.56s | 4.32s |
想知道更多,到Kubernetes博客去看,墻略高,翻過去才能看。
網(wǎng)絡(luò)性能
Kubernetes自身不提供集群內(nèi)節(jié)點(diǎn)組網(wǎng)互連的功能,目前有很多插件方案可以實(shí)現(xiàn),最經(jīng)典莫過于etcd/flannel組合,它在vxlan模式下性能也不錯(cuò)。在CNUT大會(huì)上,浙大張磊分享了他的性能測試數(shù)據(jù),這里直接貼出來(PPT鏈接第45頁):
| Qperf test | Flannel UDP | Flannel VxLAN | Weave | Socketplane | Native |
| TCP bandwidth | 28.7 MB/s | 47.8 MB/s | 3.75 MB/s | 42.8 MB/s | 62.5 MB/s |
| TCP latency | 200 μs | 127 μs | 384.4 μs | 110.9 μs | 96.1μs |
這里對(duì)比Flannel(udp和vxlan)、Weave、Socketplane和Native網(wǎng)絡(luò)的性能,由于比較早,沒有考慮calico。Flannel udp和Weave是基于overlay network,性能損失比較大,Flannel vxlan、Socketplane與Native網(wǎng)絡(luò)性能差距不大。Calico是基于iptables和路由實(shí)現(xiàn)的,性能與flannel vxlan應(yīng)該在一個(gè)級(jí)別上。
在網(wǎng)絡(luò)隔離上,calico提供了網(wǎng)絡(luò)隔離,但是docker 1.9開始內(nèi)置網(wǎng)絡(luò)隔離,意味著下一個(gè)支持docker 1.9的kubernetes可能使用docker自帶的隔離,Calico的優(yōu)勢也將不復(fù)存在,flannel仍然是主流。
如何管理容器
Kubernetes提供了命令行和Rest API兩種方式管理容器,分別為
1. 命令行工具 kubectl。windows、linux和MacOS上均可使用該工具,既可以管理本地集群,也可以操作遠(yuǎn)程集群。查看使用方式猛搓這里。
2. Restful API。API目前有多種語言的版本,go語言版本包含在kubernetes代碼包中,由官方維護(hù)。Node.js版本最初由時(shí)速云CEO黃啟功實(shí)現(xiàn)并開源(Github node-kubernetes-client )。其他語言版本的鏈接這里查看。
容器如何對(duì)外提供服務(wù)
在kubernetes集群中創(chuàng)建出的pod是集群內(nèi)可見的,需要從外界訪問的話,可以通過kube-proxy、外部工具(nginx、haproxy等)甚至自己寫一套工具將服務(wù)暴露出來。我們將對(duì)這兩種方式分別說明。
Kube-proxy
在創(chuàng)建rc或pod以后,配置對(duì)應(yīng)的service的ServiceType可以選擇是否暴露應(yīng)用到外網(wǎng)、如何暴露。ServiceType的值可以是下面三種:
- ClusterIP:只使用集群內(nèi)部IP。設(shè)置以后,服務(wù)將無法從外部訪問。
- NodePort:service有一個(gè)集群內(nèi)部IP,同時(shí)也會(huì)把端口暴露到所在宿主機(jī)上。訪問時(shí)既可以通過內(nèi)網(wǎng)ip:port訪問,也可以通過<NodeIP>:NodePort訪問。
- LoadBalancer:service有一個(gè)集群內(nèi)部IP,同時(shí)將其暴露到宿主機(jī)上,而且會(huì)要求云服務(wù)提供商提供一個(gè)負(fù)載均衡器指向<NodeIP>:NodePort。
外部插件(Nginx、Haproxy)
通過修改nginx或haproxy的配置文件,將內(nèi)網(wǎng)中的service暴露到主機(jī)上。
自定義
自己實(shí)現(xiàn)一套路由轉(zhuǎn)發(fā)工具,將service暴露到主機(jī)上
Kubernetes vs docker swarm
很多人問,kubernetes和docker swarm哪個(gè)棒,我可以心懷偏見地告訴你kubernetes綜合實(shí)力最棒。這里不談爹,只說設(shè)計(jì)理念、易用性和對(duì)微服務(wù)的支持。
為了不失偏頗,先說Docker swarm的優(yōu)點(diǎn)。Docker swarm在分布式支持、微服務(wù)的設(shè)計(jì)上借鑒了很多kubernetes的理念和做法,同時(shí)避免了kubernetes的一些問題,在易用性和學(xué)習(xí)曲線上完爆kubernetes。
Docker swarm把集群當(dāng)成一個(gè)超級(jí)機(jī)器,典型特征是對(duì)docker API的自然延伸,尤其便于docker用戶的理解。反過來,kubernetes把集群當(dāng)成一個(gè)可調(diào)度的資源池,在物理層面對(duì)集群、節(jié)點(diǎn)、應(yīng)用三個(gè)級(jí)別分別提供了API,應(yīng)用在軟件層面上抽象成replication controller、service和pod的組合。這種設(shè)計(jì)提供了極大的靈活性和擴(kuò)展性,一方面,使用kubernetes技術(shù)棧即可獲取完整的DevOps體驗(yàn)、無比強(qiáng)大的微服務(wù)支持;另一方面,replication controller、service和pod的解耦,保證了應(yīng)用的可定制化。這種超前的設(shè)計(jì)理念是Docker Swarm很難模仿和追隨的。
應(yīng)用到工業(yè)生產(chǎn)中,如果你喜歡簡單方便,或者技術(shù)人員培養(yǎng)新技術(shù)的成本過高、周期過長,可以使用docker swarm;如果業(yè)務(wù)對(duì)彈性要求比較高,或者規(guī)模比較大,可以選用kubernetes。
最后打一段廣告。時(shí)速云是國內(nèi)領(lǐng)先的容器云平臺(tái)和解決方案提供商,基于以Docker為代表的容器技術(shù),為開發(fā)者和企業(yè)提供應(yīng)用的鏡像構(gòu)建、持續(xù)集成/交付、容器部署、運(yùn)維管理的新一代云服務(wù)平臺(tái)。其中包括標(biāo)準(zhǔn)化、高可用的鏡像構(gòu)建、存儲(chǔ)服務(wù),大規(guī)模、可伸縮的容器托管服務(wù),及自有主機(jī)集群混合云服務(wù)。時(shí)速云致力打造下一代以應(yīng)用為中心的云計(jì)算平臺(tái),幫助客戶優(yōu)化開發(fā)運(yùn)維環(huán)節(jié),;提高業(yè)務(wù)效率,降低IT成本,實(shí)現(xiàn)持續(xù)創(chuàng)新。
本文轉(zhuǎn)自開源中國-Kubernetes與docker集群管理常見問題解析
總結(jié)
以上是生活随笔為你收集整理的Kubernetes与docker集群管理常见问题解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript是如何工作的:事件循
- 下一篇: 聚能聊每周精选 第二十三期