kubernate 分布式练习-redis-master创建
在对Kubernetes的容器应用进行详细说明之前,让我们先通过一个由3个微服务组 成的留言板(Guestbook)系统的搭建,对Kubernetes对容器应用的基本操作和用法进 行初步介绍。本章后面的章节将基于该案例和其他示例,进一步深入Pod、RC、 Service等核心对象的用法和技巧,对Kubernetes的应用管理进行全面讲解。Guestbook留言板系统将通过Pod、RC、Service等资源对象搭建完成,成功启动后 在网页中显示一条“Hello World”留言。其系统架构是一个基于PHP+Redis的分布式Web 应用,前端PHP Web网站通过访问后端的Redis来完成用户留言的查询和添加等功能。同时Redis以Master+Slave的模式进行部署,实现数据的读写分离能力。留言板系统的部署架构如图2.4所示。Web层是一个基于PHP页面的Apache服务, 启动3个实例组成集群,为客户端(例如浏览器)对网站的访问提供负载均衡。Redis Master启动1个实例用于写操作(添加留言),RedisSlave启动两个实例用于读操作 (读取留言)。RedisMaster与Slave的数据同步由Redis具备的数据同步机制完成。
guestbook-php-frontend:PHP Web服务,在网页上展示留言的内容,也提供一个文 本输入框供访客添加留言。如图2.5所示为Hello World案例所采用的Kubernetes部署架构,这里Master与Node的 服务处于同一个虚拟机中。通过创建redis-master服务、redis-slave服务和php-frontend服 务来实现整个系统的搭建。
创建redis-master RC和Service
我们可以先定义Service,然后定义一个RC来创建和控制相关联的Pod,或者先定 义RC来创建Pod,然后定义与之关联的Service,这里我们采用后一种方法。首先为redis-master创建一个名为redis-master的RC定义文件redis-mastercontroller.yaml。yaml的语法类似于PHP的语法,对于空格的个数有严格的要求,详见 http://yaml.org。
apiVersion:
v1
kind:
ReplicationController
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:
kubeguide/redis-master
ports:
-
containerPort
:
6379
|
其中,kind字段的值为“ReplicationController”,表示这是一个RC;spec.selector是 RC的Pod选择器,即监控和管理拥有这些标签(Label)的Pod实例,确保当前集群上 始终有且仅有replicas个Pod实例在运行,这里我们设置replicas=1表示只运行一个(名 为redis-master的)Pod实例,当集群中运行的Pod数量小于replicas时,RC会根据 spec.template段定义的Pod模板来生成一个新的Pod实例,labels属性指定了该Pod的标 签,注意,这里的labels必须匹配RC的spec.selector,否则此RC就会陷入“只为他人做 嫁衣”的悲惨世界中,永无翻身之时。创建好redis-master-controller.yaml文件以后,我们在Master节点执行命令:kubectl create-f<config_file>,将它发布到Kubernetes集群中,就完成了redis-master的创建过 程:
$ kubectl create -f redis-master-controller.yaml
replicationcontroller
"redis-master"
created
|
系统提示“redis-master”表示创建成功。然后我们用kubectl命令查看刚刚创建的 redis-master:
$ kubectl get rc
NAME DESIRED CURRENT AGE
redis-master 1 1 5m
接下来运行kubectl get pods命令来查看当前系统中的Pod列表信息,我们看到一个 名为redis-master-xxxxx的Pod实例,这是Kubernetes根据redis-master这个RC的定义自动 创建的Pod。RC会给每个Pod实例在用户设置的name后补充一段UUID,以区分不同的实例。由于Pod的调度和创建需要花费一定的时间,比如需要一定的时间来确定调度到 哪个节点上,以及下载Pod的相关镜像,所以一开始我们看到Pod的状态将显示为 Pending。当Pod成功创建完成以后,状态会被更新为Running。如果Pod一直处于Pending 状态,则请参看第5章的查错说明。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
redis-master-b03io 1/1 Running 0 1h
redis-master Pod已经创建并正常运行了,接下来我们就创建一个与之关联的 Service(服务)定义文件(文件名为redis-master-service.yaml),完整的内容如下:
apiVersion:
v1
kind:
Service
metadata:
name:
redis-master
labels:
name:
redis-master
spec:
ports:
-
port
:
6379
targetPort:
6379
selector:
name:
redis-master
|
其中metadata.name是Service的服务名(ServiceName),spec.selector确定了选择哪 些Pod,本例中的定义表明将选择设置过name=redis-master标签的Pod。port属性定义的 是Service的虚拟端口号,targetPort属性指定后端Pod内容器应用监听的端口号。运行kubectl create命令创建该service:
$ kubectl create -f redis-master-service.yaml
service
"redis-master"
created
|
系统提示“service”redis-master“created”表示创建成功。然后运行kubectl get命令可 以查看到刚刚创建的service:
$ kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-master 169.169.208.57<none> 6379
/TCP
13m
|
REDIS_MASTER_SERVICE_HOST=169.169.144.74
REDIS_MASTER_SERVICE_PORT=6379
|