1 Hello World

1.1 概述

  • 搭建一个Web留言板应用,采用PHP+Redis。
  • Redis由一个master提供写和两个slave提供读。
  • PHP构成的前端Web层由三个实例构成集群,访问时进行负载均衡。
  • 提供三个docker镜像
    • redis-master:写的redis
    • redis-slave:读的redis
    • php-fronted:PHP Web服务

1.2 创建redis-master Pod和服务

  • 为redis-master创建一个RC yaml文件
apiVersion:v1
kind:ReplicationController
metadata:
name:redis-master
labels:
name:redis-master
spec:
replicas:1 //一个副本
selector:
name:redis-master //该RC控制label中key=name&&value=redis-master的所有pod
template: //pod启动的模版
metadata:
labels:
name:redis-master
spec:
containers: //定义pod中的docker容器,可以有多个
- name:master
image:XXX/redis-master //指定容器镜像
ports:
- containerPort:6379
  • 通过kubectl create -f xxx.yaml 在Master节点执行命令
  • 定义一个Servicede yaml文件
apiVersion:v1
kind:Service
metadata:
name : redis-master
labels:
name : redis-master
spec:
ports:
- port : 6379 //Service暴露的虚端口
targetPort : 6379 //提供该服务的容器所暴露的端口
selector:
name : redis-master //该Service拥有label中key=name&&value=redis-master的所有pod
  • kubectl get rc/pods/services 可查看k8s中的rc/pod或service列表
  • k8s将分配给每个service一个ip,其他pod可通过ip+port访问对应的服务
  • k8s通过给新pod中增加环境变量设定服务的ip与端口实现服务名与ip地址的映射

1.3 创建redis-slavel Pod和服务

  • RC文件
apiVersion:v1
kind:ReplicationController
metadata:
name:redis-slave
labels:
name:redis-slave
spec:
replicas:2 //两个副本
selector:
name:redis-slave
template: //pod启动的模版
metadata:
labels:
name:redis-slave
spec:
containers: //定义pod中的docker容器,可以有多个
- name:master
image:XXX/redis-slave //指定容器镜像
env : //设定容器中的一个环境变量
- name : GET_HOSTS_FROM
value : env
ports:
- containerPort:6379
  • Service 文件
apiVersion:v1
kind:Service
metadata:
name : redis-slave
labels:
name : redis-slave
spec:
ports:
- port : 6379 //Service暴露的虚端口
selector:
name : redis-slave

1.4 创建frontend Pod与服务

  • RC配置文件与前面类似
  • PHP中获取redis的ip通过先读取$GET_HOSTS_FROM ,确定有结果为env 则从环境变量中根据服务名读取其ip与端口
  • 使用Service的NodePort给k8s集群的Service映射一个外网可访问的端口,即可通过NodeIp+NodePort访问集群中的服务
apiVersion : v1
kind : Service
metadata :
name : frontend
labels :
name : frontend
spec :
type : NodePort //指定NodePort模式暴露外网端口
ports :
- port : 80 //pod暴漏的端口
nodePort : 30001 //NodePort,用户访问的端口,默认为30000~32767
selector :
name : frontend

2 Kubernetes概念

2.1 Node(节点)

  • Node是k8s中相对与Master而言的工作主机,可以使物理主机、VM等
  • 运行Kubelet、kube-proxy和docker daemon
  • kubelet用于管理和启动Pod
  • Node运行状态{Pending,Running,Terminated}
  • k8s创建一个Node仅表示k8s在系统内部创建了一个Node对象,而后对其进行可否连通、服务是否启动等
  • Node的管理由Master中的Node Controller进行,主要功能是集群范围内的Node信息同步和单个Node的生命周期管理
  • Kubelet的--register-node=true时,Kubelet将自动想apiServer注册Node
  • k8s可以手动创建和修改Node对象

2.2 Pod

  • Pod是k8s操作的基本单元,包含一个或多个紧密相关的容器
  • Pod状态:
    • Pending:Pod正确定义,提交到了Master但所包含的镜像还未完全创建
    • Running:Pod已被分配某个Node上,且所有容器已成功运行
    • Successed:Pod中所有容器都成功结束,并且不会被重启
    • Failed:Pod中所有容器都结束,至少有一个容器是失败状态结束
  • k8s为Pod设计了一套独特的网络配置,为每个Pod分配一个IP地址,使用Pod名作为容器间通信的主机名等

2.3 Label

  • Label以key/value形式附加到Pos、Service、RC、Node等上面
  • 每个对象可以定义多个label,以提供Label Selector来选择对象
  • Label Selector有两种形式:
    • 基于等式,name=redis-slave选择k/v都相等的,env!=production选择k=env但是v!=production的
    • 基于集合,name [not] in (redis-master,redis-slave),类似于SQL中in

