情感测试
情感测试

您现在的位置: 情感测试简介_情感测试玩法 > 情感测试答案 > 2Kubernetes基础入门体系架构

2Kubernetes基础入门体系架构

发布时间:2021-7-17 14:37:09   点击数:

0x02基础概念

?0.工作负载

1.Pods?

实现原理

简单分类

2.资源清单

apiVersion-对象资源版本

Kind-对象资源

metadata-对象资源原数据

spec-对象资源详细描述

labels-资源对象标签

selector-资源对象标签选择器

annotations-资源对象注解

3.Service

4.Network

0x03简单K8S系统实践

单实例部署

小试牛刀

0x02基础概念

0.工作负载

描述:工作负载是在Kubernetes上运行的应用程序。

1.Pods

描述:Pod是学习Kubernetes的最重要也是最基本的概念,所以对于我们初学者来说它是必须了解的;

Q:Pod的定义?

答:Pod是可以在Kubernetes中创建和管理的、最小的可部署的计算单元,简单的说它是K8s系统node节点中的最小组成单位,K8s设计Pod对象是为了将服务进程包装到相应的Pod中使其成为Pod中运行的容器(Conatiner);Pod(就像在鲸鱼荚或者豌豆荚中)通常运行在Node节点上,在Kubernetes中,Pod代表的是集群上处于运行状态的一组容器。Pod的共享上下文包括一组Linux名字空间、控制组(cgroup)和可能一些其他的隔离方面,即用来隔离Docker容器的技术。并且在上下文中,每个独立的应用可能会进一步实施隔离。Pod是特定于应用的"逻辑主机",其中包含一个或多个应用容器,这些容器是相对紧密的耦合在一起的。

Q:什么是Pod?答:Pod的共享上下文包括一组Linux名字空间、控制组(cgroup)和可能一些其他的隔离方面,即用来隔离Docker容器的技术。在Pod的上下文中,每个独立的应用可能会进一步实施隔离。就Docker概念的术语而言,Pod类似于共享名字空间和文件系统卷的一组Docker容器。

PS:除了Docker之外,Kubernetes支持很多其他容器运行时,Docker是最有名的容器引擎使用Docker的术语来描述Pod会很有帮助。

实现原理

描述:在每个Pod运行之前会首先启动一个特殊Pause容器或者叫Pod的根容器(只要Pod建立都有它),而其它容器则为业务容器共享该Pod的Pause容器的网络栈(Locahost)以及Volume挂载卷(共享存储),即Pod中的每个容器共享网络名字空间,包括IP地址和网络端口;在同一个Pod内,所有容器共享一个IP地址和端口空间,并且可以通过localhost发现对方。他们也能通过如SystemV信号量或POSIX共享内存这类标准的进程间通信方式互相通信。

简单:您可以想象指定的应用(容器)都运行在同一台主机(Pod)之中;

Q:Pause容器作用不言而喻?

(1)引入业务无开关并且不易死亡的Pause容器作为Pod的根容器,解决整体检测及判断行动有效和无效的问题,其状态代表了整个容器组的状态;

(2)共享网络栈和存储栈;

Q:容器的特权模式?

Pod中的任何容器都可以使用容器规约中的安全性上下文中的privileged参数启用特权模式。这对于想要使用使用操作系统管理权能(Capabilities,如操纵网络堆栈和访问设备)的容器很有用。容器内的进程几乎可以获得与容器外的进程相同的特权。说明:你的容器运行时必须支持特权容器的概念才能使用这一配置。

Q:Pod异常处理调度机制?

(1)默认情况下,当Pod里的某个容器停止时Kubernetes会自动检测到这个问题并重新启动该Pod(动作是:重启Pod里的所有容器);

(2)工作节点宕机的情况下,则会将该Node上的所有Pod重新调度到其它节点之上。

补充说明:

Pause容器对应镜像属于Kubernetes平台的一部分,除了Pause容器外每个Pod还包括一个或多个紧密相关的用户业务容器;

同一个Pod中的服务端口不可重叠使用,例如Nginx使用80Port则Tomcat只能使用Port,否则可能导致容器无法启动或者重复启动;

