在正式介绍之前,大家有必要先理解Kubernetes几个核心概念及其承担的功能。以下为Kubernetes的架构设计图:

1. Pods
在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod,Pod是一个被创建、销毁、调度、管理的最小的部署单元。比如一个或一组容器。
2. Replication Controllers
Replication Controller是Kubernetes系统中最有用的功能,实现复制多个Pod副本,往往一个应用需要多个Pod来支撑,并且可以保证其复制的副本数,即使副本所调度分配的宿主机出现异常,通过Replication Controller可以保证在其它主宿机启用同等数量的Pod。Replication Controller可以通过repcon模板来创建多个Pod副本,同样也可以直接复制已存在Pod,需要通过Label selector来关联。
3. Services
Services是Kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的Pod资源,目前的版本是通过iptables的nat转发来实现,转发的目标端口为Kube_proxy生成的随机端口,目前只提供GOOGLE云上的访问调度,如GCE。如果与我们自建的平台进行整合?请关注下篇《kubernetes与HECD架构的整合》文章。
4. Labels
Labels是用于区分Pod、Service、Replication Controller的key/value键值对,仅使用在Pod、Service、Replication Controller之间的关系识别,但对这些单元本身进行操作时得使用name标签。
5. Proxy
Proxy不但解决了同一主宿机相同服务端口冲突的问题,还提供了Service转发服务端口对外提供服务的能力,Proxy后端使用了随机、轮循负载均衡算法。
说说个人一点看法,目前Kubernetes 保持一周一小版本、一个月一大版本的节奏,迭代速度极快,同时也带来了不同版本操作方法的差异,另外官网文档更新速度相对滞后及欠缺,给初学者带来一定挑战。在上游接入层官方侧重点还放在GCE(Google Compute Engine)的对接优化,针对个人私有云还未推出一套可行的接入解决方案。在v0.5版本中才引用service代理转发的机制,且是通过iptables来实现,在高并发下性能令人担忧。但作者依然看好Kubernetes未来的发展,至少目前还未看到另外一个成体系、具备良好生态圈的平台,相信在V1.0时就会具备生产环境的服务支撑能力。

1.Kubernetes介绍

1.1 简介
Kubernetes是什么?
首先,它是一个全新的基于容器技术的分布式架构领先方案。
其次,它是一个开放的开发平台。
最后,它是一个完备的分布式系统支撑平台。
Kubernetes是Google团队发起的开源项目,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩,主要实现语言为Go语言。
Kubernetes特点是:
•易学:轻量级,简单,容易理解
•便携:支持公有云,私有云,混合云,以及多种云平台
•可拓展:模块化,可插拔,支持钩子,可任意组合
•自修复:自动重调度,自动重启,自动复制。
Kubernets目前在https://github.com/kubernetes/kubernetes进行维护。
1.2 基本概念
•Node(节点):在Kubernetes中,节点是实际工作的点,较早版本称为Minion。节点可以是虚拟机或者物理机器,依赖于一个集群环境。每个节点都有一些必要的服务以运行Pod容器组,并且它们都可以通过主节点来管理。在Node上运行的服务进程包括docker daemon,Kubelet和 Kube-Proxy。
•Pod(容器组):是Kubernetes的基本操作单元,把相关的一个或多个容器构成一个Pod,通常Pod里的容器运行相同的应用。Pod包含的容器运行在同一个节点上,看作一个统一管理单元,共享相同的volumes和network namespace/IP和Port空间。
•Pod的生命周期:Pod的生命周期是通过Replication Controller来管理的。在整个过程中,Pod处于4种状态之一:Pending, Running, Succeeded, Failed。
•Replication Controller(RC):用于定义Pod副本的数量。确保任何时候Kubernetes集群中有指定数量的Pod副本在运行, 如果少于指定数量的Pod副本,Replication Controller会启动新的Pod,反之会杀死多余的以保证数量不变。
•Service(服务):一个Service可以看作一组提供相同服务的Pod的对外访问接口。
•Volume(存储卷):Volume是Pod中能够被多个容器访问的共享目录。
•Label(标签):用于区分Pod、Service、Replication Controller的key/value键值对,Pod、Service、 Replication Controller可以有多个label,但是每个label的key只能对应一个value。Labels是Service和Replication Controller运行的基础,为了将访问Service的请求转发给后端提供服务的多个容器,正是通过标识容器的labels来选择正确的容器。同样,Replication Controller也使用labels来管理通过pod 模板创建的一组容器,这样Replication Controller可以更加容易,方便地管理多个容器,无论有多少容器。
•Proxy(代理):是为了解决外部网络能够访问跨机器集群中容器提供的应用服务而设计的。Proxy提供TCP/UDP sockets的proxy,每创建一种Service,Proxy主要从etcd获取Services和Endpoints的配置信息,或者也可以从file获取,然后根据配置信息在Minion上启动一个Proxy的进程并监听相应的服务端口,当外部请求发生时,Proxy会根据Load Balancer将请求分发到后端正确的容器处理。
•Namespace(命名空间):通过将系统内部的对象“分配”到不同的Namespace中,形成逻辑上的不同分组,便于在共享使用整个集群的资源同时还能分别管理。
•Annotation(注解):与Label类似,但Label定义的是对象的元数据,而Annotation则是用户任意定义的“附加”信息。
1.3 组件
1.3.1 Master运行三个组件:
•apiserver:作为kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTFul接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)。
•scheduler:负责集群的资源调度,为新建的Pod分配机器。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。
•controller-manager:负责执行各种控制器,目前有两类:
(1)endpoint-controller:定期关联service和Pod(关联信息由endpoint对象维护),保证service到Pod的映射总是最新的。
(2)replication-controller:定期关联replicationController和Pod,保证replicationController定义的复制数量与实际运行Pod的数量总是一致的。
1.3.2 Worker运行两个组件:
•kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的Pod,并根据Pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报Pod的运行状态。
•proxy:负责为Pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户Pod要访问其他Pod时,访问请求会经过本机proxy做转发。