2.4 Replication Controller (RC)

  • RC用于定义Pod的副本的数量,在Master内通过Controller Manager进程通过RC的定义来完成Pod的创建、监控启停等操作。
  • k8s能确保在任意时刻都能运行用户指定的Pod数量,多了则停止某些Pod少了则增加
  • 删除RC并不会影响该RC已创建好的Pod,可以先设置RC的replicas为0,或者通过Kubelet提供的stop和delete命令

2.5 Service

  • 一个Service可以看作是一组提供服务的Pod的对外访问接口
  • Service通过Label Selector选择提供服务的Pod
  • Pod正常启动后系统会根据Service的定义创建出与Pod对应的Endpoint对象,以建立起Service与Pod的对应关系
  • 随着Pod的变化Service也会更新Endpoint对象
  • Pod IP是Docker Daemon根据docker0网桥的IP地址段分配,Service的Cluster IP地址则是k8s系统中的虚拟IP,系统动态分配
  • 外部访问Service
    • NodePort,定义Service时指定spec.type=NodePort并指定spec.ports.NodePort的值,k8s集群会在每个Node上打开一个主机上的真实端口
    • LoadBalancer,spec.type=LoadBalancer同时指定负载均衡器的IP
  • 一个服务暴露多个端口号
spec :
ports :[
{
name : http
protocol :tcp
port : 80
targetPort : 9376
},
{
name : https
protocol :tcp
port : 443
targetPort : 9377
}
]

2.6 Volume

  • Pod中能够被多个容器访问的共享目录,其生命周期与Pod相同跟容器无关。
  1. EmptyDir,Pod分配到Node时创建的,初始内容为空,Pod从Node中移除时EmptyDir数据永久删除。主要用于临时空间、CheckPoint临时保存目录等
  2. hostPath,在Pod上挂载宿主机上的文件或目录,主要用于需要永久保存的
kind : ReplicationController
....
spec :
....
template :
...
spec :
volumes :
- name : "Persistent-storage" //定义卷名
hostPath :
path : "/data" //宿主机路径
containers:
...
volumeMounts :
- name : "Persistent-storage" //对应Pod的卷名
mountPath : "/data" //容器挂载路径
  1. gcePersistentDisk,使用谷歌计算引擎上永久磁盘上的文件,写入数据永久保存。
  2. awsElasticBlockStore,使用Amazon提供的EBS Volume
  3. nfs,使用NFS(网络文件系统)提供的共享目录
  4. iscsi,使用iSCSI设备
  5. glusterfs,使用开源GlusterFS网络文件系统
  6. rbd,使用Linux块设备共享存储
  7. gitRepo,通过挂载一个空目录,从Git库clone一个git repository给Pod使用
  8. secret,一个secret volume用于为Pod提供加密的信息
  9. persistentVolumeClaim,从PersistentVolume中申请所需空间

2.7 Namespace

  • 系统内部对象都分配到一个Namespace,形成逻辑上的分组,默认为default
  • namespace定义
apiVersion : v1
kind : Namespace
metadata :
name : development //定义一个新的Namespace
  • 创建其他对象是在其定义的metadata.namespace指定对应namespace

2.8 Annotation

  • Annotation是用户任意定义的附加信息,以便于外部工具进行查找

3 Kubernetes总体架构

3.1 总体架构

  • Kubernetes集群由Master和Node两类节点组成。
  • Master上运行etcd、APIServer、Controller Manager和Scheduler,负责对集群中的所有资源进行管控和调度
  • Node上运行Kubelet、Proxy和Docker Daemon,负责对本节点的Pod的生命周期的管理

3.2 组件关系

  1. 通过Kubelet提交一个RC,该请求通过API Server被写入到etcd
  2. Controller Manager通过API Server的资源变化监听接口监听到这个RC事件,分析当前集群是否存在该Pod,如过需要创建则根据RC中的模版定义生成一个Pod对象,通过API Server写入到etcd中。
  3. 上部中写入Pod对象被Scheduler发现,其根据调度流程为这个Pod选定一个Node,称为绑定(Pod Binding),同时将结果通过API Server写入etcd
  4. 目标Node上的Kubelet通过API Server检测到新Pod后按照其定义启动该Pod,并管理其生命周期
  5. 当通过Kubelet提交一个映射到该Pod的Service创建请求,Controller Manager通过Label Selector查询相关Pod,生成Service的Endpoint通过API Server写入etcd
  6. Node中所有Proxy进程通过API Server查询并监听Service对象与其对应的Endpoints信息,建立一个软件方式的负载均衡器来实现Service访问到后端Pod的流量转发功能

3.3 组件功能

  • API Server:提供资源对象的唯一操作入口,其他组件必须通过其操作资源数据
  • Controller Manager:集群内部的管理控制中心,实现k8s集群的故障检测和恢复的自动化工作
  • Scheduler:集群中的调度器,负责Pod在集群节点中的调度分配
  • Kubelet:负责本Node节点上的Pod的创建、修改、监控、删除等,同时定时同步本Node的状态信息到API Server
  • Proxy:实现Service的代理及软件模式的负载均衡器

