1.自由部署Kubernets pods在1台或者多台machine上(pod相当于fleet中service的集合)
答:部署一种pods在多台machine上:可以通过replicationController完成,控制指定数量的pods跑在集群的机器上,但是如果想部署一个size为4的replicationController(eg。对外暴露8888端口)在3台machine(node)上,则会出现端口冲突,有一个pod会处在unassign的状态
所以在3台machine的集群中,一个replicaitonController(占8888端口)的最大size应为3
如果想开更多pods在3台机器上,需要更改replicationController的json文件中的podTemplate->containers->ports相关内容
附一个replicaitonController的json模板:
{
"id": "wordpressController",
"kind": "ReplicationController",
"apiVersion": "v1beta1",
"desiredState": {
"replicas": 3,
"replicaSelector": {"name": "wordpress"},
"podTemplate": {
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "wordpressController",
"containers": [{
"name": "wordpress",
"image": "tutum/wordpress",
"ports": [{"containerPort": 80, "hostPort": 11111}]
}]
}
},
"labels": {"name": "wordpress"}
}},
"labels": {"name": "wordpress"}
}
也可以通过命令行启动,支持docker的参数
kubecfg -p 8080:80 run dockerfile/nginx 2 myNginxController
也可以在replicationController的json模板中指定docker启动参数:
"podTemplate": {
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "redis-slave-controller",
"containers": [{
"name": "redis-slave",
"image": "gurpartap/redis",
!!!!"command": ["sh", "-c", "redis-server /etc/redis/redis.conf --slaveof $REDIS_MASTER_SERVICE_HOST $REDIS_MASTER_SERVICE_PORT"],
"ports": [{ "name": "redis-server", "containerPort": 6379 }]
}]
}
},
"labels": { "name": "redis", "role": "slave" }
}
部署某个pod在某台机器上:
目前发现一种解决方式,不过很不灵活
根据github上提供的可能解决方法,使用nodeSelector:
启动minion时,为minion指定label,比如指定自己的IP,也可以指定类似Disk=SSD这样的参数:
{
"id": "10.58.9.83",
"kind":"Minion",
"apiVersion":"v1beta1",
"hostIP": "10.58.9.83",
"resources":{
"capacity":{
"cpu":1000,
"memory":536870912
}
},
"labels":{
"IP": "10.58.9.83"
}
}
pod写成如下,注意nodeSelector和desireState平级
{
"id":"redis-master-4",
"kind": "Pod",
"apiVersion": "v1beta1",
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "redis-master-4",
"containers": [{
"name": "master",
"image": "dockerfile/redis",
"ports": [{
"containerPort": 6379,
"hostPort": 6379
}]
}],
}
},
"nodeSelector":{"IP": "10.58.9.86"},
"labels": {
"name": "redis-master"
}
}
连续两次启动该pod的json文件(期间更改一下json文件的id参数),可以看到如下效果
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis <unassigned> name=redis-master Waiting
redis-master-3 dockerfile/redis 10.58.9.86/ name=redis-master Running
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
35a75211-6bcb-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress-controller-3333 Running
5b50f347-6bc7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Running
可以证明nodeSelector参数生效了,
如果使用replicationController,应该也可以达到同样的效果
把redis-master-3这个pod删除: kubecfg delete redis-master-3, 可以看到如下效果
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
35a75211-6bcb-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress-controller-3333 Running
5b50f347-6bc7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Running
可以看到原来waiting的redis-master-4 schedule到了86上面,可能和scheduler有关,scheduler watch etcd中key value的情况,一旦有变化则会重新执行schedule
2.某一个占用端口(eg,7777)的pod所在node down掉时(或者其他异常终止情况),scheduler自动使用round-robin方式(循环安排任务)把这个pod再安排到其他可能的node上,期间会检查一系列constraint包括端口冲突情况,还有比如nodeSelector这样的限制,
如果没有合适的node可以分配,则该pod保持Waiting的状态且host为unassigned
3.移除某一个机器(node)时,服务可以转移到其他合适node上
kubecfg resize wordpress-controller-3333 2
kubecfg list pods
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
5b50f347-6bc7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Running
实验中每次停掉83,85,都会导致kubecfg list pods这个命令失效,具体原因未知,可能和机器太少有关
采用另一种方法,在83上停掉kuberlet
(kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。)
83:systemctl stop kube*
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
28385e0d-6be0-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Terminated
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
可以看到83的pod 结束了(此时只是kubernetes认为这个pod挂了,但是在83上docker ps -a,可以看到这个container还在跑着
过一会,可以看到
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
28385e0d-6be0-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Terminated
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
8af74c63-6be1-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress-controller-3333 Running
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
controller-manager中的replicationController定时起作用了,开始在86上启动一个相应的pod来保证有两个pod在跑
(replication-controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。)
此时83:systemctl start kube*,把83重新联系起来
root@CNPVGVB1OD035:/home/pods# kubecfg list pods
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
8af74c63-6be1-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress-controller-3333 Running
28385e0d-6be0-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Running
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
可以看到83的状态又被replicationController监控起来了,但是此时其实已经有3个pods了,不符合size,过一会可以看到replicationController做出了调增
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
8af74c63-6be1-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress-controller-3333 Running
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
至此恢复正常
4. 81,83只允许跑app.war, 82只允许跑App.war and eshop.war
和fleet的metadata一样控制,这里面用到replicationController的nodeSelector和启动minion(node)时的的label匹配
这样的匹配也是多对多的,所以完全可以满足需求
附:
概念:
•scheduler:负责集群的资源调度,为新建的pod分配机器。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。
•controller-manager:负责执行各种控制器,目前有两类:
◦endpoint-controller:定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的。
◦replication-controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。
kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。
•proxy:负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。
帖子:
我提出的问题:
https://github.com/GoogleCloudPlatform/kubernetes/issues/2342
相关问题:
http://godoc.org/github.com/GoogleCloudPlatform/kubernetes/pkg/api#ServiceSpec
http://hustcat.github.io/kubernetes-add-rm-minion/
https://groups.google.com/forum/#!topic/google-containers/NpzKO609EZM
https://github.com/GoogleCloudPlatform/kubernetes/issues/367
kubecfg api:
https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/cli.md
答:部署一种pods在多台machine上:可以通过replicationController完成,控制指定数量的pods跑在集群的机器上,但是如果想部署一个size为4的replicationController(eg。对外暴露8888端口)在3台machine(node)上,则会出现端口冲突,有一个pod会处在unassign的状态
所以在3台machine的集群中,一个replicaitonController(占8888端口)的最大size应为3
如果想开更多pods在3台机器上,需要更改replicationController的json文件中的podTemplate->containers->ports相关内容
附一个replicaitonController的json模板:
{
"id": "wordpressController",
"kind": "ReplicationController",
"apiVersion": "v1beta1",
"desiredState": {
"replicas": 3,
"replicaSelector": {"name": "wordpress"},
"podTemplate": {
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "wordpressController",
"containers": [{
"name": "wordpress",
"image": "tutum/wordpress",
"ports": [{"containerPort": 80, "hostPort": 11111}]
}]
}
},
"labels": {"name": "wordpress"}
}},
"labels": {"name": "wordpress"}
}
也可以通过命令行启动,支持docker的参数
kubecfg -p 8080:80 run dockerfile/nginx 2 myNginxController
也可以在replicationController的json模板中指定docker启动参数:
"podTemplate": {
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "redis-slave-controller",
"containers": [{
"name": "redis-slave",
"image": "gurpartap/redis",
!!!!"command": ["sh", "-c", "redis-server /etc/redis/redis.conf --slaveof $REDIS_MASTER_SERVICE_HOST $REDIS_MASTER_SERVICE_PORT"],
"ports": [{ "name": "redis-server", "containerPort": 6379 }]
}]
}
},
"labels": { "name": "redis", "role": "slave" }
}
部署某个pod在某台机器上:
目前发现一种解决方式,不过很不灵活
根据github上提供的可能解决方法,使用nodeSelector:
启动minion时,为minion指定label,比如指定自己的IP,也可以指定类似Disk=SSD这样的参数:
{
"id": "10.58.9.83",
"kind":"Minion",
"apiVersion":"v1beta1",
"hostIP": "10.58.9.83",
"resources":{
"capacity":{
"cpu":1000,
"memory":536870912
}
},
"labels":{
"IP": "10.58.9.83"
}
}
pod写成如下,注意nodeSelector和desireState平级
{
"id":"redis-master-4",
"kind": "Pod",
"apiVersion": "v1beta1",
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "redis-master-4",
"containers": [{
"name": "master",
"image": "dockerfile/redis",
"ports": [{
"containerPort": 6379,
"hostPort": 6379
}]
}],
}
},
"nodeSelector":{"IP": "10.58.9.86"},
"labels": {
"name": "redis-master"
}
}
连续两次启动该pod的json文件(期间更改一下json文件的id参数),可以看到如下效果
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis <unassigned> name=redis-master Waiting
redis-master-3 dockerfile/redis 10.58.9.86/ name=redis-master Running
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
35a75211-6bcb-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress-controller-3333 Running
5b50f347-6bc7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Running
可以证明nodeSelector参数生效了,
如果使用replicationController,应该也可以达到同样的效果
把redis-master-3这个pod删除: kubecfg delete redis-master-3, 可以看到如下效果
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
35a75211-6bcb-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress-controller-3333 Running
5b50f347-6bc7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Running
可以看到原来waiting的redis-master-4 schedule到了86上面,可能和scheduler有关,scheduler watch etcd中key value的情况,一旦有变化则会重新执行schedule
2.某一个占用端口(eg,7777)的pod所在node down掉时(或者其他异常终止情况),scheduler自动使用round-robin方式(循环安排任务)把这个pod再安排到其他可能的node上,期间会检查一系列constraint包括端口冲突情况,还有比如nodeSelector这样的限制,
如果没有合适的node可以分配,则该pod保持Waiting的状态且host为unassigned
3.移除某一个机器(node)时,服务可以转移到其他合适node上
kubecfg resize wordpress-controller-3333 2
kubecfg list pods
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
5b50f347-6bc7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Running
实验中每次停掉83,85,都会导致kubecfg list pods这个命令失效,具体原因未知,可能和机器太少有关
采用另一种方法,在83上停掉kuberlet
(kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。)
83:systemctl stop kube*
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
28385e0d-6be0-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Terminated
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
可以看到83的pod 结束了(此时只是kubernetes认为这个pod挂了,但是在83上docker ps -a,可以看到这个container还在跑着
过一会,可以看到
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
28385e0d-6be0-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Terminated
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
8af74c63-6be1-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress-controller-3333 Running
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
controller-manager中的replicationController定时起作用了,开始在86上启动一个相应的pod来保证有两个pod在跑
(replication-controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。)
此时83:systemctl start kube*,把83重新联系起来
root@CNPVGVB1OD035:/home/pods# kubecfg list pods
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
8af74c63-6be1-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress-controller-3333 Running
28385e0d-6be0-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.83/ name=wordpress-controller-3333 Running
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
可以看到83的状态又被replicationController监控起来了,但是此时其实已经有3个pods了,不符合size,过一会可以看到replicationController做出了调增
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
c7d847cd-6b13-11e4-90c0-005056925e06 tutum/wordpress 10.58.9.85/ name=wordpress-controller-3333 Running
8af74c63-6be1-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress-controller-3333 Running
492548f4-6bd7-11e4-9f14-005056925e06 tutum/wordpress 10.58.9.86/ name=wordpress Running
redis-master-4 dockerfile/redis 10.58.9.86/ name=redis-master Running
至此恢复正常
4. 81,83只允许跑app.war, 82只允许跑App.war and eshop.war
和fleet的metadata一样控制,这里面用到replicationController的nodeSelector和启动minion(node)时的的label匹配
这样的匹配也是多对多的,所以完全可以满足需求
附:
概念:
•scheduler:负责集群的资源调度,为新建的pod分配机器。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。
•controller-manager:负责执行各种控制器,目前有两类:
◦endpoint-controller:定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的。
◦replication-controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。
kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。
•proxy:负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。
帖子:
我提出的问题:
https://github.com/GoogleCloudPlatform/kubernetes/issues/2342
相关问题:
http://godoc.org/github.com/GoogleCloudPlatform/kubernetes/pkg/api#ServiceSpec
http://hustcat.github.io/kubernetes-add-rm-minion/
https://groups.google.com/forum/#!topic/google-containers/NpzKO609EZM
https://github.com/GoogleCloudPlatform/kubernetes/issues/367
kubecfg api:
https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/cli.md