- redis-master:用于前端web应用进行“写”留言操作的Redis服务,其中已经保存了一条内容为“hello world”的留言;
- guestbook-redis-slave:用于前端web应用进行“读”留言的redis服务,并与Redis-master的数据保持同步;
- guestbook-php-frontend:PHP web服务,在网页上展示留言的内容,也提供一个文本输入框供访客添加留言;
一、创建redis-master RC和Service
#docker pull kubeguide/redis-master
首先为redis-master创建一个名为redis-master的RC定义文件redis-master-controller.yaml,对于空格有严格的要求
vi redis-master-controller.yaml
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实例,label属性指定了该Pod的标签,注意,这里的labels必须匹配RC的spec.selector,否则此RC就会陷入“只为他人做嫁衣”的悲惨世界中,永无翻身之时。
创建好redis-master-controller.yaml文件以后,就在Master节点执行命令:
#kubectl create -f redis-master-controller.yaml
将它发布到kubernetes集群中,就完成了redis-master的创建。
#kubectl get rc
#kubectl get pods
接下来运行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状态,需要排查下问题。
接下来创建一个与之关联的Service(服务),定义文件redis-master-service.yaml
vi 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的服务名,spec.selector确定了选择那些Pod,本例中的定义表明将选择设置过name=redis-master标签的Pod。port属性定义的是Service娿虚拟端口号,targetPort属性指定后端Pod内 容器应用监听的端口号。
创建该service
#kubectl create -f redis-master-service.yaml
#kubectl get services
[root@ceph-cent7-2 docker]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-master 10.254.248.1
6379/TCP 1h
注意到redis-master服务被分配了一个值为10.254.248.1的虚拟IP地址,随后,kubernetes集群中其他新创建的Pod就可以通过这个虚拟IP地址+端口6379来访问这个服务了,在本例中将要创建的redis-slave和frontend两组Pod都将通过10.254.248.1:6379来访问redis-master服务。
二、创建redis slave RC和Service
vi redis-slave-controller.yaml
apiVersion: v1
kind: ReplicationController
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: kubeguide/guestbook-redis-slave
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort: 6379
#kubectl create -f redis-slave-controller.yaml
#kubectl get rc
#kubectl get pods
vi redis-slave-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
ports:
- port: 6379
selector:
name: redis-slave
#kubectl create -f redis-slave-service.yaml
#kubectl get services
三、创建frontend RC和Service
vi frontend-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: frontend
labels:
name: frontend
spec:
replicas: 2
selector:
name: frontend
template:
metadata:
labels:
name: frontend
spec:
containers:
- name: frontend
image: kubeguide/guestbook-php-frontend
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort: 80
#kubectl create -f frontend-controller.yaml
#kubectl get rc
#kubectl get pods
vi frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
name: frontend
spec:
type: NodePort
ports:
- port: 80
nodePort: 30002
selector:
name: frontend
#kubectl create -f frontend-service.yaml
#kubectl get svc
四、通过浏览器访问frontend页面
http://虚拟机IP:30002
将打开页面,可以输入文件单击submit按钮提交
通过Guestbook示例,可以看到kubernetes强大的应用管理功能,用户仅需要通过几个简单的YAML配置文件就能完成复杂的系统搭建,并能够通过kubernetes自动实现服务发现和负载均衡。