k8s+docker理论知识笔记(李作强)

Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。

使用Kubernetes可以: 

1. 自动化容器的部署和复制 

2. 随时扩展或收缩容器规模 

3. 将容器组织成组,并且提供容器间的负载均衡 

4. 很容易地升级应用程序容器的新版本 

4. 提供容器弹性,如果容器失效就替换它,等等…

Kubernetes解决的问题: 

1. 调度 - 容器应该在哪个机器上运行 

2. 生命周期和健康状况 - 容器在无错的条件下运行 

3. 服务发现 - 容器在哪,怎样与它通信 

扫描二维码关注公众号,回复: 12182635 查看本文章

4. 监控 - 容器是否运行正常 

5. 认证 - 谁能访问容器 

6. 容器聚合 - 如何将多个容器合并成一个工程

Kubernetes组件组成: 

1. kubectl 

客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。 

2. kube-apiserver 

作为整个系统的控制入口,以REST API服务提供接口。 

3. kube-controller-manager 

用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。 

4. kube-scheduler 

负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。 

5. etcd 

负责节点间的服务发现和配置共享。 

6. kube-proxy 

运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。 

7. kubelet 

运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。 

8. DNS 

一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。

•Kubernetes的核心概念

1.Master

k8s集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有Etcd存储服务(可选),运行Api Server进程,Controller Manager服务进程及Scheduler服务进程,关联工作节点Node。Kubernetes API server提供HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口。也是集群控制的入口进程;Kubernetes Controller Manager是Kubernetes所有资源对象的自动化控制中心;Kubernetes Schedule是负责资源调度(Pod调度)的进程

2.Node

Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或minion)。Node是Kubernetes集群操 作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。关联Master管理节点,拥有名称和IP、系统资源信息。运行docker eninge服务,守护进程kunelet及负载均衡器kube-proxy.

每个Node节点都运行着以下一组关键进程

kubelet:负责对Pod对于的容器的创建、启停等任务

kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件

Docker Engine(Docker):Docker引擎,负责本机容器的创建和管理工作

Node节点可以在运行期间动态增加到Kubernetes集群中,默认情况下,kubelet会想master注册自己,这也是 Kubernetes推荐的Node管理方式,kubelet进程会定时向Master汇报自身情报,如操作系统、Docker版本、CPU和内存,以及 有哪些Pod在运行等等,这样Master可以获知每个Node节点的资源使用情况,冰实现高效均衡的资源调度策略。

3.Pod

运行于Node节点上,若干相关容器的组合。Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP地址和端口,能够通过 localhost进行通。Pod是Kurbernetes进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。一 个Pod可以包含一个容器或者多个相关容器。

Pod其实有两种类型:普通Pod和静态Pod,后者比较特殊,它并不存在Kubernetes的etcd存储中,而是存放在某个具体的 Node上的一个具体文件中,并且只在此Node上启动。普通Pod一旦被创建,就会被放入etcd存储中,随后会被Kubernetes Master调度到摸个具体的Node上进行绑定,随后该Pod被对应的Node上的kubelet进程实例化成一组相关的Docker容器冰启动起来, 在。在默认情况下,当Pod里的某个容器停止时,Kubernetes会自动检测到这个问起并且重启这个Pod(重启Pod里的所有容器),如果Pod所 在的Node宕机,则会将这个Node上的所有Pod重新调度到其他节点上。

4.Replication Controller

Replication Controller用来管理Pod的副本,保证集群中存在指定数量的Pod副本。集群中副本的数量大于指定数量,则会停止指定数量之外的多余容器数量, 反之,则会启动少于指定数量个数的容器,保证数量不变。Replication Controller是实现弹性伸缩、动态扩容和滚动升级的核心。

5.Service

Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象。Service提供了一个统一的服务访问入口以及服务代理和发现机制,关联多个相同Label的Pod,用户不需要了解后台Pod是如何运行。

外部系统访问Service的问题

首先需要弄明白Kubernetes的三种IP这个问题

Node IP:Node节点的IP地址

Pod IP: Pod的IP地址

Cluster IP:Service的IP地址

首先,Node IP是Kubernetes集群中节点的物理网卡IP地址,所有属于这个网络的服务器之间都能通过这个网络直接通信。这也表明Kubernetes集群之 外的节点访问Kubernetes集群之内的某个节点或者TCP/IP服务的时候,必须通过Node IP进行通信

其次,Pod IP是每个Pod的IP地址,他是Docker Engine根据docker0网桥的IP地址段进行分配的,通常是一个虚拟的二层网络。

最后Cluster IP是一个虚拟的IP,但更像是一个伪造的IP网络,原因有以下几点

Cluster IP仅仅作用于Kubernetes Service这个对象,并由Kubernetes管理和分配P地址

