1. 筆記本etcd什麼意思
鍵值存儲倉庫,用於配置共享和服務發現。
擴展知識:etcd(讀作 et-see-dee)是一種開源的分布式統一鍵值存儲,用於分布式系統或計算機集群的共享配置、服務發現和的調度協調。etcd 有助於促進更加安全的自動更新,協調向主機調度的工作,並幫助設置容器的覆蓋網路。
etcd 是許多其他項目的核心組件。最值得注意的是,它是 Kubernetes 的首要數據存儲,也是容器編排的實際標准系統。使用 etcd, 雲原生應用可以保持更為一致的運行時間,而且在個別伺服器發生故障時也能正常工作。應用從 etcd 讀取數據並寫入到其中;通過分散配置數據,為節點配置提供冗餘和彈性。
2. kong網關怎麼獲取etcd埠
etcd簡介與應用場景 etcd 是一個分布式一致性k-v存儲系統,可用於服務注冊發現與...
2.
單機模式運行 默認在centos7的yum源里已集成了etcd包,可以通過yum進行安裝...
3.
集群模式說明 這里的集群模式是指完全集群模式,當然也可以在單機上通過不同的埠,部署偽...
4.
靜態模式 如果只是測試,這里建議使用二進制包進行測試。因為源碼包編譯的,使用etcd命令...
5.
動態配置 靜態配置前提是在搭建集群之前已經提前知道各節點的信息,而實際應用中可能
3. 由於k8s嚴重依賴etcd中的數據,一旦etcd的數據紊亂,可能造成業務故障。這個問題時速雲有解決方案嗎
這個問題,目前還沒有碰到,不過我們會將服務信息同時存放到另外的存儲中,也會對etcd進行備份,這樣在出現故障時也可以很容易恢復或者遷移整個集群。
4. etcd是什麼東西它和ZooKeeper有什麼區別
etcd是一個高可用的鍵值存儲系統,主要用於共享配置和服務發現。etcd是由CoreOS開發並維護的,靈感來自於 ZooKeeper 和 Doozer,它使用Go語言編寫,並通過Raft一致性演算法處理日誌復制以保證強一致性。Raft是一個來自Stanford的新的一致性演算法,適用於分布式系統的日誌復制,Raft通過選舉的方式來實現一致性,在Raft中,任何一個節點都可能成為Leader。Google的容器集群管理系統Kubernetes、開源PaaS平台Cloud Foundry和CoreOS的Fleet都廣泛使用了etcd。
etcd 集群的工作原理基於 raft 共識演算法 (The Raft Consensus Algorithm)。etcd 在 0.5.0 版本中重新實現了 raft 演算法,而非像之前那樣依賴於第三方庫 go-raft 。raft 共識演算法的優點在於可以在高效的解決分布式系統中各個節點日誌內容一致性問題的同時,也使得集群具備一定的容錯能力。即使集群中出現部分節點故障、網路故障等問題,仍可保證其餘大多數節點正確的步進。甚至當更多的節點(一般來說超過集群節點總數的一半)出現故障而導致集群不可用時,依然可以保證節點中的數據不會出現錯誤的結果。
5. 用docker搭建一個高可用可擴展的服務支撐系統怎麼做
一種方案為Haproxy+etcd+confd,採用鬆散式的組織結構,但各個組件之間的通訊是非常嚴密的,且擴展性更強,定製也更加靈活。
一、架構優勢
約定由Haproxy+etcd+confd+Docker構建的基礎服務平台簡稱「HECD」 架構,整合了多種開源組件,看似鬆散的結構,事實上已經是一個有機的整體,它們互相聯系、互相作用,是Docker生態圈中最理想的組合之一,具有以下優勢:
自動、實時發現及無感知服務刷新;
支持任意多台Docker主宿機;
支持多種APP接入且打散至不分主宿機;
採用Etcd存儲信息,集群支持可靠性高;
採用Confd配置引擎,支持各類接入層,如Nginx;
支持負載均衡、故障遷移;
具備資源彈性,伸縮自如(通過生成、銷毀容器實現);
在HECD架構中,首先管理員操作Docker Client,除了提交容器(Container)啟動與停止指令外,還通過REST-API方式向Etcd(K/V)存儲組件注冊容器信息,包括容器名稱、主宿機IP、映射埠等。Confd配置組件會定時查詢Etcd組件獲取最新的容器信息,根據定義好的配置模板生成Haproxy配置文件Haproxy.cfg,並且自動reload haproxy服務。用戶在訪問業務服務時,完全沒有感知後端APP的上線、下線、切換及遷移,達到了自動發現、高可用的目的。詳細架構圖見圖1-1。
圖1-1 平台架構圖
為了方便大家理解各組件間的關系,通過圖1-2進行架構流程梳理,首先管理員通過Shell或API操作容器,下一步將容器信息注冊到Etcd組件,Confd組件會定時查詢Etcd,獲取已經注冊到Etcd中容器信息,最後通過Confd的模板引擎生成Haproxy配置,整個流程結束。
圖1-2架構流程圖
了解架構流程後,我們逐一對流程中各組件進行詳細介紹。
1、Etcd介紹
Etcd是一個高可用的 Key/Value 存儲系統,主要用於分享配置和服務發現。
簡單:支持 curl 方式的用戶 API (HTTP+JSON)
安全:可選 SSL 客戶端證書認證
快速:單實例可達每秒 1000 次寫操作
可靠:使用 Raft 實現分布式
2、Confd介紹
Confd是一個輕量級的配置管理工具。通過查詢Etcd,結合配置模板引擎,保持本地配置最新,同時具備定期探測機制,配置變更自動reload。
3、Haproxy介紹
HAProxy是提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。(來源網路)
三、架構部署
平台環境基於Centos6.5+Docker1.2構建,其中Etcd的版本為etcd version 0.5.0-alpha,Confd版本為confd 0.6.2,Haproxy版本為HA-Proxy version 1.4.24。下面對平台的運行環境、安裝部署、組件說明等進行詳細說明,環境設備角色表如下:
1、組件安裝
1.1 Docker安裝
SSH終端登錄192.168.1.22伺服器,執行以下命令:
1.2 Haproxy、confd安裝
SSH終端登錄192.168.1.20伺服器,執行以下命令:
1.3 Etcd安裝
SSH終端登錄192.168.1.21伺服器,執行以下命令:
2.1 Etcd配置
由於etcd是一個輕量級的K/V存儲平台,啟動時指定相關參數即可,無需配置。
由於etcd是通過REST-API方式進行交互,常見操作如下:
1) 設置(set) key操作
3) 刪除key信息
2.2 Confd+Haproxy配置
由於Haproxy的配置文件是由Confd組件生成,要求Confd務必要與haproxy安裝在同一台主機上,Confd的配置有兩種,一種為Confd資源配置文件,默認路徑為「/etc/confd/conf.d」目錄,另一種為配置模板文件,默認路徑為「/etc/confd/templates」。具體配置如下:
創建配置文件目錄
詳細見以下配置文件,其中「src」為指定模板文件名稱(默認到路徑/etc/confd/templates中查找);「dest」指定生成的Haproxy配置文件路徑;「keys」指定關聯Etcd中key的URI列表;「reload_cmd」指定服務重載的命令,本例中配置成haproxy的reload命令。
【/etc/confd/conf.d/ haproxy.toml】
Confd模板引擎採用了Go語言的文本模板,更多見http://golang.org/pkg/text/template/,具備簡單的邏輯語法,包括循環體、處理函數等,本示例的模板文件如下,通過range循環輸出Key及Value信息。
【/etc/confd/templates/haproxy.cfg.tmpl】
本小節詳細說明Confd模板引擎基礎語法與示例,下面為示例用到的KEY信息。
作為path.Base函數的別名,獲取路徑最後一段。
{{ with get "/app/servers/prickly_blackwell"}}
server {{base .Key}} {{.Value}} check
{{end}}
2、get
返回一對匹配的KV,找不到則返回錯誤。
{{with get "/app/servers/prickly_blackwell"}}
key: {{.Key}}
value: {{.Value}}
{{end}}
{{range gets "/app/servers/*"}}
{{.Key}} {{.Value}}
{{end}}
返回一個匹配key的字元串型Value,找不到則返回錯誤。
{{getv "/app/servers/cocky_morse"}}
返回所有匹配key的字元串型Value,找不到則返回錯誤。
{{range getvs "/app/servers/*"}}
value: {{.}}
{{end}}
對輸入的字元串做split處理,即將字元串按指定分隔符拆分成數組。
{{ $url := split (getv "/app/servers/cocky_morse") ":" }}
host: {{index $url 0}}
port: {{index $url 1}}
返回所有的字元串型子key,找不到則返回錯誤。
{{range ls "/app/servers/"}}
subkey: {{.}}
{{end}}
返回所有的字元串型子目錄,找不到則返回一個空列表。
{{range lsdir "/app/"}}
subdir: {{.}}
{{end}}
下面為啟動Confd服務命令行,參數「interval」為指定探測etcd的頻率,單位為秒,參數「-node」為指定etcd監聽服務主地址,以便獲取容器信息。
6. 如何查看kubernetes的更新信息
我們先從整體上看一下Kubernetes的一些理念和基本架構,然後從網路、資源管理、存儲、服務發現、負載均衡、高可用、rollingupgrade、安全、監控等方面向大家簡單介紹Kubernetes的這些主要特性。當然也會包括一些需要注意的問題。主要目的是幫助大家快速理解Kubernetes的主要功能,今後在研究和使用這個具的時候有所參考和幫助。1.Kubernetes的一些理念:用戶不需要關心需要多少台機器,只需要關心軟體(服務)運行所需的環境。以服務為中心,你需要關心的是api,如何把大服務拆分成小服務,如何使用api去整合它們。保證系統總是按照用戶指定的狀態去運行。不僅僅提給你供容器服務,同樣提供一種軟體系統升級的方式;在保持HA的前提下去升級系統是很多用戶最想要的功能,也是最難實現的。那些需要擔心和不需要擔心的事情。更好的支持微服務理念,劃分、細分服務之間的邊界,比如lablel、pod等概念的引入。對於Kubernetes的架構,可以參考官方文檔。大致由一些主要組件構成,包括Master節點上的kube-apiserver、kube-scheler、kube-controller-manager、控制組件kubectl、狀態存儲etcd、Slave節點上的kubelet、kube-proxy,以及底層的網路支持(可以用Flannel、OpenVSwitch、Weave等)。看上去也是微服務的架構設計,不過目前還不能很好支持單個服務的橫向伸縮,但這個會在Kubernetes的未來版本中解決。2.Kubernetes的主要特性會從網路、服務發現、負載均衡、資源管理、高可用、存儲、安全、監控等方面向大家簡單介紹Kubernetes的這些主要特性->由於時間有限,只能簡單一些了。另外,對於服務發現、高可用和監控的一些更詳細的介紹,感興趣的朋友可以通過這篇文章了解。1)網路Kubernetes的網路方式主要解決以下幾個問題:a.緊耦合的容器之間通信,通過Pod和localhost訪問解決。b.Pod之間通信,建立通信子網,比如隧道、路由,Flannel、OpenvSwitch、Weave。c.Pod和Service,以及外部系統和Service的通信,引入Service解決。Kubernetes的網路會給每個Pod分配一個IP地址,不需要在Pod之間建立鏈接,也基本不需要去處理容器和主機之間的埠映射。注意:Pod重建後,IP會被重新分配,所以內網通信不要依賴PodIP;通過Service環境變數或者DNS解決。2)服務發現及負載均衡kube-proxy和DNS,在v1之前,Service含有欄位portalip和publicIPs,分別指定了服務的虛擬ip和服務的出口機ip,publicIPs可任意指定成集群中任意包含kube-proxy的節點,可多個。portalIp通過NAT的方式跳轉到container的內網地址。在v1版本中,publicIPS被約定廢除,標記為deprecatedPublicIPs,僅用作向後兼容,portalIp也改為ClusterIp,而在serviceport定義列表裡,增加了nodePort項,即對應node上映射的服務埠。DNS服務以addon的方式,需要安裝skydns和kube2dns。kube2dns會通過讀取KubernetesAPI獲取服務的clusterIP和port信息,同時以watch的方式檢查service的變動,及時收集變動信息,並將對於的ip信息提交給etcd存檔,而skydns通過etcd內的DNS記錄信息,開啟53埠對外提供服務。大概的DNS的域名記錄是servicename.namespace.tenx.domain,「tenx.domain」是提前設置的主域名。注意:kube-proxy在集群規模較大以後,可能會有訪問的性能問題,可以考慮用其他方式替換,比如HAProxy,直接導流到Service的endpints或者Pods上。Kubernetes官方也在修復這個問題。3)資源管理有3個層次的資源限制方式,分別在Container、Pod、Namespace層次。Container層次主要利用容器本身的支持,比如Docker對CPU、內存、磁碟、網路等的支持;Pod方面可以限制系統內創建Pod的資源范圍,比如最大或者最小的CPU、memory需求;Namespace層次就是對用戶級別的資源限額了,包括CPU、內存,還可以限定Pod、rc、service的數量。資源管理模型-》簡單、通用、准確,並可擴展目前的資源分配計算也相對簡單,沒有什麼資源搶占之類的強大功能,通過每個節點上的資源總量、以及已經使用的各種資源加權和,來計算某個Pod優先非配到哪些節點,還沒有加入對節點實際可用資源的評估,需要自己的schelerplugin來支持。其實kubelet已經可以拿到節點的資源,只要進行收集計算即可,相信Kubernetes的後續版本會有支持。4)高可用主要是指Master節點的HA方式官方推薦利用etcd實現master選舉,從多個Master中得到一個kube-apiserver保證至少有一個master可用,實現highavailability。對外以loadbalancer的方式提供入口。這種方式可以用作ha,但仍未成熟,據了解,未來會更新升級ha的功能。一張圖幫助大家理解:也就是在etcd集群背景下,存在多個kube-apiserver,並用pod-master保證僅是主master可用。同時kube-sheller和kube-controller-manager也存在多個,而且伴隨著kube-apiserver同一時間只能有一套運行。5)rollingupgradeRC在開始的設計就是讓rollingupgrade變的更容易,通過一個一個替換Pod來更新service,實現服務中斷時間的最小化。基本思路是創建一個復本為1的新的rc,並逐步減少老的rc的復本、增加新的rc的復本,在老的rc數量為0時將其刪除。通過kubectl提供,可以指定更新的鏡像、替換pod的時間間隔,也可以rollback當前正在執行的upgrade操作。同樣,Kuberntes也支持多版本同時部署,並通過lable來進行區分,在service不變的情況下,調整支撐服務的Pod,測試、監控新Pod的工作情況。6)存儲大家都知道容器本身一般不會對數據進行持久化處理,在Kubernetes中,容器異常退出,kubelet也只是簡單的基於原有鏡像重啟一個新的容器。另外,如果我們在同一個Pod中運行多個容器,經常會需要在這些容器之間進行共享一些數據。Kuberenetes的Volume就是主要來解決上面兩個基礎問題的。Docker也有Volume的概念,但是相對簡單,而且目前的支持很有限,Kubernetes對Volume則有著清晰定義和廣泛的支持。其中最核心的理念:Volume只是一個目錄,並可以被在同一個Pod中的所有容器訪問。而這個目錄會是什麼樣,後端用什麼介質和裡面的內容則由使用的特定Volume類型決定。創建一個帶Volume的Pod:spec.volumes指定這個Pod需要的volume信息spec.containers.volumeMounts指定哪些container需要用到這個VolumeKubernetes對Volume的支持非常廣泛,有很多貢獻者為其添加不同的存儲支持,也反映出Kubernetes社區的活躍程度。emptyDir隨Pod刪除,適用於臨時存儲、災難恢復、共享運行時數據,支持RAM-backedfilesystemhostPath類似於Docker的本地Volume用於訪問一些本地資源(比如本地Docker)。gcePersistentDiskGCEdisk-只有在GoogleCloudEngine平台上可用。awsElasticBlockStore類似於GCEdisk節點必須是AWSEC2的實例nfs-支持網路文件系統。rbd-RadosBlockDevice-Cephsecret用來通過KubernetesAPI向Pod傳遞敏感信息,使用tmpfs(aRAM-backedfilesystem)persistentVolumeClaim-從抽象的PV中申請資源,而無需關心存儲的提供方glusterfsiscsigitRepo根據自己的需求選擇合適的存儲類型,反正支持的夠多,總用一款適合的:)7)安全一些主要原則:基礎設施模塊應該通過APIserver交換數據、修改系統狀態,而且只有APIserver可以訪問後端存儲(etcd)。把用戶分為不同的角色:Developers/ProjectAdmins/Administrators。允許Developers定義secrets對象,並在pod啟動時關聯到相關容器。以secret為例,如果kubelet要去pull私有鏡像,那麼Kubernetes支持以下方式:通過dockerlogin生成.dockercfg文件,進行全局授權。通過在每個namespace上創建用戶的secret對象,在創建Pod時指定imagePullSecrets屬性(也可以統一設置在serviceAcouunt上),進行授權。認證(Authentication)APIserver支持證書、token、和基本信息三種認證方式。授權(Authorization)通過apiserver的安全埠,authorization會應用到所有http的請求上AlwaysDeny、AlwaysAllow、ABAC三種模式,其他需求可以自己實現Authorizer介面。8)監控比較老的版本Kubernetes需要外接cadvisor主要功能是將node主機的containermetrics抓取出來。在較新的版本里,cadvior功能被集成到了kubelet組件中,kubelet在與docker交互的同時,對外提供監控服務。Kubernetes集群范圍內的監控主要由kubelet、heapster和storagebackend(如influxdb)構建。Heapster可以在集群范圍獲取metrics和事件數據。它可以以pod的方式運行在k8s平台里,也可以單獨運行以standalone的方式。注意:heapster目前未到1.0版本,對於小規模的集群監控比較方便。但對於較大規模的集群,heapster目前的cache方式會吃掉大量內存。因為要定時獲取整個集群的容器信息,信息在內存的臨時存儲成為問題,再加上heaspter要支持api獲取臨時metrics,如果將heapster以pod方式運行,很容易出現OOM。所以目前建議關掉cache並以standalone的方式獨立出k8s平台。
7. yum安裝etcd的日誌在哪個目錄下
都放在/var/cache/yum下了。如果沒有的話就用命令find / -name xxx(xxx是包的名字)就可以找到了
8. etcd是什麼東西它和ZooKeeper有什麼區別
etcd是一個高可用的鍵值存儲系統,主要用於共享配置和服務發現。
etcd是由CoreOS開發並維護的,靈感來自於 Zo好eeper 和 Doozer,它使用Go語言編寫,並通過Raft一致性演算法處理日誌復制以保證強一致性。
Raft是一個來自Stanford的新的一致性演算法,適用於分布式系統的日誌復制,Raft通過選舉的方式來實現一致性,在Raft中,任何一個節點都可能成為Leader。
Google的容器集群管理系統Kubernetes、開源PaaS平台Cloud Foundry和CoreOS的Fleet都廣泛使用了etcd。
etcd 集群的工作原理基於 raft 共識演算法 (The Raft Consensus Algorithm)。
etcd 在 0.5.0 版本中重新實現了 raft 演算法,而非像之前那樣依賴於第三方庫 go-raft 。
raft 共識演算法的優點在於可以在高效的解決分布式系統中各個節點日誌內容一致性問題的同時,也使得集群具備一定的容錯能力。
即使集群中出現部分節點故障、網路故障等問題,仍可保證其餘大多數節點正確的步進。
甚至當更多的節點(一般來說超過集群節點總數的一半)出現故障而導致集群不可用時,依然可以保證節點中的數據不會出現錯誤的結果。
9. 怎麼在ubuntu上安裝kubernetes
1.部署環境:
(1) Ubuntu 14.04 (2台裝有該版本的筆記本電腦)
(2) Docker 1.9.1
(3) etcd-2.2.5
(4) Kubernetes 0.9.0
2.配置Ubuntu 14.04
(1) 由於只有兩台主機,所以這里一台主機既充當Master又充當minions:
Master(mininos): 192.168.1.101
Mininos: 192.168.1.100
(2) 創建/opt/bin文件夾,後面安裝會用:sudo mkdir -p /opt/bin
3.在Master主機上安裝etcd-2.2.5
(1)下載: https://github.com/coreos/etcd/releases/download/v2.2.5/etcd-v2.2.5-linux-amd64.tar.gz
(2) 解壓文件: tar -zxvf etcd-v2.2.5-linux-amd64.tar.gz
(3)復制etcd到/opt/bin文件夾中: cp etcd-v2.2.5-linux-amd64/etcd /opt/bin/
4.在Master主機中安裝Kubernetes 0.9.0(假設安裝目錄為/home/docker/Downloads)
(1) 下載:https://github.com/kubernetes/kubernetes/releases/download/v0.9.0/kubernetes.tar.gz
(2) 解壓kubernetes.tar.gz文件: tar -zxvf /home/docker/Downloads/kubernetes.tar.gz
(3) 進入kubernetes/server目錄下: cd /home/docker/Downloads/kubernetes/server
(4) 解壓kubernetes-server-linux-amd64.tar.gz文件得到kubernetes:tar -zxvf /home/docker/Downloads/kubernetes-server-linux-amd64.tar.gz
(5)進入kubernetes/server/bin/目錄下:cd /home/docker/Downloads/kubernetes/server/kubernetes/server/bin/
(6)復制該目錄下所有的文件到/opt/bin/目錄下: sudo cp * /opt/bin/
(7)進入到/home/docker/Downloads/kubernetes/cluster/ubuntu目錄下: cd /home/docker/Downloads/kubernetes/cluster/ubuntu
(8)執行./util.sh腳本: sudo ./util.sh(該腳本檢測/opt/bin/下的相關文件,自動安裝kubernetes)
(9)安裝完成後可以發現到/etc/default/,/etc/init/,/etc/init.d/目錄下多了etcd和kubernetes相關的配置文件和啟動文件
5.在Minions上安裝kubernetes:(Mininos上不用安裝etcd)
在Minions上只需要安裝kubelet,kube-proxy即可.安裝方法與Master上的安裝步驟一樣,只是安裝完成後將/etc/default,/etc/init/,/etc/init.d/文件夾下的與kube-apiserver,kube-controller-manager,kube-scheler相關的文件刪除即可.
6.etcd配置:
(1)修改/etc/default/etcd:
# Etcd Upstart and SysVinit configuration file
# Customize etcd location
# ETCD="/opt/bin/etcd"
# Use ETCD_OPTS to modify the start/restart options
ETCD_OPTS="-listen-client-urls=http://192.168.1.101:4001"
# Add more envionrment settings used by etcd here
(2)刪除/etc/init/etcd.conf與/etc/init.d/etcd
7.kubernetes相關配置:
(1).Master節點:
/etc/default/kube-apiserver
# Kube-Apiserver Upstart and SysVinit configuration file
# Customize kube-apiserver binary location
# KUBE_APISERVER="/opt/bin/kube-apiserver"
# Use KUBE_APISERVER_OPTS to modify the start/restart options
KUBE_APISERVER_OPTS="--address=127.0.0.1 \
--port=8080 \
--etcd_servers=http://192.168.1.101:4001 \
--logtostderr=true \
--portal_net=11.1.1.0/24"
# Add more envionrment settings used by kube-apiserver here
/etc/default/ kube-controller-manager
# Kube-Controller-Manager Upstart and SysVinit configuration file
# Customize kube-controller-manager binary location
# KUBE_CONTROLLER_MANAGER="/opt/bin/kube-controller-manager"
# Use KUBE_CONTROLLER_MANAGER_OPTS to modify the start/restart options
KUBE_CONTROLLER_MANAGER_OPTS="--master=127.0.0.1:8080 \
--machines=127.0.0.1,192.168.1.100 \
--logtostderr=true"
# Add more envionrment settings used by kube-controller-manager here
/etc/default/kubelet
# Kubelet Upstart and SysVinit configuration file
# Customize kubelet binary location
# KUBELET="/opt/bin/kubelet"
# Use KUBELET_OPTS to modify the start/restart options
KUBELET_OPTS="--address=127.0.0.1 \
--port=10250 \
--hostname_override=127.0.0.1 \
--etcd_servers=http://192.168.1.101:4001 \
--logtostderr=true"
# Add more envionrment settings used by kube-scheler here
/etc/default/kube-proxy
# Kube-Proxy Upstart and SysVinit configuration file
# Customize kube-proxy binary location
# KUBE_PROXY="/opt/bin/kube-proxy"
# Use KUBE_PROXY_OPTS to modify the start/restart options
KUBE_PROXY_OPTS="--etcd_servers=http://192.168.1.101:4001 \
--logtostderr=true"<pre name="code" class="plain">
# Add more envionrment settings used by kube-apiserver here
/etc/default/kube-scheler
# Kube-Scheler Upstart and SysVinit configuration file
# Customize kube-apiserver binary location
# KUBE_SCHEDULER="/opt/bin/kube-apiserver"
# Use KUBE_SCHEDULER_OPTS to modify the start/restart options
KUBE_SCHEDULER_OPTS="--logtostderr=true \
--master=127.0.0.1:8080"
# Add more envionrment settings used by kube-scheler here
(2)Minions節點
/etc/default/kubelet
# Kubelet Upstart and SysVinit configuration file
# Customize kubelet binary location
# KUBELET="/opt/bin/kubelet"
# Use KUBELET_OPTS to modify the start/restart options
KUBELET_OPTS="--address=0.0.0.0 \
--port=10250 \
--hostname_override=192.168.1.100 \
--etcd_servers=http://192.168.1.101:4001 \
--logtostderr=true"
# Add more envionrment settings used by kube-scheler here
/etc/default/kube-proxy
# Kube-Proxy Upstart and SysVinit configuration file
# Customize kube-proxy binary location
# KUBE_PROXY="/opt/bin/kube-proxy"
# Use KUBE_PROXY_OPTS to modify the start/restart options
KUBE_PROXY_OPTS="--etcd_servers=http://192.168.1.101:4001 \
--logtostderr=true"
# Add more envionrment settings used by kube-apiserver here
8.啟動相關服務
Master 節點:
(1).啟動docker服務
sudo service docker start
(2).啟動etcd服務
sudo etcd -name etcdserver -peer-addr 192.168.1.101:7001 -addr 192.168.1.101:4001 -data-dir /data/etcd -peer-bind-addr 0.0.0.0:7001 -bind-addr 0.0.0.0:4001 &
(3)啟動kubernetes相關服務
sudo service kube-apiserver start
sudo service kube-controller-manager start
sudo service kubelet start
sudo service kube-proxy start
sudo service kube-scheler start
Minions節點:
啟動kuberbetes相關服務
sudo service kubelet start
sudo service kube-proxy start
9.打開相關埠
Master節點: 打開4001,7001埠
iptables -I INPUT -s 192.168.43.0/24 -p tcp --dport 4001 -j ACCEPT
iptables -I INPUT -s 192.168.43.0/24 -p tcp --dport 7001 -j ACCEPT
Minions節點:打開10250埠
iptables -I INPUT -s 192.168.43.0/24 -p tcp --dport 10250 -j ACCEPT
10. kubernetes 如何獲取dashboard cpu使用率是怎麼計算的
我們先從整體上看一下Kubernetes的一些理念和基本架構, 然後從網路、 資源管理、存儲、服務發現、負載均衡、高可用、rolling upgrade、安全、監控等方面向大家簡單介紹Kubernetes的這些主要特性。
當然也會包括一些需要注意的問題。主要目的是幫助大家快速理解 Kubernetes的主要功能,今後在研究和使用這個具的時候有所參考和幫助。
1.Kubernetes的一些理念:
用戶不需要關心需要多少台機器,只需要關心軟體(服務)運行所需的環境。以服務為中心,你需要關心的是api,如何把大服務拆分成小服務,如何使用api去整合它們。
保證系統總是按照用戶指定的狀態去運行。
不僅僅提給你供容器服務,同樣提供一種軟體系統升級的方式;在保持HA的前提下去升級系統是很多用戶最想要的功能,也是最難實現的。
那些需要擔心和不需要擔心的事情。
更好的支持微服務理念,劃分、細分服務之間的邊界,比如lablel、pod等概念的引入。
對於Kubernetes的架構,可以參考官方文檔。
大致由一些主要組件構成,包括Master節點上的kube-apiserver、kube-scheler、kube-controller-manager、控制組件kubectl、狀態存儲etcd、Slave節點上的kubelet、kube-proxy,以及底層的網路支持(可以用Flannel、OpenVSwitch、Weave等)。
看上去也是微服務的架構設計,不過目前還不能很好支持單個服務的橫向伸縮,但這個會在 Kubernetes 的未來版本中解決。
2.Kubernetes的主要特性
會從網路、服務發現、負載均衡、資源管理、高可用、存儲、安全、監控等方面向大家簡單介紹Kubernetes的這些主要特性 -> 由於時間有限,只能簡單一些了。
另外,對於服務發現、高可用和監控的一些更詳細的介紹,感興趣的朋友可以通過這篇文章了解。
1)網路
Kubernetes的網路方式主要解決以下幾個問題:
a. 緊耦合的容器之間通信,通過 Pod 和 localhost 訪問解決。
b. Pod之間通信,建立通信子網,比如隧道、路由,Flannel、Open vSwitch、Weave。
c. Pod和Service,以及外部系統和Service的通信,引入Service解決。
Kubernetes的網路會給每個Pod分配一個IP地址,不需要在Pod之間建立鏈接,也基本不需要去處理容器和主機之間的埠映射。
注意:Pod重建後,IP會被重新分配,所以內網通信不要依賴Pod IP;通過Service環境變數或者DNS解決。
2) 服務發現及負載均衡
kube-proxy和DNS, 在v1之前,Service含有欄位portalip 和publicIPs, 分別指定了服務的虛擬ip和服務的出口機ip,publicIPs可任意指定成集群中任意包含kube-proxy的節點,可多個。portalIp 通過NAT的方式跳轉到container的內網地址。在v1版本中,publicIPS被約定廢除,標記為deprecatedPublicIPs,僅用作向後兼容,portalIp也改為ClusterIp, 而在service port 定義列表裡,增加了nodePort項,即對應node上映射的服務埠。
DNS服務以addon的方式,需要安裝skydns和kube2dns。kube2dns會通過讀取Kubernetes API獲取服務的clusterIP和port信息,同時以watch的方式檢查service的變動,及時收集變動信息,並將對於的ip信息提交給etcd存檔,而skydns通過etcd內的DNS記錄信息,開啟53埠對外提供服務。大概的DNS的域名記錄是servicename.namespace.tenx.domain, 「tenx.domain」是提前設置的主域名。
注意:kube-proxy 在集群規模較大以後,可能會有訪問的性能問題,可以考慮用其他方式替換,比如HAProxy,直接導流到Service 的endpints 或者 Pods上。Kubernetes官方也在修復這個問題。
3)資源管理
有3 個層次的資源限制方式,分別在Container、Pod、Namespace 層次。Container層次主要利用容器本身的支持,比如Docker 對CPU、內存、磁碟、網路等的支持;Pod方面可以限制系統內創建Pod的資源范圍,比如最大或者最小的CPU、memory需求;Namespace層次就是對用戶級別的資源限額了,包括CPU、內存,還可以限定Pod、rc、service的數量。
資源管理模型 -》 簡單、通用、准確,並可擴展
目前的資源分配計算也相對簡單,沒有什麼資源搶占之類的強大功能,通過每個節點上的資源總量、以及已經使用的各種資源加權和,來計算某個Pod優先非配到哪些節點,還沒有加入對節點實際可用資源的評估,需要自己的scheler plugin來支持。其實kubelet已經可以拿到節點的資源,只要進行收集計算即可,相信Kubernetes的後續版本會有支持。
4)高可用
主要是指Master節點的 HA方式 官方推薦 利用etcd實現master 選舉,從多個Master中得到一個kube-apiserver 保證至少有一個master可用,實現high availability。對外以loadbalancer的方式提供入口。這種方式可以用作ha,但仍未成熟,據了解,未來會更新升級ha的功能。
一張圖幫助大家理解:
也就是在etcd集群背景下,存在多個kube-apiserver,並用pod-master保證僅是主master可用。同時kube-sheller和kube-controller-manager也存在多個,而且伴隨著kube-apiserver 同一時間只能有一套運行。
5) rolling upgrade
RC 在開始的設計就是讓rolling upgrade變的更容易,通過一個一個替換Pod來更新service,實現服務中斷時間的最小化。基本思路是創建一個復本為1的新的rc,並逐步減少老的rc的復本、增加新的rc的復本,在老的rc數量為0時將其刪除。
通過kubectl提供,可以指定更新的鏡像、替換pod的時間間隔,也可以rollback 當前正在執行的upgrade操作。
同樣, Kuberntes也支持多版本同時部署,並通過lable來進行區分,在service不變的情況下,調整支撐服務的Pod,測試、監控新Pod的工作情況。
6)存儲
大家都知道容器本身一般不會對數據進行持久化處理,在Kubernetes中,容器異常退出,kubelet也只是簡單的基於原有鏡像重啟一個新的容器。另外,如果我們在同一個Pod中運行多個容器,經常會需要在這些容器之間進行共享一些數據。Kuberenetes 的 Volume就是主要來解決上面兩個基礎問題的。
Docker 也有Volume的概念,但是相對簡單,而且目前的支持很有限,Kubernetes對Volume則有著清晰定義和廣泛的支持。其中最核心的理念:Volume只是一個目錄,並可以被在同一個Pod中的所有容器訪問。而這個目錄會是什麼樣,後端用什麼介質和裡面的內容則由使用的特定Volume類型決定。
創建一個帶Volume的Pod:
spec.volumes 指定這個Pod需要的volume信息 spec.containers.volumeMounts 指定哪些container需要用到這個Volume Kubernetes對Volume的支持非常廣泛,有很多貢獻者為其添加不同的存儲支持,也反映出Kubernetes社區的活躍程度。
emptyDir 隨Pod刪除,適用於臨時存儲、災難恢復、共享運行時數據,支持 RAM-backed filesystemhostPath 類似於Docker的本地Volume 用於訪問一些本地資源(比如本地Docker)。
gcePersistentDisk GCE disk - 只有在 Google Cloud Engine 平台上可用。
awsElasticBlockStore 類似於GCE disk 節點必須是 AWS EC2的實例 nfs - 支持網路文件系統。
rbd - Rados Block Device - Ceph
secret 用來通過Kubernetes API 向Pod 傳遞敏感信息,使用 tmpfs (a RAM-backed filesystem)
persistentVolumeClaim - 從抽象的PV中申請資源,而無需關心存儲的提供方
glusterfs
iscsi
gitRepo
根據自己的需求選擇合適的存儲類型,反正支持的夠多,總用一款適合的 :)
7)安全
一些主要原則:
基礎設施模塊應該通過API server交換數據、修改系統狀態,而且只有API server可以訪問後端存儲(etcd)。
把用戶分為不同的角色:Developers/Project Admins/Administrators。
允許Developers定義secrets 對象,並在pod啟動時關聯到相關容器。
以secret 為例,如果kubelet要去pull 私有鏡像,那麼Kubernetes支持以下方式:
通過docker login 生成 .dockercfg 文件,進行全局授權。
通過在每個namespace上創建用戶的secret對象,在創建Pod時指定 imagePullSecrets 屬性(也可以統一設置在serviceAcouunt 上),進行授權。
認證 (Authentication)
API server 支持證書、token、和基本信息三種認證方式。
授權 (Authorization)
通過apiserver的安全埠,authorization會應用到所有http的請求上
AlwaysDeny、AlwaysAllow、ABAC三種模式,其他需求可以自己實現Authorizer介面。
8)監控
比較老的版本Kubernetes需要外接cadvisor主要功能是將node主機的container metrics抓取出來。在較新的版本里,cadvior功能被集成到了kubelet組件中,kubelet在與docker交互的同時,對外提供監控服務。
Kubernetes集群范圍內的監控主要由kubelet、heapster和storage backend(如influxdb)構建。Heapster可以在集群范圍獲取metrics和事件數據。它可以以pod的方式運行在k8s平台里,也可以單獨運行以standalone的方式。
注意: heapster目前未到1.0版本,對於小規模的集群監控比較方便。但對於較大規模的集群,heapster目前的cache方式會吃掉大量內存。因為要定時獲取整個集群的容器信息,信息在內存的臨時存儲成為問題,再加上heaspter要支持api獲取臨時metrics,如果將heapster以pod方式運行,很容易出現OOM。所以目前建議關掉cache並以standalone的方式獨立出k8s平台。