2.快速安装Kubernetes

2.1 关闭防火墙
     systemctl disable firewalld
     systemctl stop firewalld
2.2 安装etcd和Kubernetes
     vi  virt7-docker-common-release.repo

[virt7-docker-common-release]
name=virt7-docker-common-release
baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/
gpgcheck=0
      yum install -y etcd kubernetes    (docker版本冲突请先卸载)
Dependencies Resolved
================================================================================================
 Package                     Arch       Version                                Repository  Size
================================================================================================
Installing:
 kubernetes                  x86_64     1.2.0-0.9.alpha1.gitb57e8bd.el7        extras      34 k
Installing for dependencies:
 docker                      x86_64     1.9.1-25.el7.centos                    extras      13 M
 docker-forward-journald     x86_64     1.9.1-25.el7.centos                    extras     824 k
 docker-selinux              x86_64     1.9.1-25.el7.centos                    extras      70 k
 kubernetes-client           x86_64     1.2.0-0.9.alpha1.gitb57e8bd.el7        extras     9.3 M
 kubernetes-master           x86_64     1.2.0-0.9.alpha1.gitb57e8bd.el7        extras      15 M
 kubernetes-node             x86_64     1.2.0-0.9.alpha1.gitb57e8bd.el7        extras     9.3 M
 socat                       x86_64     1.7.2.2-5.el7                          base       255 k
Transaction Summary
================================================================================================
Install  1 Package (+7 Dependent packages)
Installed:
  kubernetes.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7                                           
Dependency Installed:
  docker.x86_64 0:1.9.1-25.el7.centos                                                           
  docker-forward-journald.x86_64 0:1.9.1-25.el7.centos                                          
  docker-selinux.x86_64 0:1.9.1-25.el7.centos                                                   
  kubernetes-client.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7                                    
  kubernetes-master.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7                                    
  kubernetes-node.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7                                      
  socat.x86_64 0:1.7.2.2-5.el7                                                                  
Complete!
2.3 修改配置
 
      vim /etc/sysconfig/docker
      修改为OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
      vim /etc/kubernetes/apiserver
      删除ServiceAccount   KUBE_ADMISSION_CONTROL="--admission
      -control=NamespaceLifecycle,NamespaceExists,LimitRanger,ServiceAccount,SecurityContextDeny,ResourceQuota"
2.4 启动服务
     systemctl start etcd
     systemctl start docker
     systemctl start kube-apiserver
     systemctl start kube-controller-manager
     systemctl start kube-scheduler
     systemctl start kubelet
     systemctl start kube-proxy

3.Guestbook部署

•redis-master: 用于前端Web应用进行“写”留言的操作,其中已经保存了一条内容为“Hello World!”的留言。
•guestbook-redis-slave: 用于前端Web应用进行“读”留言的操作,并与redis-master的数据保持同步。
•guestbook-php-frontend: PHP Web服务,在网页上展示留言内容,也提供一个文本输入框供访客添加留言。

3.1 下载镜像
      #docker pull kubeguide/redis-master
      #docker pull kubeguide/guestbook-redis-slave
      #docker pull kubeguide/guestbook-php-frontend

REPOSITORY                                   TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

        docker.io/kubeguide/guestbook-php-frontend   latest              38658844a359        7 months ago        509.6 MB
        docker.io/kubeguide/redis-master             latest              423e126c2ad4        8 months ago        419.1 MB
        docker.io/kubeguide/guestbook-redis-slave    latest              00206e07dd92        8 months ago        109.5 MB
 