Cluster IP无法被ping,他没有一个“实体网络对象”来响应

Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备通信的基础,并且他们属于Kubernetes集群这样一个封闭的空间。

Kubernetes集群之内,Node IP网、Pod IP网于Cluster IP网之间的通信,采用的是Kubernetes自己设计的一种编程方式的特殊路由规则。

6.Label

Kubernetes中的任意API对象都是通过Label进行标识,Label的实质是一系列的Key/Value键值对,其中key于 value由用户自己指定。Label可以附加在各种资源对象上,如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的 Label,同一个Label也可以被添加到任意数量的资源对象上去。Label是Replication Controller和Service运行的基础,二者通过Label来进行关联Node上运行的Pod。

我们可以通过给指定的资源对象捆绑一个或者多个不同的Label来实现多维度的资源分组管理功能,以便于灵活、方便的进行资源分配、调度、配置等管理工作。

一些常用的Label如下:

版本标签:"release":"stable","release":"canary"......

环境标签:"environment":"dev","environment":"qa","environment":"production"

架构标签:"tier":"frontend","tier":"backend","tier":"middleware"

分区标签:"partition":"customerA","partition":"customerB"

质量管控标签:"track":"daily","track":"weekly"

Label相当于我们熟悉的标签,给某个资源对象定义一个Label就相当于给它大了一个标签,随后可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过这种方式实现了类似SQL的简单又通用的对象查询机 制。

Label Selector在Kubernetes中重要使用场景如下:

kube-Controller进程通过资源对象RC上定义Label Selector来筛选要监控的Pod副本的数量,从而实现副本数量始终符合预期设定的全自动控制流程

kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立起每个Service岛对应Pod的请求转发路由表,从而实现Service的智能负载均衡

通过对某些Node定义特定的Label,并且在Pod定义文件中使用Nodeselector这种标签调度策略,kuber-scheduler进程可以实现Pod”定向调度“的特性。

7.Flannel

Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。

在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够之间通过IP地址相互找到,也就是相互ping通。

Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

yaml文件参数详解:

yaml格式的pod定义文件完整内容:

apiVersion: v1    #必选,版本号,例如v1,版本号必须可以用 kubectl api-versions 查询到 .

kind: Pod        #必选,

Pod metadata:        #必选,元数据

name: string    #必选,Pod名称

namespace: string    #必选,Pod所属的命名空间,默认为"default"

labels:        #自定义标签 - name: string   #自定义标签名字

annotations:    #自定义注释列表

- name: string

spec:         #必选,Pod中容器的详细定义

containers:      #必选,Pod中容器列表

- name: string    #必选,容器名称,需符合RFC 1035规范

image: string    #必选,容器的镜像名称

imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像

command: [string]    #容器的启动命令列表,如不指定,使用打包时使用的启动命令

args: [string]    #容器的启动命令参数列表

workingDir: string #容器的工作目录

volumeMounts:      #挂载到容器内部的存储卷配置

- name: string     #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名

mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符

readOnly: boolean #是否为只读模式 ports:        #需要暴露的端口库号列表

- name: string     #端口的名称

containerPort: int #容器需要监听的端口号

hostPort: int    #容器所在主机需要监听的端口号,默认与Container相同

protocol: string #端口协议,支持TCP和UDP,默认TCP

env:        #容器运行前需设置的环境变量列表

- name: string    #环境变量名称

value: string    #环境变量的值

resources:    #资源限制和请求的设置 l

imits:      #资源限制的设置

cpu: string    #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数

memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数

requests:    #资源请求的设置

cpu: string    #Cpu请求,容器启动的初始可用数量

memory: string #内存请求,容器启动的初始可用数量 l

ivenessProbe:    #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可

exec:        #对Pod容器内检查方式设置为exec方式

command: [string]    #exec方式需要制定的命令或脚本

httpGet:      #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port

path: string

port: number

host: string

scheme: string

HttpHeaders:

- name: string

value: string

tcpSocket:       #对Pod内个容器健康检查方式设置为tcpSocket方式 port: number initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒

timeoutSeconds: 0    #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒

periodSeconds: 0    #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次 success

Threshold: 0

failureThreshold: 0

securityContext:

privileged: false

restartPolicy: [Always | Never | OnFailure] #Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod

nodeSelector: obeject    #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定

imagePullSecrets:     #Pull镜像时使用的secret名称,以key:secretkey格式指定

- name: string

hostNetwork: false    #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络

volumes:        #在该pod上定义共享存储卷列表

- name: string       #共享存储卷名称 (volumes类型有很多种)

emptyDir: {}      #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值

hostPath: string    #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录

path: string    #Pod所在宿主机的目录,将被用于同期中mount的目录

secret:        #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部

scretname: string

items:

- key: string

path: string c

onfigMap:      #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部

name: string

items:

- key: string

path: string


猜你喜欢

转载自blog.51cto.com/13615925/2601731
今日推荐