设为首页 收藏本站
查看: 1850|回复: 0

[经验分享] kubernetes实战-基于redis和docker的留言簿案例

[复制链接]

尚未签到

发表于 2015-10-13 08:01:28 | 显示全部楼层 |阅读模式
一、介绍
本案例基于Kubernetes和Docker,其中包括

1、web前端
2、redis master
3、redis slave
其中web前端通过javascript redis api和redis master交互



kubernetes体系架构
DSC0000.jpg





二、配置
0、先决条件
Kubernetes 集群


1、启动redis master
使用replication controller确保只有一个pod在运行(当某个节点down了,rc会在另一个健康的node启动redis master),但可能会有数据丢失。
[root@centos1 example]# kubectl create -f redis-master-controller.json replicationcontrollers/redis-master[root@centos1 example]# kubectl get rcCONTROLLER     CONTAINER(S)   IMAGE(S)   SELECTOR            REPLICASredis-master   master         redis      name=redis-master   1
验证master运行成功,如下展示了pod运行在centos2/192.168.1.112这台机器上   

[root@centos1 example]# kubectl get podsPOD                  IP           CONTAINER(S)   IMAGE(S)   HOST                    LABELS              STATUS    CREATED      MESSAGEredis-master-svar7   172.17.0.9                             centos2/192.168.1.112   name=redis-master   Running   55 seconds                                     master         redis                                                  Running   55 seconds   
SSH到centos2/192.168.1.112查看docker状态

[root@centos2 yum.repos.d]# docker psCONTAINER ID        IMAGE                                  COMMAND                CREATED             STATUS              PORTS               NAMES91689ce56668        redis:latest                           "/entrypoint.sh redi   3 minutes ago       Up 3 minutes                            k8s_master.52732b08_redis-master-svar7_default_5b6d5485-1894-11e5-b3ad-000c293c8c19_97e79b7b   38c3180813c3        gcr.io/google_containers/pause:0.8.0   "/pause"               3 minutes ago       Up 3 minutes                            k8s_POD.49eee8c2_redis-master-svar7_default_5b6d5485-1894-11e5-b3ad-000c293c8c19_298e038f      
注意:kubectl create执行后,如果镜像不存在,会执行docker pull,根据网络情况,下载中的pods 在kubertnetes UI上会显示pending状态


2、启动master service
一个kubernetes service会对一个或多个container进行负载均衡,这是通过我们上面redis-master中定义的labels元数据实现的,值得注意的是,在redis中只有一个master,但是我们依然为它创建一个service,这是因为这样我们就能使用一个elastic IP来路由到具体某一个master。
kubernetes集群中的service是通过container中的环境变量实现服务发现的,service基于pod label实现container的负载均衡。
在第一步中创建的pod包含了一个label“name=redis-master”,service的selector字段决定了service将流量转发给哪个pod,port和targetPort信息定义了service
proxy运行在什么端口。

[root@centos1 example]# kubectl create -f redis-master-service.json services/redis-master[root@centos1 example]# kubectl get servicesNAME            LABELS                                    SELECTOR            IP(S)           PORT(S)redis-master    name=redis-master                         name=redis-master   10.254.154.90   6379/TCP
上面的运行成功后,所有pods都能发现redis master运行在6379端口,从salve到master流量走向会有以下两步:
1、一个redis slave会连接到redis master service的port上
2、流量会从service节点上的port到targetPort
如果targetPort未指定,默认和port一致


3、启动replicated slave pod
虽然redis master是一个单独的pod,redis slaves是一个replicated pod,在Kubernetes中,一个Replication Controller负责管理一个replicated pod的多个实例,RC会自动拉起down掉的replica(可以通过杀死docker 进程方式简单测试)
[root@centos1 example]# kubectl create -f redis-slave-controller.json replicationcontrollers/redis-slave[root@centos1 example]# kubectl get rcCONTROLLER     CONTAINER(S)   IMAGE(S)                    SELECTOR            REPLICASredis-master   master         redis                       name=redis-master   1redis-slave    slave          kubernetes/redis-slave:v2   name=redis-slave    2[root@centos1 example]# kubectl get podsPOD                  IP            CONTAINER(S)   IMAGE(S)                    HOST                    LABELS              STATUS    CREATED      MESSAGEredis-master-svar7   172.17.0.9                                               centos2/192.168.1.112   name=redis-master   Running   41 minutes                                      master         redis                                                                   Running   41 minutes   redis-slave-31tkb    172.17.0.10                                              centos2/192.168.1.112   name=redis-slave    Running   29 seconds                                      slave          kubernetes/redis-slave:v2                                               Running   28 seconds   redis-slave-uk8nu    172.17.0.11                                              centos2/192.168.1.112   name=redis-slave    Running   29 seconds                                      slave          kubernetes/redis-slave:v2                                               Running   28 seconds   
可以看到一个master pod和两个slave pod


