侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

基于Kubernetes和Docke实现留言簿案例

linux  /  管理员 发布于 7年前   213

一、介绍

本案例基于Kubernetes和Docker,其中包括
1、web前端
2、redis master
3、redis slave
其中web前端通过javascript redis api和redis master交互

kubernetes体系架构

二、配置

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     redisname=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.9centos2/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:v2Running  28 seconds  redis-slave-uk8nu  172.17.0.11           centos2/192.168.1.112  name=redis-slave  Running  29 seconds        slave     kubernetes/redis-slave:v2Running  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:v2Running  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:v2Running  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:v2Running  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,另外可以查看防火墙,找到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:v2Running  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:v2Running  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:v2Running  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 "default/redis-master:" -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"b"

8、使用curl简单测试

提交数据
复制代码 代码如下:curl "localhost:8000/index.php?cmd=set&key=messages&value=jay_sais_hi"
查询数据
复制代码 代码如下:curl "localhost:8000/index.php?cmd=get&key=messages"

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

{  "kind":"ReplicationController",  "apiVersion":"v1beta3",  "metadata":{   "name":"redis-master",   "labels":{     "name":"redis-master"   }  },  "spec":{   "replicas":1,   "selector":{     "name":"redis-master"   },   "template":{     "metadata":{      "labels":{        "name":"redis-master"      }     },     "spec":{      "containers":[        {         "name":"master",         "image":"redis",         "ports":[           {"containerPort":6379           }         ]        }      ]     }   }  }}

2、redis-master-service.json

{  "kind":"Service",  "apiVersion":"v1beta3",  "metadata":{   "name":"redis-master",   "labels":{     "name":"redis-master"   }  },  "spec":{   "ports": [    {     "port":6379,     "targetPort":6379    }   ],   "selector":{     "name":"redis-master"   }  }}

3、redis-slave-controller.json

{  "kind":"ReplicationController",  "apiVersion":"v1beta3",  "metadata":{   "name":"redis-slave",   "labels":{     "name":"redis-slave"   }  },  "spec":{   "replicas":2,   "selector":{     "name":"redis-slave"   },   "template":{     "metadata":{      "labels":{        "name":"redis-slave"      }     },     "spec":{      "containers":[        {         "name":"slave",         "image":"kubernetes/redis-slave:v2",         "ports":[           {"containerPort":6379           }         ]        }      ]     }   }  }}

4、redis-slave-service.json

{  "kind":"Service",  "apiVersion":"v1beta3",  "metadata":{   "name":"redis-slave",   "labels":{     "name":"redis-slave"   }  },  "spec":{   "ports": [    {     "port":6379    }   ],   "selector":{     "name":"redis-slave"   }  }}

5、frontend-controller.json

{  "kind":"ReplicationController",  "apiVersion":"v1beta3",  "metadata":{   "name":"frontend",   "labels":{     "name":"frontend"   }  },  "spec":{   "replicas":3,   "selector":{     "name":"frontend"   },   "template":{     "metadata":{      "labels":{        "name":"frontend"      }     },     "spec":{      "containers":[        {         "name":"php-redis",         "image":"kubernetes/example-guestbook-php-redis:v2",         "ports":[           {"containerPort":80           }         ]        }      ]     }   }  }}

6、frontend-service.json

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    Nginx网站根目录更改及导致403 forbidden的问题解决
    下一条:
    MyBatis 如何写配置文件和简单使用
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在Linux系统中使用Iptables实现流量转发功能流程步骤(0个评论)
    • vim学习笔记-入门级需要了解的一些快捷键(0个评论)
    • 在centos7系统中实现分区并格式化挂载一块硬盘到/data目录流程步骤(0个评论)
    • 在Linux系统种查看某一个进程所占用的内存命令(0个评论)
    • Linux中grep命令中的10种高级用法浅析(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-11
    • 2017-07
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-03
    • 2022-04
    • 2022-08
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-06
    • 2023-07
    • 2023-10
    • 2023-12
    • 2024-01
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客