3.2 设置工作目录
      #mkdir kube-guestbook
      #cd kube-guestbook
 
3.3 创建redis-master Pod和服务
     #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: docker.io/kubeguide/redis-master 
                      ports: 
                      - containerPort: 6379

         创建redis-master Pod

        #kubectl create -f redis-master-controller.yaml
        #kubectl get pods
       一开始pod在pending状态
       [root@CentOS7 kube-guestbook]# kubectl get pods
       NAME                 READY     STATUS              RESTARTS   AGE
       redis-master-7i338   0/1       ContainerCreating   0          47s
       第一次启动容器时间比较久,如果没什么问题,状态会更新为Running
       [root@CentOS7 kube-guestbook]# kubectl get pods
       NAME                 READY     STATUS    RESTARTS   AGE
       redis-master-7i338   1/1       Running   0          11m
       #vi redis-master-service.yaml

apiVersion: v1

       kind: Service
       metadata:
           name: redis-master
           labels:
              name: redis-master
       spec:
       ports:
       # the port that this service should serve on
       - port: 6379
       targetPort: 6379
       selector:
          name: redis-master   
创建redis-master服务
#kubectl create -f redis-master-service.yaml
#kubectl get services

[root@CentOS7 kube-guestbook]# kubectl get services

NAME           CLUSTER_IP     EXTERNAL_IP   PORT(S)    SELECTOR            AGE
kubernetes     10.254.0.1     <none>        443/TCP    <none>              8d
redis-master   10.254.137.9   <none>        6379/TCP   name=redis-master   7s
 
3.4 创建redis-slave Pod和服务
#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: docker.io/kubeguide/guestbook-redis-slave
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 6379
创建redis-slave Pod
#kubectl create -f redis-slave-controller.yaml
#kubectl get rc
CONTROLLER     CONTAINER(S)   IMAGE(S)      SELECTOR                        REPLICAS  AGE
redis-master   master  docker.io/kubeguide/redis-master  name=redis-master   1    26m
redis-slave slave docker.io/kubeguide/guestbook-redis-slave name=redis-slave  2    10s
# kubectl get pods
NAME                 READY     STATUS    RESTARTS   AGE
redis-master-7i338   1/1       Running   0          27m
redis-slave-jju81    1/1       Running   0          28s
redis-slave-yzzmd    1/1       Running   0          28s
# 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
创建redis-slave服务
#kubectl create -f redis-slave-service.yaml
#kubectl get services
# kubectl get services
NAME           CLUSTER_IP       EXTERNAL_IP   PORT(S)    SELECTOR            AGE
kubernetes     10.254.0.1       <none>        443/TCP    <none>              8d
redis-master   10.254.137.9     <none>        6379/TCP   name=redis-master   13m
redis-slave    10.254.181.125   <none>        6379/TCP   name=redis-slave    7s
 
3.5 创建frontend Pod和服务
# vi frontend-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  replicas: 3
  selector:
    name: frontend
  template:
    metadata:
      labels:
        name: frontend
    spec:
      containers:
      - name: php-redis
        image: docker.io/kubeguide/guestbook-php-frontend
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 80
创建frontend Pod
#kubectl create -f frontend-controller.yaml
#kubectl get rc
CONTROLLER     CONTAINER(S)   IMAGE(S)          SELECTOR            REPLICAS   AGE
frontend php-redis docker.io/kubeguide/guestbook-php-frontend name=frontend 3          7s
redis-master   master         docker.io/kubeguide/redis-master             name=redis-master   1          36m
redis-slave    slave          docker.io/kubeguide/guestbook-redis-slave    name=redis-slave    2          9m
# kubectl get pods
NAME                 READY     STATUS    RESTARTS   AGE
frontend-00drw       1/1       Running   0          2m
frontend-78d16       1/1       Running   0          2m
frontend-z2fmk       1/1       Running   0          2m
redis-master-7i338   1/1       Running   0          38m
redis-slave-jju81    1/1       Running   0          12m
redis-slave-yzzmd    1/1       Running   0          12m
# vi frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort:30001    
  selector:
    name: frontend
创建frontend服务
#kubectl create -f frontend-service.yaml
#kubectl get services
NAME           CLUSTER_IP       EXTERNAL_IP   PORT(S)    SELECTOR            AGE
frontend       10.254.131.102   nodes         80/TCP     name=frontend       19s
kubernetes     10.254.0.1       <none>        443/TCP    <none>              8d
redis-master   10.254.137.9     <none>        6379/TCP   name=redis-master   30m
redis-slave    10.254.181.125   <none>        6379/TCP   name=redis-slave    17m
 
