Kubernetes上手指南之什么是Kubernetes

Kubernetes是Google推出的,用来管理大规模容器的工具,官网地址。首先,我们先来看一个最亟待解决的问题:

Kubernetes怎么读?

Kubernetes的发布视频中Google工程师对于这个词的发音大概是这样的:/koo-ber-nay'-tace/,需要注意的是,重音在第三个音节。发音正确,才显得专业。

Kubernetes是做什么的?

最近两年,docker的出现让容器技术火了。轻量化,快速部署,动态伸缩,这些听起来很美好的概念,让架构师门开心不已,但却苦了运维。因为轻量,所以就可以大规模部署,随便一个系统,跑个几百上千个docker都不是什么新鲜事,比如过年微信抽红包,随随便便就用掉几亿个docker。这么多容器,就得需要工具管起来,Kubernetes就是Google用来管理容器的工具。

Kubernetes抽象模型

Cluster

Cluster是Kubernetes调度的容器的运行环境,虽然Google推出的工具,天生对自家的Google Cloud Engine提供支持,但其他很多平台仍然可以使用,比如AWS,Azure,OpenStack,Vagrant,还有运行着Linux容器服务的物理机,以及CoreOS,Mesos等等,事实上,只要是能运行Linux容器,就能够支持,这里列出了在各个环境下如何使用Kubernetes。

Pod

Pod是Kubernetes管理的最小可部署单位,在最初的设计中,一个Pod里可能是一个应用程序,也可能是一组紧密相关的应用程序。同一个Pod中的应用程序之间共享系统上下文,包括进程信息,网络信息等等。不过,如果应用程序是通过docker部署的,暂时只做到共享数据,还不能共享进程信息。

举个例子,一个简化的搜索引擎可以描述为一个提供用户检索的前端索引界面和一个位于后端的爬虫,爬虫程序不停地从网上抓取数据并写入到与索引程序共享的存储中,索引程序从共享的存储中读取数据并检索结果提供给用户。这样,这个索引程序和爬虫程序就可以被当做一个Pod来调度。

需要注意的是,一个Pod在Kubernetes调度的生命周期可能是短暂的,因为Kubernetes会动态的启动和终止Pod,所以Pod应该是一个无状态的应用,可以随时启动、停止。

下面是一个Pod配置的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
kind: Pod
metadata:
labels:
name: cassandra
name: cassandra
spec:
containers:
- args:
- /run.sh
resources:
limits:
cpu: "1"
image: kubernetes/cassandra:v2
name: cassandra
ports:
- name: cql
containerPort: 9042
- name: thrift
containerPort: 9160
...

Replication Controller

为了高可用,有时需要同时启动多个Pod同时提供服务,而这些Pod的状态管理,就是靠Replication Controller来保证。可以配置同一个Pod在系统中同时存在多少个,Replication Controller会不停地循环检测,如果数目少了,Replication Controller会自动启动一个新的Pod;如果数目多了,Replication Controller会自动终止掉一个Pod。

举个例子,如果一个服务配置了同时应该存在4个节点提供服务,Replication Controller会不断检测当前是否有4个节点在运行,如果只有3个,Replication Controller会自动启动一个新的Pod;如果有5个,就会自动Kill掉其中一个。在Kubernetes的官方文档中建议,即使应用只运行一个Pod,也最好使用Replication Controller来管理。

下面是一个Replication Controller配置的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
kind: ReplicationController
metadata:
labels:
name: cassandra
name: cassandra
spec:
replicas: 1
selector:
name: cassandra
template:
metadata:
labels:
name: cassandra
spec:
containers:
- command:
- /run.sh
resources:
limits:
cpu: 1
...

Service

Service是多个Pod对外提供的统一服务入口,类似于一个负载均衡器。如果一个应用,用了4个Pod提供服务,通过Service可以对外暴露一个入口,而这4个Pod在运行过程中,出现崩溃,重启,弹性扩展或者伸缩,这些对于服务的消费者来说,都是不可见的。

下面是一个Service配置的例子:

1
2
3
4
5
6
7
8
9
10
11
kind: Service
metadata:
labels:
name: cassandra
name: cassandra
spec:
ports:
- port: 9042
targetPort: 9042
selector:
name: cassandra

Label

一个Label是一个key:value形式的键值对,一个Kubernetes对象(Pod,Service, Replication Controller等)可以绑定多个Label。Kubernetes通过Label来组织和选择对象,比如想在一大堆Pod中找到运行cassandra的,就可以通过name: cassandra来选择。

Kubernetes还能做什么?

通过上面介绍的抽象模型,Kubernetes将Linux容器集群分层次的管理起来。但Kubernetes能做的还不止这些。

Kubernetes可以对应用程序配置各种策略,比如在什么时候重新启动容器,什么时候销毁容器,通过滚动更新的方式更新一个Service下的所有容器,更新失败时的自动回滚等等。除了这些,Kubernetes还提供了很多开放接口,可以让开发者扩展功能。这些都留待后续文章详细探究。