如下圖所示是我初步閱讀文檔和源代碼之后整理的總體概覽,基本上可以從如下三個維度來認識Kubernetes。
Kubernetes以RESTFul形式開放接口,用戶可操作的REST對象有三個:
可以看到,service和replicationController只是建立在pod之上的抽象,最終是要作用于pod的,那么它們?nèi)绾胃鷓od聯(lián)系起來呢?這就要引入label的概念:label其實很好理解,就是為pod加上可用于搜索或關(guān)聯(lián)的一組key/value標簽,而service和replicationController正是通過label來與pod關(guān)聯(lián)的。如下圖所示,有三個pod都有l(wèi)abel為"app=backend",創(chuàng)建service和replicationController時可以指定同樣的label:"app=backend",再通過label selector機制,就將它們與這三個pod關(guān)聯(lián)起來了。例如,當有其他frontend pod訪問該service時,自動會轉(zhuǎn)發(fā)到其中的一個backend pod。
如下圖所示是官方文檔里的集群架構(gòu)圖,一個典型的master/slave模型。
master運行三個組件:
slave(稱作minion)運行兩個組件:
上文已經(jīng)提到了Kubernetes中最基本的三個操作對象:pod, replicationController及service。 下面分別從它們的對象創(chuàng)建出發(fā),通過時序圖來描述Kubernetes各個組件之間的交互及其工作流。
最后,讓我們進入實戰(zhàn)模式,這里跑一個最簡單的單機示例(所有組件運行在一臺機器上),旨在打通基本流程。
第一步,我們需要Kuberntes各組件的二進制可執(zhí)行文件。有以下兩種方式獲?。?nbsp;
git clone https://github.com/GoogleCloudPlatform/kubernetes.git
cd kubernetes/build
./release.sh
wget https://storage.googleapis.com/kubernetes/binaries.tar.gz
自己編譯源碼需要先安裝好golang,編譯完之后在kubernetes/_output/release-tars文件夾下可以得到打包文件。直接下載的方式不需要安裝其他軟件,但可能得不到最新的版本。
第二步,我們還需要etcd的二進制可執(zhí)行文件,通過如下方式獲?。?/p>
wget https://github.com/coreos/etcd/releases/download/v0.4.6/etcd-v0.4.6-linux-amd64.tar.gz
tar xvf etcd-v0.4.6-linux-amd64.tar.gz
第三步,就可以啟動各個組件了:
etcd
cd etcd-v0.4.6-linux-amd64
./etcd
apiserver
./apiserver \
-address=127.0.0.1 \
-port=8080 \
-portal_net="172.0.0.0/16" \
-etcd_servers=http://127.0.0.1:4001 \
-machines=127.0.0.1 \
-v=3 \
-logtostderr=false \
-log_dir=./log
scheduler
./scheduler -master 127.0.0.1:8080 \
-v=3 \
-logtostderr=false \
-log_dir=./log
controller-manager
./controller-manager -master 127.0.0.1:8080 \
-v=3 \
-logtostderr=false \
-log_dir=./log
kubelet
./kubelet \
-address=127.0.0.1 \
-port=10250 \
-hostname_override=127.0.0.1 \
-etcd_servers=http://127.0.0.1:4001 \
-v=3 \
-logtostderr=false \
-log_dir=./log
創(chuàng)建pod
搭好了運行環(huán)境后,就可以提交pod了。首先編寫pod描述文件,保存為redis.json:
{
"id": "redis",
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "redis",
"containers": [{
"name": "redis",
"image": "dockerfile/redis",
"imagePullPolicy": "PullIfNotPresent",
"ports": [{
"containerPort": 6379,
"hostPort": 6379
}]
}]
}
},
"labels": {
"name": "redis"
}
}
然后,通過命令行工具kubecfg提交:
./kubecfg -c redis.json create /pods
提交完后,通過kubecfg查看pod狀態(tài):
# ./kubecfg list /pods
ID Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
redis dockerfile/redis 127.0.0.1/ name=redis Running
Status是Running表示pod已經(jīng)在容器里運行起來了,可以用"docker ps"命令來查看容器信息:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae83d1e4b1ec dockerfile/redis:latest "redis-server /etc/r 19 seconds ago Up 19 seconds k8s_redis.caa18858_redis.default.etcd_1414684622_1b43fe35
創(chuàng)建replicationController
{
"id": "redisController",
"apiVersion": "v1beta1",
"kind": "ReplicationController",
"desiredState": {
"replicas": 1,
"replicaSelector": {"name": "redis"},
"podTemplate": {
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "redisController",
"containers": [{
"name": "redis",
"image": "dockerfile/redis",
"imagePullPolicy": "PullIfNotPresent",
"ports": [{
"containerPort": 6379,
"hostPort": 6379
}]
}]
}
},
"labels": {"name": "redis"}
}},
"labels": {"name": "redis"}
}
然后,通過命令行工具kubecfg提交:
./kubecfg -c redisController.json create /replicationControllers
提交完后,通過kubecfg查看replicationController狀態(tài):
# ./kubecfg list /replicationControllers
ID Image(s) Selector Replicas
---------- ---------- ---------- ----------
redisController dockerfile/redis name=redis 1
同時,1個pod也將被自動創(chuàng)建出來,即使我們故意刪除該pod,replicationController也將保證創(chuàng)建1個新pod。
原文鏈接: Kubernetes初探(責編:周小璐)