Kubernetes理论基础
Kubernetes理论基础
Kubernetes定义
kubernetes是Google开源的容器集群管理系统,2014年6月开源。在Docker技术之上,为容器应用提供资源调度、部署运行、服务发现、扩容缩容、等功能,可以看做是基于容器的micro-pass平台,pass的代表性项目。
Kubernetes特性
- 强大的容器编排能力
- 轻量级
- 开放开源
Kubernetes核心概念
1. Pod
Pod是若干容器的组合,一个Pod内的容器都必须运行在同一台宿主机上,这些容器使用相同的命名空间,IP地址和端口,可以通过localhost互相发现和通信。可以共享一块存储卷空间。是Kubernetes中最小的管理单位。通过Pod更高层次的抽象,提供了更加灵活的管理方式。
2. Service
Service是应用服务的抽象,定义了Pod的逻辑上的集合和访问Pod集合的策略。Service将代理Pod对外表现为一个单一的访问接口,外部不需要了解Pod如何运行,这给扩展和维护带来很多好处,提供了一套简化的服务代理和发现机制
例如:
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
ports:
- port: 8080
selector:
tier: fronted
上面定义一个名为 "tomcat-service" 的Service,服务端口为8080,所有拥有"fronted"的这个Label的所有Pod实例都属于这个Service。即所有 tomcat-service的流量都会被转发到这些Pod
3. Replication Controller(RC)
顾名思义"RC"用来控制做复制控制,确保用户定义的Pod副本数保持不变。RC是弹性伸缩、滚动升级的核心。
例如:
apiVersion: v1
kind: ReplicationContorller
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: ningx
spec:
containers:
- name: nginx
- images: nginx
ports:
- containerPort: 80
上面展示了创建三个nginx的Pod,Kubernetes中Controller Manger会尽量将拥有"app: nginx"标签的三个Pod会分布不同的Node上,保证集群中总是会有符合RC定义的数量的Pod。当任意一个Pod、或者所属的Node出现问题,Controller Manager会自动创建新的Pod。
可以通过控制RC来控制Pod的副本数量,来达到动态缩放的目的:
kebectl scale rc nginx --replicas=1
RS 和 RC 什么关系 ?
4. Replica Sets (RS)
ReplicaSet(RS)是 RC 的升级版,它们的区别是对选择器的支持。RS支持 labels user guide中描述的set-based选择器要求,而 RC 仅仅支持qeuality-based的选择器要求。(看一眼超链接内容、或者下文Label的内容)
RS 虽然可以单独使用,但是还是被Deployments用作Pod的创建、删除、更新。使用Deployment时,不必关心RS。可以通过Deployment管理RS。
RS 和 RC都是确保运行指定数量的Pod。Deployment 是一个更高层次的概念,可以管理RS,并且提供对Pod更新等功能,建议使用Deployment来管理RS。
RS 对我是隐藏的? 直接使用Deployment来管理?
5. Deployment
Deployment是为了更好的解决Pod的编排问题,在内部使用RS(RC升级版)来实现目的。在Deployment中描述目标状态,Deployment Controller就会自动实现Deploymen中描述的目标状态,并指导当前Pod的进度状态。(部署是否完成)
Deployment创建的对象不能手动进行管理!
例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
可以看到上面并没有RS/RC的配置。但是Deployment会自动使用RS的方式创建Pod和Pod副本。
6. Label
Label就是一对 key/value,可以被关联到对象(Node、Pod、Service、RS),一个对象可以关联任意数量的Label,同一个Label也可以被关联到任务数量的对象上。通常在定义对象时确定,也可以创建对象后动态添加删除。
可以通过对象的Label来实现多维度的资源分组管理,可以方便的进行资源分配、调度、配置、部署等管理工作。常用的Label如下:
* 版本标签release: stable、canary
* 环境标签env: dev、production
* 架构标签tier: frontend、backend、middleware
* 分区标签partition: customerA、customerB
* 质量管控标签track: daily、weekly Master
Selector可以理解为SQL查询语句中的where条件,在定义定义Service、RC/RS、Deployment时,指定相应的Label就会和自动对应的Pod对象。
7. Horizontal Pod Autoscaler(HPA)
上面说到可以通过命令(kebectl scale)手动调节Pod的数量上限扩容缩容,显然这不够自动化。从Kubernetes1.1版本开始,HPA功能被当做重量级特性推出。与RC、Deployment一样,都属于Kubernetes的一种资源对象,通过追踪分析RC控制的所有目标Pod的负载情况针对性的调整目标Pod的副本数量(实现原理?)。
Pod负载度量指标:
* CPUutilizationPercentage
这是一个算数平均值,即所有Pod的自身CPU利用率的平均值。
* 应用自定义指标(TPS/QPS)
8. Master
Master是Kubernetes集群中的控制节点,一般会独自占据一个服务器,Master节点上有以下关键组件:
Kubernetes API server (kube-apiserver), http rest接口的关键进程,是所有操作指令的唯一入口。
Kubernetes Controller Manager(kube-controller-manager), 所有资源对象的自动化控制中心。
Kubernetes Scheduler (kkube-scheduler,负责资源(Pod)的调度。Pod的"调度室"
9. Node
Node可以理解为Kubernetes集群中的计算节点/工作节点,当某个Node宕机时,这个Node节点上的负载会自动转移到其他节点上去。Node节点上有一下关键组件:
kubelet: Pod 对应的容器创建、启停、等
kube-proxy: 实现 Service的通信与负载均衡机制的重要组件
docker: e,就是docker
10. Namespace
当团队或者项目中有多个用户时,可以使用Namepace来区分,namespace是一种将集群资源划分多个用途的方法。主要用于实现多租户的资源隔离,通过Namespace将集群内部资源对象分配到不同的Namespace中。形成逻辑上的分组,Kubernetes集群启动后会自动创建一个"default"的namespace。
11. Volume
Volume(存储卷)可以被理解为Pod中的共享目录,volume被定义在Pod上,Pod内的容器可以访问挂载。volume与Pod的生命周期相同,与具体的docker 容器生命周期不相关,某个docker容器删除或停止时,Volume中的数据不回丢失,volume支持很多种类型文件系统,GFS/Ceph/NFS。
在Kubernetes中volume有几种类型:
1. emptyDir: 无需指定对应宿主机上的目录文件、无需永久保留的临时目录,跟随Pod的移除而被移除。
2. hostPath: 为Pod挂载宿主机上的文件或目录,使用宿主机的文件系统存储,这样的方式Kubernetes无法对宿主机上的资源纳入管理(比如资源配额),各个Node节点上的目录文件不同而导致Valume的访问结果不一致。
3. gcePersistentDisk: Google共有云提供的永久磁盘。
4. awsElasticBloukStore: AWS提供的 EBS Volume存储。
5. NFS: 网络文件存储系统
6. iscsi: iscsi 存储设备
7. flocker: Flocker ??
8. glusterfs: 开源的ClusterFS网络文件存储系统
9. rbd: Linux 块设备共存存储
10. gitRepo: 从GIT 库cone一个git repository 给Pod用
11. secret: Kubernetes中一种保存机密信息的volume,Pod通过挂载的方式获取账号密码信息
Kubernetes的服务发现机制
Kubernetes中的每个Service都有一个唯一的Cluster IP 和唯一的名字,名字是开发者自己定义,部署的时候也不会改变,可以固定在配置中,所以这个问题就是:用Service 名字找到对应Cluster IP。
老的解决方案中需要设置一大堆环境变量,每个Service创建时就会生成对应的环境变量,然后Service中的每个Pod启动时就会加载这些变量。在后来的版本中引入了DNS系统,把服务名作为DNS域名,这样程序就可以直接使用服务名来建立通信。
外部系统访问Service的问题
Kubernetes集群中有三种IP:
Node IP:Node 计算节点的IP
Pod IP:Pod 的IP地址
Cluster IP: Service 的IP地址
解释
Node IP 是集群中每个物理节点的IP地址,是真实存在于物理网络中的。
Pod IP 是每个Pod的IP地址,是docker 根据docker0 网桥的IP地址段进行分配的,是衣蛾虚拟的二层网络。Kubernetes集群中要求位于不同Node上的Pod能够直接通信,所以一个Pod内的容器和另一个Pod内的容器通信就是通过Pod IP 所在的虚拟二层网络完成的。而实际的TCP/IP流量测试通过Node IP所在屋里网卡流出的。
Cluster IP 属于Service,也是一个虚拟的IP地址。仅仅作用于Kubernetes Service 这个对象、无法ping、只能和Service Port组成一个具体的通信端口。Kubernetes集群外部无法直接使用个IP,而当服务必须被外部访问时,可以采用NodePort 的方法。
例如:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
ports:
- port: 8080
nodePort: 31002
selector:
tier: frontend
我们访问http://Node:31002 即可
NodePort 衍生的负载均衡问题
NodePort的方式在每个Node节点上开放了端口,想让用户的请求转发到这些Node上的端口,就需要一个负载均衡器。负载均衡器可以在Kubernetes集群内部,还是也可以在集群外部?
在集群外部,比如GCE公有云,只要把Service的type=NodePort改为type=LoadBalancer,Kubernetes就会自动创建一个对应的Load balancer,并返回他的IP地址供外部客户端使用。其他云看支不支持了。
最后,可以通过 NodePort、LB、Ingress(还没研究)这三个方式?
参考:
http://www.k8smeetup.com/article/E1eohwDEzm
国内开源的K8s相关平台:
Kubernetes理论基础的更多相关文章
- kubernetes理论基础#开始入坑啊!
什么是kubernetes 首先,他是一个全新的基于容器技术的分布式架构领先方案.Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg).在Docker技术的基础上, ...
- Kubernetes 网络排错指南
本文介绍各种常见的网络问题以及排错方法,包括 Pod 访问异常.Service 访问异常以及网络安全策略异常等. 说到 Kubernetes 的网络,其实无非就是以下三种情况之一 Pod 访问容器外部 ...
- Kubernetes的本质
在前面的四篇文章中,我以 Docker 项目为例,一步步剖析了 Linux 容器的具体实现方式.通过这 些讲解你应该能够明白:一个“容器”,实际上是一个由 Linux Namespace.Linux ...
- kubernetes实战篇之Dashboard的访问权限限制
系列目录 前面我们的示例中,我们创建的ServiceAccount是与cluster-admin 绑定的,这个用户默认有最高的权限,实际生产环境中,往往需要对不同运维人员赋预不同的权限.而根据实际情况 ...
- 为什么要用Kubernetes?
1.前言 第一次接触Kubernetes是在2016年,再一次浏览博文的时候,那是我第一次听到Kubernetes这个名词,也是第一次认识了k8s这么一个东西.后来在慢慢了解它的时候,被它天生高可用. ...
- Kubernetes 入门必备云原生发展简史
作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 "未来的软件一定是生长于云上的"这是云原生理念的最核心假设.而所谓"云原生",实际上就是在定义一条能 ...
- kubernetes dashboard访问用户添加权限控制
前面我们在kubernetes dashboard 升级之路一文中成功的将Dashboard升级到最新版本了,增加了身份认证功能,之前为了方便增加了一个admin用户,然后授予了cluster-adm ...
- 01 . 容器编排简介及Kubernetes核心概念
Kubernetes简介 Kubernetes是谷歌严格保密十几年的秘密武器-Borg的一个开源版本,是Docker分布式系统解决方案.2014年由Google公司启动. Kubernetes提供了面 ...
- Kubernetes 基本概念与组件
Kubernetes(简称 K8S) 的出现是容器化技术发展的必然结果,容器化是应用程序级别的虚拟化,运行单个内核上有多个独立的用户空间实例,这些实例就是容器:容器提供了将应用程序的代码.运行时.系统 ...
随机推荐
- Golang处理数据库的nil数据
在用golang获取数据库的数据的时候,难免会遇到可控field.这个时候拿到的数据如果直接用string, time.Time这样的类型来解析的话会遇到panic. 那么如何处理这个问题呢,第一个出 ...
- 单个div充满屏幕的CSS方法
1.通过定位实现 <style> *{ margin: 0; padding: 0; } div{ width:100%; height: 100%; background: yellow ...
- Linux编程之fork函数
在Linux中,fork函数的功能就是在一个进程中创建一个新的进程,当前调用fork函数的进程就是产生的新进程的父进程,新进程在以下也称为子进程.在新进程生成之后就会在系统中开始执行. 函数原型:pi ...
- JavaScript复习笔记——数据类型
1.undefined 使用var声明但未对其进行初始化时,这个变量的值就是undefined. 对未被初始化的值使用typeof会返回undefined值,而对未声明的变量执行typeof操作同样也 ...
- poj 1026
这题一开始没看清楚 等级差距不超过1 1->2->3 就是错误的,因为3-1==2 ,意思是间接的也不行 其次等级最小是1,最大是n 你要到达1号首领的位置 假设1号等级x,限制m,最大上 ...
- 安装easygui
1.下载0.96的easygui 官网: http://easygui.sourceforge.net/ 2.解压后得到文件夹,里面有两个文件分别为,setup.py和easygui.py 3.在py ...
- django查询数据库无法过滤月份的解决
我试过,当settings里的:USE_TZ = False时也可以查询,但是数据库里的时间就会显示错的 解决方法是可以再终端输入 mysql_tzinfo_to_sql /usr/share/zon ...
- Python 基础API
针对python的os库一些API记录,觉得python的命名并不好,很多API看名字,并不知道具体功能是什么 1. os.path.basename() 得到文件名称,不包括路径,例子:/var/t ...
- CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)
背景 结合上一篇CLion之C++框架篇-优化框架,引入boost(三),继续进行框架优化!在项目中,我们经常会通过get方式拉取第三方资源,这一版优化引入类库curl,用来拉取第三方资源库. ...
- Javascript高级编程学习笔记(59)—— 事件(3)事件对象
事件对象 在触发DOM‘事件时,会产生一个事件对象 event 该对象包含着所有与事件有关的信息 所有浏览器都支持 event 对象但是支持的方式有所不同 DOM事件对象 兼容DOM的浏览器会将eve ...