《Kubernetes权威指南》——入门的更多相关文章

  1. 《Kubernetes权威指南》01_Kubernetes入门——Kubernetes 是什么

    01_Kubernetes入门 li {list-style-type:decimal;}.wiz-editor-body ol.wiz-list-level2 > li {list-style ...

  2. Kubernetes权威指南 第一章:Kubernetes入门

    Kubernetes是什么 官网 https://kubernetes.io/ 中文版:https://kubernetes.io/zh/ Kubernetes是谷歌十几年大规模容器管理经验的成果 是 ...

  3. 《Kubernetes权威指南》——运维技巧

    1 Node的隔离和恢复 方法1: 创建新的Node配置文件指定spec.unschedulable: true 通过kubectl replace完成对Node的状态修改 kubectl repla ...

  4. 《Kubernetes权威指南》——网络原理

    1 Kubernetes网络模型 基本原则:每个Pod都拥有一个独立IP,而且假定所有Pod都在一个可以直接连通的.扁平的网络空间中. 基于基本原则,用户不需要额外考虑如何建立Pod之间的连接,也不需 ...

  5. 《Kubernetes权威指南》——Kubelet运行机制与安全机制

    1 Kubelet运行机制 Kubenetes集群中的每个Node节点都会启动一个Kubelet服务进程用于处理Master下发到该节点的任务,管理Pod及其中的容器 Kubelet进程在API Se ...

  6. 《Kubernetes权威指南》——组件原理

    1 API Server 1.1 提供集群管理的API接口 API Server在kubernetes中的进程名为apiserver,运行在Master节点上 apiserver开放两个端口 本地端口 ...

  7. Kubernetes权威指南学习笔记(一)

    https://blog.csdn.net/keysilence1/article/details/70239717 概念 Kubernetes是谷歌严格保密十几年的秘密武器——Borg的一个开源版本 ...

  8. 《Kubernetes权威指南第2版》学习(四)kubernetes基本概念和术语

    1: etcd是干什么的: 键-值存储仓库,用来配置共享和服务发现. k8s把Node, pod,replication controller, Services看做是资源对象,这些资源对象可以通过K ...

  9. 《Kubernetes权威指南第2版》学习(三)RC学习

    1 RC文件介绍: kind: ReplicationController,表示是一个RC: spec.selector:  RC的Pod标签(Label)选择器,监控和管理拥有这些标签的Pod实例, ...

随机推荐

  1. 2018-2019-2 20175234 实验一 Java开发环境的熟悉(Linux + IDEA)

    目录 20175234 实验一 Java开发环境的熟悉(Linux + IDEA) 第一部分 代码及运行结果截图 第二部分 要求 代码及截图 第三部分 题目 需求分析 设计 程序及运行结果 问题和解决 ...

  2. SQL Server 2008 R2 链接 Oracle

    参考网站: SP_addlinkedserver 小结 (oracle,sql server,access,excel) 64位SqlServer通过链接服务器与32位oracle通讯 SQL Ser ...

  3. 23. pt-slave-delay

    略过,用原生的延迟复制: stop slave; change master to master_delay=5; start slave;

  4. rapidjson 的练习

    // JsonCpp.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string> #include < ...

  5. 第一次spring会议

    1.今天查询了很多案例,找到了符合我们要求的案例,并进行了尝试. 2.昨天拍摄了宣传视频. 3.明天准备用C#限定格式输出TXT文件.

  6. C# WebService服务器搭建、发布、上线、调试

    C#  WebService服务器搭建.发布.上线.调试 1. WebService服务器搭建 开发环境选择VS2017版本 步骤1:打开VS,文件->新建 ->项目->ASP.NE ...

  7. HQL-Query接口

    org.hibernate.Query接口 1.Query接口定义有执行查询的方法(完成HQL语句的解析和执行过程并返回查询结果,就像SQL语句没了JDBC接口就成了一个普通的字符串变量) 2.Que ...

  8. 2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)

    传送门 题意:支持单点修改,维护子树里的最大连通子块和. 思路: 扯皮: bzojbzojbzoj卡常差评. 网上的题解大多用了跟什么最大子段和一样的转移方法. 但是我们实际上是可以用矩阵转移的传统d ...

  9. 使用itext生成pdf的,各种布局

    代码如下,jar包为itext.jar,itextAsia.jar,最好都是最新的 :2张图片也在最后贴出,把图片放到D盘可以直接生成制定格式的pdf. 最后生成的pdf如下: 代码如下: packa ...

  10. InternalResourceViewResolver视图解析器(转)

    转载地址:https://www.cnblogs.com/liruiloveparents/p/5054605.html springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就 ...