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

Kubernetes系列03:Guestbook示例:Hello World详解_第1张图片

  • 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自动实现服务发现和负载均衡。

你可能感兴趣的:(docker)