|
作者:张华 发表于:2014-12-21 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
( http://blog.csdn.net/quqi99 )
Kubernetes是Google开源的Docker容器集群管理系统,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等整一套功能,本质上可看作是基于容器技术的PaaS平台。
Kubernetes的核心数据模型
- 1, pod, 逻辑上表示某种应用的一个实例,应用运行在容器中
- 2, service, 是pod的路由代理抽象,因为pod的运行状态是可动态变化的(比如切换机器了),所以用service来解偶保证IP不被写死
- 3, replicationController, 是pod的复制抽象,用于保证pod数量总是与配置的复制数量相等
- 4, label, 用一组key/val让pod与service和replicationController关联, Label Selector为多个pod提供LB, service与pod的关联关系由endpoint定义
Kubernetes一个典型的master/slave集群架构图
master组件:
- apiserver:以RESTFul接口向外提供对核心数据模型的增删改查操作。它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)
- scheduler:负责集群的资源调度,为新建的pod分配机器, 可以很方便地替换成其他的调度器。
- controller-manager:负责执行各种控制器,目前有两类: endpoint-controller:定期更新service和pod(关联信息由endpoint对象维护)映射; replication-controller:定期更新replicationController和pod映射,保证复制数量与运行pod的数量总是一致的
slave(称作minion)组件:
- kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。
- proxy:负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。
Kubernetes之Hello World
1, 安装
git clone https://github.com/GoogleCloudPlatform/kubernetes.git
cd kubernetes/build && ./release.sh
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
2, 运行组件
./etcd-v0.4.6-linux-amd64/etcd
./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 -master 127.0.0.1:8080 -v=3 -logtostderr=false -log_dir=./log
./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
3, 创建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"
}
}
4, 创建replicationControoler
{
"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"}
}
5, 相关命令行
a, 创建pod, ./kubecfg -c redis.json create /pods
b, 查看pod, ./kubecfg list /pods
c, 查看容器,docker ps
d, 提交replicationController, ./kubecfg -c redisController.json create /replicationControllers
e, 查看replicationController状态, ./kubecfg list /replicationControllers
Kubernetes网络
对Kubernetes有了一个大概的印象后,到了该深入了解Kubernetes网络原理的时候了。Kubernetes和Rudder都可以为每台物理机分配一个单独的子网(Rudder从etcd注册的子网中随机选择一个未使用的子网),这样不会出现多个物理机使用相同子网的情况,从而简化了问题避免了出现像Neutron中的DVR特性的情况。剩下的SNAT部分与neutron相似,略。另外,Kubernetes目前还没有如DNAT, LB, IPv6等特性[1]。 所以,目前neutron能完全提供对容器的支持。另外,我认为OpenStack想要做到相同的物理机使用单独的子网也很容易,添加一个nova-scheduler尽量将同一子网的容器分配到同一台host即可, 当然它目前有DVR特性没那个必要了。
参考
[1] https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/design/networking.md#challenges-and-future-work |
|