3.6通过浏览器访问网页
访问主机30001端口,我们看到网页已经默认有一条Hello World!
3.7停止Pod和服务
kubectl stop rc redis-master
kubectl stop rc redis-slave
kubectl stop rc frontend
kubectl delete service redis-master
kubectl delete service redis-slave
kubectl delete service frontend
3.8 其他
kubectl get node  获取节点
kubectl describe node xxx    详细信息

基于redis和docker的guestbook留言簿案例的更多相关文章

  1. redis,docker和kubernetes留言簿案例实战

    kubernetes实战-基于redis和docker的留言簿案例 [置顶] kubernetes实战-基于redis和docker的留言簿案例 标签: dockerkubernetesredis 2 ...

  2. 基于redis分布式缓存实现(新浪微博案例)

    第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来 ...

  3. 基于redis分布式缓存实现(新浪微博案例)转

    第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来 ...

  4. Kubernetes5-集群上搭建基于redis和docker的留言薄

    一.简介 1.环境依旧是kubernetes之前文章的架构 2.需要docker的镜像 1)php-forntend web 前端镜像 docker.io-kubeguide-guestbook-ph ...

  5. 基于redis的cas实现

    cas是我们常用的一种解决并发问题的手段,小到CPU指令集,大到分布式存储,都能看到cas的影子.本文假定你已经充分理解一般的cas方案,如果你还不知道cas是什么,请自行百度 我们在进行关系型数据库 ...

  6. 基于redis的乐观锁实践

    redis真是一个分布式应用场景下的好东西,对于我们的应用设计,功劳大大的! 今天要研究的是基于redis的事务机制以及watch指令(CAS)实现乐观锁的过程. 所谓乐观锁,就是利用版本号比较机制, ...

  7. PHP基于Redis实现轻量级延迟队列

    延迟队列,顾名思义它是一种带有延迟功能的消息队列. 那么,是在什么场景下我才需要这样的队列呢? 一.背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节 ...

  8. redixdb 基于redis 协议的实时key-value 存储

    redixdb 是一个基于redis 协议搞的一个实时key value 处理的轻量级应用,支持多种后端 存储模型. 以下是一个小版的容器镜像(官方的太大了) dockerfile   FROM go ...

  9. 基于Redis的Service缓存实现

    项目中有使用到缓存,每次需要将缓存代码和业务代码杂糅在一起,以及分散各处的key,严重影响代码的可读性.以下是使用AOP对其简单尝试.直接上代码: 1.定义缓存注解: @Target(ElementT ...

随机推荐

  1. IE8兼容模式设置

    设置---兼容性视图设置--添加此网站--在IE8中调试(防止调整IE内核后浏览器崩溃,360可通过设置极速模式-兼容模式  点击地址栏绿色图标)

  2. JavaScript区分click事件和mousedown(mouseup、mousemove)方法

    在前端开发工作中,会遇到这样问题:针对同一个dom元素,即希望为它绑定click事件,又想该元素可以允许拖拽的效果.而使用拖拽的效果,我们一般就会用到mousedown,mousemove和mouse ...

  3. UITableView优化

    作为iOS开发,UITableView可能是平时我们打交道最多的UI控件之一,其重要性不言而喻. 关于TableView,我想最核心的就是UITableViewCell的重用机制了. 简单来说呢就是当 ...

  4. 关于reids

    redis 官网(英文):https://redis.io/ redis 手册(中文): http://doc.redisfans.com/ redis 中文网(中文) : http://www.re ...

  5. 开发者调试工具Chrome Workspace

    Workspace是个什么样的东西呢?他能够在开发者工具中调试修改js或者css同时自动保存文件,能够避免开发人员在工具中调试好,再到编辑器中修改一次代码的重复操作,能够提高一定的效率 配置Chrom ...

  6. There is insufficient system memory to run this query 错误

    服务器环境大致情况如下: 操作系统:   Microsoft Windows Server 2003 R2 Enterprise Edition Service Pack 2 数据库  :   Mic ...

  7. EasyUI 中点击取消按钮关闭Dialog(对话框窗口)

    <div id="dl1" class="easyui-dialog" title="窗口"style="width:400 ...

  8. OpenGL ES无法获取贴图数据原因

    最近在做一个项目,要从贴图中获取图像数据,查了很多资料,也琢磨很久,获取到的数据都是0.终于在一次偶然的机会,发现了端倪,成功了. 不得不说这"一分灵感"真的很重要 以下是在获取贴 ...

  9. SSTABLE简介

    SSTABLE数据组织:http://blog.csdn.net/tankles/article/details/7663905

  10. JS实现类似QQ好友头像hover时显示资料卡的效果

    一.应用场景 鼠标hover弹出div,并且鼠标离开后不能马上隐藏,因为这个div上还有功能入口.比如: 鼠标经过好友列表中的好友头像时显示资料卡的效果 hover时显示二维码 二.实现 用如下这样一 ...