Pod中除了Pause容器、应用容器还可以包含在Pod启动期间运行的Init容器,其三者关系是Pause容器Init容器。

简单分类

我们可以根据学习使用和功能特征大致分为以下两种Pod类型:

单实例(Singleton)的Pod(即不是被控制器管理的Pod):Pod一旦死亡便不能自动化的切换或者根据期望值进行创建Pod;

-1.稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据基于PVC来实现;-2.稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于HeadlessService即没有ClusterIP的Service来实现;-3.有序部署、有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(`即从0到N-1在下一个Pod运行之前的所有之前的Pod必须是Running和Readt状态`)它们是基于InitContainers来实现;-4.有序收缩与有序删除(`即从N-1到0`)

-1.运行集群存储Deamon;例如在每个Node上运行Glusterd、Ceph;-2.在每个Node上运行日志收集Daemon;例如Fluentd、logstash;-3.在每个Node上运行监控Daemon;例如PrometheusNodeExporter;

Job:负责批处理任务即仅执行一次的任务,它保证批处理任务的在一个或者多个Pod成功结束,常常用于数据备份;

Cronjob:管理基于时间的Job即在给定的时间点只运行一次,周期性地在给定时间点运行;

HPA(HorizontalPodAutoscaling):仅仅适用于Deployment与ReplicaSet在V1版本中仅支持根据Pod的CPU利用率进行扩容,在V1-Alpha版本中就是仅仅支持根据内存和用户自定义的Metric扩缩容;

DaemonSet:确保在全部或者一部分Node节点上运行一个Pod的副本,当有Node加入集群时也会为他们新增一个Pod;当有Node从集群移除时这些Pod也将被回收;当删除DaemonSet将会删除它创建的所有Pod,例如下面的一些典型用法:

RC(ReplicationController):用来确保容器应用的副本数始终保持在用户定义的副本数(期望值),即如果有容器异常退出其将会自动创建新的Pod来替代,而如果异常多出来的容器也会自动回收

RS(ReplicaSet):它与ReplicationController没有本质的不同只是名字不一样,在新版本K8s中建议用ReplocaSet来取代ReplicationCpntroller,但是ReplicaSet支持集合式的selector(标签)虽然它可以独立使用;建议采用Deployment来自动管理ReplicaSet,这样做的好处式无需担心跟其他机制的不兼容的问题例如ReplocaSet不支持回滚更新但是Deployment是支持的;

Deployment:它为Pod和ReplicaSet提供了一个声明式的定义(Declaratice)方法,用于替代以前的RC来方便管理应用其典型的应用场景如下:定义Delployment来创建Pod和RelicaSet、滚动升级与回滚应用、扩容与缩容、暂停与继续Deployment

StatefullSet:为了解决有状态服务的问题(前面所说的Deployments与ReplicaSets是为了无状态服务而设计)其利用场景报包括如下:

控制器管理的Pod:主要是使用工作负载资源及其控制器以实现应用的扩缩和自动修复。

FQ

Q:什么是Rolling-update?以及什么是rollbacks-update(undo)?

答:滚动更新(即新版本替换旧版本但是旧版本容器并未被删除而是被暂停)回滚更新(即线上版本回滚前一个或者某一个版本)

Q:服务分类(资源清单)?什么是有状态服务?什么又是无状态服务?

有状态服务:DBMS(暂停或者离开某段时间后返回到集群中无法正常工作,由于这段时间内有新的数据产生)无状态服务:LVSAPACHE(暂停或者离开某段时间后返回到集群工仍然可以继续的正常工作,您可以把他比如作流水线的管理人员,其离开一会并会不导致流水线作业停止)PS:我们所熟知的Docker其实主要是针对一个无状态的服务;

Q:Deployment与RC间的关系?

答:在Pod创建并不是由RC直接创建而是由Deployment进行创建并且RS也是由它创建的(Pod与RS都是由Deployment创建);

Q:有序部署扩容与删除缩容注意事项?