4、启动slave service
和master一样,我们希望有一个代理服务连接到redis slave,除了服务发现之外,slave service还为web app client提供了透明代理。
这次service 的selector是name=redis-slave,我们可以方便的使用kubectl
get services -l "label=value"命令来定位这些服务

[root@centos1 example]# kubectl create -f redis-slave-service.json services/redis-slave[root@centos1 example]# kubectl get servicesNAME            LABELS                                    SELECTOR            IP(S)            PORT(S)redis-master    name=redis-master                         name=redis-master   10.254.154.90    6379/TCPredis-slave     name=redis-slave                          name=redis-slave    10.254.159.145   6379/TCP


5、创建frontend pod
这是一个简单的PHP 服务,用来和master service(写请求)或slave service(读请求)交互
[root@centos1 example]# kubectl create -f frontend-controller.json replicationcontrollers/frontend[root@centos1 example]# kubectl get rcCONTROLLER     CONTAINER(S)   IMAGE(S)                                    SELECTOR            REPLICASfrontend       php-redis      kubernetes/example-guestbook-php-redis:v2   name=frontend       3redis-master   master         redis                                       name=redis-master   1redis-slave    slave          kubernetes/redis-slave:v2                   name=redis-slave    2
运行成功后,查看当前pod运行状态

[root@centos1 example]# kubectl get podsPOD                  IP            CONTAINER(S)   IMAGE(S)                                    HOST                    LABELS              STATUS    CREATED      MESSAGEfrontend-fr5z1       172.17.0.13                                                              centos2/192.168.1.112   name=frontend       Running   2 minutes                                       php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   2 minutes    frontend-gjx3t       172.17.0.14                                                              centos2/192.168.1.112   name=frontend       Running   2 minutes                                       php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   2 minutes    frontend-v608r       172.17.0.12                                                              centos2/192.168.1.112   name=frontend       Running   2 minutes                                       php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   2 minutes    redis-master-svar7   172.17.0.9                                                               centos2/192.168.1.112   name=redis-master   Running   53 minutes                                      master         redis                                                                                   Running   53 minutes   redis-slave-31tkb    172.17.0.10                                                              centos2/192.168.1.112   name=redis-slave    Running   12 minutes                                      slave          kubernetes/redis-slave:v2                                                               Running   12 minutes   redis-slave-uk8nu    172.17.0.11                                                              centos2/192.168.1.112   name=redis-slave    Running   12 minutes                                      slave          kubernetes/redis-slave:v2                                                               Running   12 minutes   
可以看到一个redis master,两个redis slave和三个frontend pods


6、创建guestbook service
和其他service一样,你可以创建一个service管理frontend pods
[root@centos1 example]# kubectl create -f frontend-service.json services/frontend[root@centos1 example]# kubectl get servicesNAME            LABELS                                    SELECTOR            IP(S)            PORT(S)frontend        name=frontend                             name=frontend       10.254.154.111   80/TCPredis-master    name=redis-master                         name=redis-master   10.254.154.90    6379/TCPredis-slave     name=redis-slave                          name=redis-slave    10.254.159.145   6379/TCP
我们可以通过frontend service(10.254.154.111)访问pods,但是这个IP明显是无法在外部访问的,下一节讲解如何在外部网络访问guestbook


