天天看點

Kubernetes – Google分布式容器技術初體驗Kubernetes – Google分布式容器技術初體驗

服務的配置管理。包括服務發現、負載均衡及服務依賴管理。 服務之間的排程及生命周期管理。

由于kubernetes包含了上述部分特性,加上最近google新推出的container engine也是基于kubernetes基礎上實作,是以最近對kubernetes進行了一些嘗試與體驗。

Kubernetes – Google分布式容器技術初體驗Kubernetes – Google分布式容器技術初體驗

<a target="_blank"></a>

kubernetes設計上并未綁定google cloud平台,但由于以上原因,為了減少不必要的障礙,初次嘗試建議使用gce作為運作環境(盡管gce是一個需要收費的環境)。預設的cluster啟動腳本會建立5個gce instance,測試完需要自己及時主動删除。為了避免浪費,可以将minions減少,同時instance類型選擇f1-micro。費用方面一個f1-micro instance運作1個月大約50元人民币,是以用gce來測試kubernetes,如果僅是測試時候開啟的話,并不會産生太多費用。

kubernetes的基本單元是pods,用來定義一組相關的container。kubernetes的優點是可以通過定義一個replicationcontroller來将同一個子產品部署到任意多個容器中,并且由kubernetes自動管理。比如定義了一個apache pod,通過replicationcontroller設定啟動100個replicas,系統就會在pod建立後自動在所有可用的minions中啟動100個apache container。并且輕松的是,當container或者是所在的伺服器不可用時,kubernetes會自動通過啟動新的container來保持100個總數不變,這樣管理一個大型系統變得輕松和簡單。

Kubernetes – Google分布式容器技術初體驗Kubernetes – Google分布式容器技術初體驗

kubernetes

在解決部署問題之後,分布式服務中存在的一大難題是服務發現(或者叫尋址),使用者通路的前端子產品需要通路系統内部的後端資源或者其他各種内部的服務,當一個内部服務通過replicationcontroller動态部署到不同的節點後,而且還存在前文提到的動态切換的功能,前端應用如何來發現并通路這些服務?kubernetes的另外一個亮點功能就是service,service是一個pod服務池的代理抽象,目前的實作方法是通過一個固定的虛拟ip及端口來定義,并且通過分布在所有節點上的proxy來實作内部服務對service的通路。

盡管沒有耦合etcd,部署在kubernetes中的服務需要通過container中的環境變量來獲得service的位址。環境變量雖然簡單,但它也存在很多弊端,如存在不友善動态更改等問題。另外service目前的實作是将虛拟ip通過iptables重定向到最終的pod上,作者也提到iptables定向的局限性,不适合作為大型服務的實作。

Kubernetes – Google分布式容器技術初體驗Kubernetes – Google分布式容器技術初體驗

services overview

總的看來kubernetes提供的能力非常令人激動,pod、replicationcontroller以及service的設計非常簡單實用。但如果立即将服務遷移到kubernetes,還需要面對易變的環境。另外一方面盡管kubernetes提供health check的機制,但service生産環境所需的苛刻的可用性還未得到充分的驗證。

kubernetes cluster簡單安裝說明如下,需要嘗試的朋友可參考。

一個64bit linux環境,最好在牆外的,避免通路google cloud出現逾時或reset等問題;另外建立google cloud帳号,確定建立instances以及cloud storage功能可用;

1. 安裝go語言環境(可選,如果需要編譯代碼則需要)

2. 安裝google cloud sdk

$ curl https://sdk.cloud.google.com | bash

$ gcloud auth login

按提示完成授權及登入

3. 安裝 etcd 二進制版本(v0.4.6), 解壓後将其目錄加入path

4. 安裝 kubernetes最新的relase binary版本(v0.5.1)

修改 cluster/gce/config-default.sh,主要是修改以下字段以便節約資源。

master_size=f1-micro

minion_size=f1-micro

num_minions=3

在kubernetes目錄運作

$ cluster/kube-up.sh

執行成功後會顯示 done

5. 測試pod

以上腳本啟動了examples/monitoring 下面定義的service,如果嘗試啟動其它自己的pods,比如啟動一個tomcat叢集

{

"id": "tomcatcontroller",

"kind": "replicationcontroller",

"apiversion": "v1beta1",

"desiredstate": {

"replicas": 2,

"replicaselector":{"name": "tomcatcluster"},

"podtemplate":{

"manifest": {

"version": "v1beta1",

"id": "tomcat",

"containers": [{

"name": "tomcat",

"image": "tutum/tomcat",

"ports": [

{"containerport":8080,"hostport":80}

]

}]

}

},

"labels": {"name": "tomcatcluster"}}

"labels": {

"name": "tomcatcluster",

其中pod的tomcat image可以通過docker hub registry https://registry.hub.docker.com/ 搜尋及擷取

$ cluster/kubectl.sh create -f tomcat-pod.json

建立成功後通過 cluster/kubectl.sh get pods 來檢視它所在minion及ip,可以通過curl或浏覽器來通路(請開啟gce防火牆端口設定)。

再定義一個 service

"kind": "service",

"port": 8080,

"containerport": 8080,

"name": "tomcatcluster"

"selector": {

儲存為 tomcat-service.json

$ cluster/kubectl.sh create -f tomcat-service.json

檢查service啟動後的ip及端口,由于service是内部ip,可以在gce上通過curl來測試及驗證。

$ cluster/kubectl.sh get services

6. 關閉cluster

cluster/kube-down.sh

 原文釋出時間:2014-11-20

本文來自雲栖合作夥伴“linux中國”

繼續閱讀