答:在同一个Pod中各项目容器的启动顺序可能有一定的关联,例如Mysql-Tomcat-Nginx当缩容时也需按照相应的反向顺序进行关闭;

2.资源清单

描述:Kubenetes所有的资源对象的定义和描述采用Yaml或者Json的文件格式,将其比喻作剧本即Kubernetes按照要求定义进行相应资源的执行增删改查;

以下是K8S资源清单定义中比不可少的四个对象:

apiVersion-对象资源版本Kind-对象资源metadata-对象资源原数据spec-对象资源详细描述labels-资源对象标签

描述:Labels是K8s中另外一个核心概念,它是一个KV键值对其可以附加在各种资源对象(Node、Pod、RC、RS、Delopyment、Service)之上的定义,并且一个资源对象可以定义多个lable标签(多对多的关系);作用:为指定资源对象绑定一个或者多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便的进行资源分配、调度、配置和部署等,例如在Node中可以利用标签来设置Pod的亲密性,在RS中利用匹配的标签来检测拥有该标签的数量保证Pod数量满足副本数,在SVC中利用标签可进行选择Pod进行负载均衡;

简单的说:Lable是用来传递用户自定义属性,标注对象的特殊特点,比如用户可以更加直观从标签中看到某个Node节点中挂载的SSD硬盘或者是说测试环境;

标签示例:

版本标签:"release":"stable"环境标签:"environment":"dev"架构标签:"tire":"backend"#middleware分区标签:"partition":"customerA"质量管控标签:"track":"weekly"

补充知识:

1.K8s全部资源对象的Label我们都可以随时随地的增加、修改和删除,一个资源对象可以有多个不重复的Label。

#1)为一个Pod设置Label$kubectllabelpodsdeploy-java-maven-0role=jave-test#pod/deploy-java-maven-0labeled$kubectlgetpodsdeploy-java-maven-0--show-labels#NAMEREADYSTATUSRESTARTSAGELABELS#deploy-java-maven-01/1Running07d22happ=java-maven,controller-revision-hash=deploy-java-maven-db8b9d9,release=stabel,role=jave-test,statefulset.kubernetes.io/pod-name=deploy-java-maven-0#2)为一个node设置Lable$kubectllabelnodeswork-devnode=test#3)强制更新已经设置的Lable$kubectllabelpodsdeploy-java-maven-0role=front-overwrite--overwrite#pod/deploy-java-maven-0labeled$kubectlgetpodsdeploy-java-maven-0--show-labels#NAMEREADYSTATUSRESTARTSAGELABELS#deploy-java-maven-01/1Running07d22happ=java-maven,controller-revision-hash=deploy-java-maven-db8b9d9,release=stabel,role=front-overwrite,statefulset.kubernetes.io/pod-name=deploy-java-maven-0#4)删除指定lable$kubectllabelpodsdeploy-java-maven-0role-#pod/deploy-java-maven-0labeled$kubectlgetpodsdeploy-java-maven-0--show-labels#NAMEREADYSTATUSRESTARTSAGELABELS#deploy-java-maven-01/1Running07d22happ=java-maven,controller-revision-hash=deploy-java-maven-db8b9d9,release=stabel,statefulset.kubernetes.io/pod-name=deploy-java-maven-0selector-资源对象标签选择器

描述:有了标签Label后我们还需要配合标签选择器,来进行标签(Lable)的查询和筛选使之分配给该标签的资源对象相应的资源(或者说绑定相应的资源);该方法类似于SQL对象查询机制;

那如何使用标签以及选择器?

描述:通过标签选择器LabelSelector查询和筛选拥有某些Label的资源对象,而K8s通过类似于SQL的简单又通用的对象(where条件)查询机制;通过采用等式类和集合类两种方式进行匹配在Node、Pod、RS、Service中的标签;

例如:Lable为name=nginx附加到一个Pod时,那么对应的LableSelector表达式类比于SQL语句等同于:SELECT*FROMPODWHEREPod_name=nginx;