7、外部网络访问guestbook
kubernetes 支持两种访问暴露一个服务到外部IP地址NodePorts
LoadBalancers,https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/services.md#external-services
另外可以查看防火墙,找到service对应的端口,如下
[root@centos1 example]# kubectl get pods,servicesPOD                  IP            CONTAINER(S)   IMAGE(S)                                    HOST                    LABELS              STATUS    CREATED         MESSAGEfrontend-fr5z1       172.17.0.13                                                              centos2/192.168.1.112   name=frontend       Running   22 minutes                                         php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   22 minutes      frontend-gjx3t       172.17.0.14                                                              centos2/192.168.1.112   name=frontend       Running   22 minutes                                         php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   22 minutes      frontend-v608r       172.17.0.12                                                              centos2/192.168.1.112   name=frontend       Running   22 minutes                                         php-redis      kubernetes/example-guestbook-php-redis:v2                                               Running   22 minutes      redis-master-svar7   172.17.0.9                                                               centos2/192.168.1.112   name=redis-master   Running   About an hour                                      master         redis                                                                                   Running   About an hour   redis-slave-31tkb    172.17.0.10                                                              centos2/192.168.1.112   name=redis-slave    Running   32 minutes                                         slave          kubernetes/redis-slave:v2                                                               Running   32 minutes      redis-slave-uk8nu    172.17.0.11                                                              centos2/192.168.1.112   name=redis-slave    Running   32 minutes                                         slave          kubernetes/redis-slave:v2                                                               Running   32 minutes      NAME            LABELS                                    SELECTOR            IP(S)            PORT(S)frontend        name=frontend                             name=frontend       10.254.154.111   80/TCPkubernetes      component=apiserver,provider=kubernetes   <none>              10.254.0.2       443/TCPkubernetes-ro   component=apiserver,provider=kubernetes   <none>              10.254.0.1       80/TCPredis-master    name=redis-master                         name=redis-master   10.254.154.90    6379/TCPredis-slave     name=redis-slave                          name=redis-slave    10.254.159.145   6379/TCP[root@centos1 example]# kubectl get servicesNAME            LABELS                                    SELECTOR            IP(S)            PORT(S)frontend        name=frontend                             name=frontend       10.254.154.111   80/TCPkubernetes      component=apiserver,provider=kubernetes   <none>              10.254.0.2       443/TCPkubernetes-ro   component=apiserver,provider=kubernetes   <none>              10.254.0.1       80/TCPredis-master    name=redis-master                         name=redis-master   10.254.154.90    6379/TCPredis-slave     name=redis-slave                          name=redis-slave    10.254.159.145   6379/TCP

发现redis-master是在10.254.154.90上,登录到centos2上,执行iptables-save,发现其中有这样一条规则
-A KUBE-PORTALS-HOST -d 10.254.154.90/32 -p tcp -m comment --comment &quot;default/redis-master:&quot; -m tcp --dport 6379 -j DNAT --to-destination 192.168.1.112:49038
说明,centos2本机的49038端口映射到master container内的6379了,当然我们就能执行在本机访问redis了

[root@centos2 yum.repos.d]# redis-cli -p 49038127.0.0.1:49038> set a bOK127.0.0.1:49038> get a&quot;b&quot;


8、使用curl简单测试
提交数据
curl &quot;localhost:8000/index.php?cmd=set&key=messages&value=jay_sais_hi&quot;
查询数据

curl &quot;localhost:8000/index.php?cmd=get&key=messages&quot;


附本案例用到的6个.json文件
1、redis-master-controller.json


{   &quot;kind&quot;:&quot;ReplicationController&quot;,   &quot;apiVersion&quot;:&quot;v1beta3&quot;,   &quot;metadata&quot;:{      &quot;name&quot;:&quot;redis-master&quot;,      &quot;labels&quot;:{         &quot;name&quot;:&quot;redis-master&quot;      }   },   &quot;spec&quot;:{      &quot;replicas&quot;:1,      &quot;selector&quot;:{         &quot;name&quot;:&quot;redis-master&quot;      },      &quot;template&quot;:{         &quot;metadata&quot;:{            &quot;labels&quot;:{               &quot;name&quot;:&quot;redis-master&quot;            }         },         &quot;spec&quot;:{            &quot;containers&quot;:[               {                  &quot;name&quot;:&quot;master&quot;,                  &quot;image&quot;:&quot;redis&quot;,                  &quot;ports&quot;:[                     {                        &quot;containerPort&quot;:6379                     }                  ]               }            ]         }      }   }}
2、redis-master-service.json


