Kubernetes试验

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值