#等式类(Equality-Based)-操作表达式(等于或者不等于):name=redis-appenv!=product#集合类(Set-Based)-操作表达式(包含、不包含、存储或者不存在):nameIn(redis-cluster,redis-slave)#,表示分隔其中里面的条件关系是ANDnameNotin(redis-slave)nameExists(redis-slave)nameDoesNotExists(redis-slave)#使用说明:在Deloyment、ReplicaSet、DaemonSet或者Job等Pod管理控制器对都可以在Selector使用基于集合的筛选定义selector:matchLables:#用于定义Lables匹配的Pod资源对象app:nginxmatchExpressions:#用于定义一组Lable其与直接定义在Selector中作用一样-{key:name,operator:In,value:[appweb]}

方式1:下面的Deployment控制器创建Pod的资源清单示例

apiVersion:apps/v1  #与k8s集群版本有关,使用kubectlapi-versions即可查看当前集群支持的版本kind:Deployment  #该配置的类型,我们使用的是Deploymentmetadata:  #译名为元数据,即Deployment的一些基本属性和信息name:nginx-deployment  #Deployment的名称labels:  #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解app:nginx  #为该Deployment设置key为app,value为nginx的标签enviroment:testspec:  #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用replicas:1  #副本数量(由Deployment控制器创建并且监控)selector:  #标签选择器与Pod模板中的标签需要共同作用matchLabels:#匹配选择包含标签app=nginx的资源#基于等式app:nginxmatchExpressions:#基于集合-{key:name,operator:In,value:[web-app]}template:  #这是选择或创建的Pod的模板metadata:  #Pod的元数据labels:  #Pod副本拥有的标签,上面的selector即选择包含标签app:nginx的Pod(有了它我们的delopyment控制器才知道匹配的标签已经有一个Pod在运行了)app:nginxname:web-appspec:  #期望Pod实现的功能(即在pod中部署)containers:  #生成container,与docker中的container是同一种-name:nginx  #container的名称image:nginx:latest  #使用镜像nginx最新版本创建container,该container默认80端口可访问

方式2:通过注解(annotations)的方式也可以进行标签选择匹配(后续有示例的时候补充)

Tips:如果使用一组集合的筛选条件,基于集合操作的表达式匹配标签。也可以通过多个LableSelector表达式组合实现更为复杂的条件选择,表达式之间用逗号或者AND进行分割;

Tips:如果同时设置matchLables与matchExpressions则两者条件为‘与’的关系;

总结:使用Label可以给对象创建多组标签,Label和LableSelector共同构成了k8s系统中最核心的应用模型,使得被管理对象能够被精细的分组管理,同时实现了整个集群的高可以用性;

annotations-资源对象注解3.Service

Q:什么是Service(SVC)服务发现?为啥需要Service?

答:在K8中Services服务是分布式集群架构的核心,一个Service对象主要拥有如下功能特征拥有一个唯一的名称以及拥有一个虚拟IP(ClusterIP/ServiceIP或者VIP)和端口号将Pod中的服务进程服务(容器)进行映射以便客户端访问;简单的说Service通常有多个相关的服务进程来提供服务并且每个服务进程都拥有一个独立的Endpoint(Ip+Port)访问点,K8s能够让我们通过Service(虚拟ClusterIP+ServicePort)连接到指定的Service上,(后续解释)并且Service本身一旦创建将不再变化;作用:通过K8s内建的透明负载均衡和故障恢复机制,不管后端有多少服务进程也不管某个服务进程是否会由于发生故障而重新部署到其他Node上,都不会影响到我们对服务的正常调用,就不必再为服务IP地址变化而无法访问的问题头疼;

Q:K8s中如何使用Service服务发现原理?

答:为了建立Service与Pod间的关联关系,K8s首先会给每个Pod贴上一个标签(Label)它也是K8s中非常重要,例如app=redis标签,然后给相应的Service定义标签选择器(LabelSelector);例如RedisService的标签选择器的选择条件为app=redis意为该Service钥作用于所有包含app=redis的Label的Pod上,这样将巧妙地解决了Service与Pod的关联问题;你可以将Label与标签选择器类比为CSS样式,可以通过指定的标签设置页面上所有该标签的CSS样式;