{   &quot;kind&quot;:&quot;Service&quot;,   &quot;apiVersion&quot;:&quot;v1beta3&quot;,   &quot;metadata&quot;:{      &quot;name&quot;:&quot;redis-master&quot;,      &quot;labels&quot;:{         &quot;name&quot;:&quot;redis-master&quot;      }   },   &quot;spec&quot;:{      &quot;ports&quot;: [        {          &quot;port&quot;:6379,          &quot;targetPort&quot;:6379        }      ],      &quot;selector&quot;:{         &quot;name&quot;:&quot;redis-master&quot;      }   }}
3、redis-slave-controller.json

{   &quot;kind&quot;:&quot;ReplicationController&quot;,   &quot;apiVersion&quot;:&quot;v1beta3&quot;,   &quot;metadata&quot;:{      &quot;name&quot;:&quot;redis-slave&quot;,      &quot;labels&quot;:{         &quot;name&quot;:&quot;redis-slave&quot;      }   },   &quot;spec&quot;:{      &quot;replicas&quot;:2,      &quot;selector&quot;:{         &quot;name&quot;:&quot;redis-slave&quot;      },      &quot;template&quot;:{         &quot;metadata&quot;:{            &quot;labels&quot;:{               &quot;name&quot;:&quot;redis-slave&quot;            }         },         &quot;spec&quot;:{            &quot;containers&quot;:[               {                  &quot;name&quot;:&quot;slave&quot;,                  &quot;image&quot;:&quot;kubernetes/redis-slave:v2&quot;,                  &quot;ports&quot;:[                     {                        &quot;containerPort&quot;:6379                     }                  ]               }            ]         }      }   }}
4、redis-slave-service.json

{   &quot;kind&quot;:&quot;Service&quot;,   &quot;apiVersion&quot;:&quot;v1beta3&quot;,   &quot;metadata&quot;:{      &quot;name&quot;:&quot;redis-slave&quot;,      &quot;labels&quot;:{         &quot;name&quot;:&quot;redis-slave&quot;      }   },   &quot;spec&quot;:{      &quot;ports&quot;: [        {          &quot;port&quot;:6379        }      ],      &quot;selector&quot;:{         &quot;name&quot;:&quot;redis-slave&quot;      }   }}
5、frontend-controller.json


{   &quot;kind&quot;:&quot;ReplicationController&quot;,   &quot;apiVersion&quot;:&quot;v1beta3&quot;,   &quot;metadata&quot;:{      &quot;name&quot;:&quot;frontend&quot;,      &quot;labels&quot;:{         &quot;name&quot;:&quot;frontend&quot;      }   },   &quot;spec&quot;:{      &quot;replicas&quot;:3,      &quot;selector&quot;:{         &quot;name&quot;:&quot;frontend&quot;      },      &quot;template&quot;:{         &quot;metadata&quot;:{            &quot;labels&quot;:{               &quot;name&quot;:&quot;frontend&quot;            }         },         &quot;spec&quot;:{            &quot;containers&quot;:[               {                  &quot;name&quot;:&quot;php-redis&quot;,                  &quot;image&quot;:&quot;kubernetes/example-guestbook-php-redis:v2&quot;,                  &quot;ports&quot;:[                     {                        &quot;containerPort&quot;:80                     }                  ]               }            ]         }      }   }}
6、frontend-service.json


{   &quot;kind&quot;:&quot;Service&quot;,   &quot;apiVersion&quot;:&quot;v1beta3&quot;,   &quot;metadata&quot;:{      &quot;name&quot;:&quot;frontend&quot;,      &quot;labels&quot;:{         &quot;name&quot;:&quot;frontend&quot;      }   },   &quot;spec&quot;:{      &quot;ports&quot;: [        {          &quot;port&quot;:80        }      ],      &quot;selector&quot;:{         &quot;name&quot;:&quot;frontend&quot;      }   }}














版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-126024-1-1.html 上篇帖子: centos 7 安装kubernetes cluste 下篇帖子: 基于docker、kubernetes部署openstack到atomic系统上
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表