您的位置:首页 > 产品设计 > UI/UE

Kubernetes系列03:Guestbook示例:Hello World详解

2017-04-18 19:45 218 查看


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     <none>        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自动实现服务发现和负载均衡。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