Service服务发现图示

4.Network

描述:在K8s的网络模型假定了所有的Pod都在一个可以直接联通扁平化(规模小/可直通对方Pod的IP)的网络空间中例如在GCE(GoogleComputeEngine)里面是现成的网络模型,而在私有云的搭建部署K8s集群时候需要我们自己设置网络通信,将不同节点上的Docker容器之间的互相访问先打通然后再运行Kubernetes这是因为PodService间的网络是私有虚拟的网络;

Q:与Pod间的网络通讯模式?

答:各Pod之间的通讯是采用OverlayNetwork覆盖网络即虚拟网桥Bridge实现Pod与Service之间的通信是通过iPtables底层一堆的转换机制实现;

Q:不同情况下的网络通信方式我们以Flannel为例

1.同一个Pod内部通信:前面我们说过同一个Pod共享同一个网络命名空间与共享一个Linux协议栈,简单的说就是同一个Pod内的多个容器之间通过lo回环网卡实现访问;

2.不同Pod间通信:

假设Pod1与Pod2不再同一台主机上,Pod的地址是与Docker0在同一个网段的,但Docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同的Node之间的通信只能通过宿主机的物理网卡进行,将Pod的IP与所在的Node的IP关联起来通过它将会让Pod进行互相访问;

假设Pod1与Pod2在同一台机器上由Docker0网桥直接转发至Pod2而无需经过Flannel;

3.Pod至Service网络:目前全部采用iptables维护和转发,但是可以利用LVS组件进行替换;

4.Pod到外网:Pod向外网发送请求查找路由表然后转发数据包到宿主机的网卡,宿主机网卡完成路由选择后IPtables执行Masquerade把源IP地址更改为宿主机网卡的IP(NAT转发)然后再向外网服务发送请求;

5.外网访问Pod:通过Service映射的端口

组件通讯示意图如下:

K8S网络解决方案

(1)K8s+Flannel(该插件是CoreOS团队针对于Kubernetes设计的一个网络规划服务)

(2)K8s+Calico(Calico是一种容器之间互通的网络方案)

PS:在K8s中是通过CNI接口接入第三方的网络解决方案的组件;

0x03简单K8S系统实践

描述:主要通过大量案例对K8s最核心的容器和微服务架构的概念和用法进行了详细的说明;

K8s的常见的安装方式:

(1)二进制包安装(kubeadm工具)

(2)源代码编译安装

单实例部署

Step1.环境配置要求:

#1.安装Master/Node节点(cpu和磁盘至少1C和2G)2台2核4G的服务器#注意:内核版本的选择CentOS7.8kernelversion=4.19.x#docker版本至少1.9以上docker19.03.8#etc至少2.0版本以上#2.实际测试环境(两台):#系统版本CentOSLinuxrelease7.8.(Core)#内核版本CentOSLinux(5.6.10-1.el7.elrepo.x86_64)7(Core)#核心数:请使用lscpu命令,核对CPU信息#Architecture:x86_64本安装文档不支持arm架构#CPU(s):2CPU内核数量不能低于2cat/proc/cpuinfo

grep-cprocessor2#内存容量(6G)cat/proc/meminfoMemTotal:kBMemFree:kBMemAvailable:kBBuffers:kBCached:kB

Step2.安装准备以及软件版本:

*我的任意节点centos版本为7.6或7.7*我的任意节点CPU内核数量大于等于2,且内存大于等于4G*我的任意节点hostname不是localhost,且不包含下划线、小数点、大写字母*我的任意节点都有固定的内网IP地址*我的任意节点都只有一个网卡,如果有特殊目的,我可以在完成K8S安装后再增加新的网卡*我的任意节点上Kubelet使用的IP地址可互通(无需NAT映射即可相互访问),且没有防火墙、安全组隔离*我的任意节点不会直接使用dockerrun或docker-

转载请注明:http://www.zmax-alibaba.com/qgda/137640.html

网站简介 | 发布优势 | 服务条款 | 隐私保护 | 广告合作 | 合作伙伴 | 版权申明 | 网站地图

当前时间: