在正式介绍之前,大家有必要先理解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. kail linux 虚拟机安装实录(一) 新建虚拟机

    各位晚上好. 现在开始进行kail linux 在虚拟机上的安装. 我所使用的工具如下: kail linux 2.0   x64  http://mirrors.neusoft.edu.cn/kal ...

  2. 使用独立模式安装Sharepoint Server 2013出现创建示例数据错误的解决方案

    使用独立模式安装Sharepoint Server 2013,允许配置向导到第8步创建示例数据时,出错了! Exception: System.ArgumentException: The SDDL ...

  3. jQuery初探 jQuery选取和操纵元素的特点

    jQuery初探 jQuery选取和操纵元素的特点 JavaScript选取元素 先来看看不用jQuery的时候我们是怎么处理元素选取的. JavaScript选取元素的时候,可以根据id获取元素,当 ...

  4. 2016最新cocoapods安装流程,安装过程中遇到的问题及解决方法

    现在的cocoapods与之前比较.有很多不一样的地方.自己试了一试,终于搞定.现在大概纪录一下. 1.首先查看ruby是否是最新版的. ruby是通过rvm安装的所以需要先安装rvm后查看ruby是 ...

  5. 最新版Android开发工具

    最新版Android开发工具 JUN 27TH, 2014 Android Tools ADT Bundle ADT Bundle包含了Eclipse.ADT插件和SDK Tools,是已经集成好的I ...

  6. ORACLE外部表总结

    外部表介绍 ORACLE外部表用来存取数据库以外的文本文件(Text File)或ORACLE专属格式文件.因此,建立外部表时不会产生段.区.数据块等存储结构,只有与表相关的定义放在数据字典中.外部表 ...

  7. 不同环境下文件上传Uncaught SyntaxError: Unexpected end of input

    很奇怪的问题,相同的代码和相同的数据,在两台linux服务器上执行文件上传,一台正常上传,一台在ftl页面 报:Uncaught SyntaxError: Unexpected end of inpu ...

  8. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  9. 查看SQLserver编码格式的SQL语句

    SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage') 下面是查询结果: 简体中文GBK 繁体中文BIG5 美国/ ...

  10. linux下重启服务命令

    1.查找进程id命令 ps -ef | grep -v grep|grep bdse-tour-service-1.0-jar-with-dependencies.jar | awk '{print ...