Kubernetes 集群实战(微课版)课件 项目7-9 Kubernetes调度、高效管理应用程序的部署、持续集成和持续部署_第1页
Kubernetes 集群实战(微课版)课件 项目7-9 Kubernetes调度、高效管理应用程序的部署、持续集成和持续部署_第2页
Kubernetes 集群实战(微课版)课件 项目7-9 Kubernetes调度、高效管理应用程序的部署、持续集成和持续部署_第3页
Kubernetes 集群实战(微课版)课件 项目7-9 Kubernetes调度、高效管理应用程序的部署、持续集成和持续部署_第4页
Kubernetes 集群实战(微课版)课件 项目7-9 Kubernetes调度、高效管理应用程序的部署、持续集成和持续部署_第5页
已阅读5页,还剩250页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Kubernetes集群实战(微课版)工业和信息化精品系列教材——云计算技术项目7

Kubernetes调度能力CAPACITY要求了解StatefulSet的概念和工作机制学会使用StatefulSet在集群中部署有状态应用程序了解HPA的概念和工作机制学会使用HPA实现应用程序的水平扩缩容了解Kubernetes调度的常见方式,掌握Pod调度的配置管理方法任务7.2实现水平自动扩缩容任务7.1使用StatefulSet运行有状态应用程序任务7.3管理Pod的调度任务7.1使用StatefulSet运行有状态应用程序任务说明01OPTION02OPTION03OPTION了解StatefulSet的概念理解StatefulSet的特点和工作机制了解StatefulSet的组件和定义StatefulSet的配置文件04OPTION学会使用StatefulSet部署和管理有状态应用程序任务7.1使用StatefulSet运行有状态应用程序相关知识7.1.1什么是StatefulSetStatefulSet是一个管理有状态应用程序的API对象。StatefulSet用来管理Pod集合的部署和扩缩容,并为这些Pod提供持久的存储和持久的标识。StatefulSet的典型应用场景数据库服务消息队列服务分布式协调服务任务7.1使用StatefulSet运行有状态应用程序相关知识7.1.1什么是StatefulSetStatefulSetDeployment管理的Pod是有状态的,命名是有规律的管理的Pod是无状态的,命名是随机的多个Pod实例并不是完全一样的多个Pod实例对于同一个用户请求的响应结果是完全一致的Pod在本地存储持久化数据,每个Pod都可以有独立的存储卷Pod不会在本地存储持久化数据多个Pod实例之间存在某种依赖关系多个Pod实例之间没有依赖关系动态启动或停止Pod实例会对其他Pod实例产生影响动态启动或停止Pod实例不会对其他Pod实例产生影响某个Pod实例需要重建时,新的Pod实例必须与被替换的Pod实例具有相同的名称、网络标识和状态某个Pod实例任何时候都可以被一个全新的Pod实例替换任务7.1使用StatefulSet运行有状态应用程序相关知识7.1.2StatefulSet的特点具有稳定、唯一的网络标识。具有稳定、持久的存储。能够进行有序的、优雅的部署和扩缩容。主要应用场景数据库服务消息队列服务分布式协调服务任务7.1使用StatefulSet运行有状态应用程序相关知识7.1.2StatefulSet的特点存储实现机制任务7.1使用StatefulSet运行有状态应用程序相关知识7.1.3StatefulSet的组件• 无头Service• StatefulSet工作资源负载卷声明模板(volumeClaimTemplates)任务7.1使用StatefulSet运行有状态应用程序相关知识7.1.3StatefulSet的组件定义StatefulSet资源的配置文件apiVersion:v1#API版本kind:StatefulSet#资源类型metadata:#元数据

name:string#资源名称spec:selector:#选择器,指定该控制器管理哪些PodmatchLabels:#匹配规则

app:string#必须匹配spec.template.metadata.labels字段值

serviceName:string#负责生成Pod的网络标识的无头Service名称

replicas:int#副本(实例)数,默认值1minReadySeconds:int#最短就绪时间,即Pod就绪后额外等待的秒数,默认值0template:#定义Pod模板,当副本数不足时会根据模板定义创建Pod实例

metadata:labels:#指定标签

app:string#Pod标签,必须匹配spec.selector.matchLabels字段值任务7.1使用StatefulSet运行有状态应用程序相关知识7.1.3StatefulSet的组件定义StatefulSet资源的配置文件spec:terminationGracePeriodSeconds:int#优雅终止时间(秒),默认30秒

containers:#容器列表

-name:string#容器名称

volumeMounts:#挂载点,用于为Pod分配存储

-name:string#卷声明模板名称,同volumeClaimT字段值

name:stringmountPath:stringvolumeClaimTemplates:#卷声明模板

-metadata:name:string#卷声明模板名称

spec:accessModes:[strings]#访问模式

storageClassName:string#StorageClass名称

resources:#请求的存储资源

requests:storage:int#存储空间大小任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群准备存储资源使用StorageClass对象为拟部署的MySQL应用程序提供动态卷制备。查看当前的StorageClass对象。#kubectlgetscNAMEPROVISIONERRECLAIMPOLICYVOLUMEBINDINGMODEALLOWVOLUMEEXPANSIONAGEnfs-storage(default)k8s-sigs.io/nfs-subdir-external-provisionerDeleteImmediatefalse4d16h任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群创建ConfigMapapiVersion:v1kind:ConfigMapmetadata:name:mysqllabels:app:mysqldata:f:|#仅在主服务器上应用的配置

[mysqld]log-binf:|#仅在从服务器上应用此配置

[mysqld]super-read-only任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群创建Service#为StatefulSet成员提供稳定的DNS条目的无头ServiceapiVersion:v1kind:Servicemetadata:name:mysqllabels:app:mysqlspec:ports:-name:mysqlport:3306clusterIP:None#无头Serviceselector:app:mysql任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群创建Service#用于连接到任一MySQL实例执行读操作的客户端ServiceapiVersion:v1kind:Servicemetadata:name:mysql-readlabels:app:mysqlreadonly:"true"#读操作spec:ports:-name:mysqlport:3306selector:app:mysql任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群创建StatefulSetapiVersion:apps/v1kind:StatefulSetmetadata:name:mysqlspec:selector:matchLabels:app:mysqlserviceName:mysql#无头Service名称

replicas:3#副本数任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群创建StatefulSetspec:#定义初始化容器来完成集群初始化工作

initContainers:-name:init-mysql#此容器为主从服务器Pod提供相应的配置文件

image:mysql:5.7command:-bash-"-c"-|

-name:clone-mysql#此容器在从服务器Pod容器中实现数据复制

#基于数据库热备份软件Xtrabackup的镜像生成容器

image:/google-samples/xtrabackup:1.0command:-bash-"-c"-|

任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群创建StatefulSet

#定义普通容器运行MySQL主从服务器

containers:-name:mysql#此容器启动MySQL主从服务器

image:mysql:5.7env:-name:MYSQL_ALLOW_EMPTY_PASSWORDvalue:"1"ports:-name:mysqlcontainerPort:3306#挂载初始化容器已经完成的数据与配置

volumeMounts:-name:datamountPath:/var/lib/mysqlsubPath:mysql-name:confmountPath:/etc/mysql/conf.dresources:requests:cpu:500mmemory:1Gi任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群创建StatefulSetvolumeMounts:-name:datamountPath:/var/lib/mysqlsubPath:mysql-name:confmountPath:/etc/mysql/conf.dresources:requests:cpu:100mmemory:100Mivolumes:#卷的定义

-name:conf#使用EmptyDir存储配置

emptyDir:{}-name:config-map#指定要挂载的ConfigMapconfigMap:name:mysql任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群创建StatefulSetvolumeClaimTemplates:#卷声明模板

-metadata:name:dataspec:storageClassName:nfs-storage#需要与StorageClass的名称一致

accessModes:["ReadWriteOnce"]resources:requests:storage:10Gi任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群创建StatefulSet(2)创建名为mysql的StatefulSet对象。(3)查看启动进度,会发现所有3个Pod都进入Running状态,其中的Pod名称由StatefulSet对象的名称和Pod序号组成。#kubectlgetpods-lapp=mysql--watchNAMEREADYSTATUSRESTARTSAGEmysql-02/2Running02m51smysql-12/2Running1(2m11sago)2m25smysql-22/2Running1(106sago)2m5s(4)查看该StatefulSet所创建的PVC,发现其名称为卷声明模板名称和Pod名称组成。#kubectlgetpvc-lapp=mysqlNAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGEdata-mysql-0Boundpvc-357b0fd6-3cf6-4144-be16-4b920418859910GiRWOnfs-storage11mdata-mysql-1Boundpvc-77179150-9aad-4cac-b754-ab063260210710GiRWOnfs-storage11mdata-mysql-2Boundpvc-7a966af3-5d4b-4c00-8afe-d5b7969d3bbf10GiRWOnfs-storage10m任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.1使用StatefulSet部署MySQL主从集群发送客户端请求进行测试(1)运行基于mysql:5.7镜像的临时容器,将创建表与插入数据操作的SQL语句发送到MySQL主服务器(主机名mysql-0.mysql)执行。(2)运行基于mysql:5.7镜像的临时容器,通过mysql-read这个Service将测试查询发送到任何Pod运行的MySQL服务器,结果显示能够读取新建的表及其数据。(3)运行基于mysql:5.7镜像的临时容器,循环运行SELECT@@server_id语句,演示mysql-read这个Service在MySQL服务器之间分配的连接,可以发现报告的@@server_id发生随机变化,每次尝试连接时都选择了不同的端点。#kubectlrunmysql-client-loop--image=mysql:5.7-i-t--rm--restart=Never--bash-ic"whilesleep1;domysql-hmysql-read-e'SELECT@@server_id,NOW()';done"Ifyoudon'tseeacommandprompt,trypressingenter.+++|@@server_id|NOW()|+++|101|2022-10-0112:41:49|++++++任务7.1使用StatefulSet运行有状态应用程序任务实现任务7.1.2扩缩容StatefulSet工作负载资源(1)执行kubectlscalestatefulsetmysql--replicas=4命令进行扩容,将副本数增加到4。(2)查看MySQL主从集群中的Pod,可以发现新增一个名为mysql-3的Pod。(3)运行临时容器,向新增的从MySQL服务器mysql-3.mysql发送查询进行测试,发现能够正常响应。(4)执行kubectlscalestatefulsetmysql--replicas=3命令进行缩容,将副本数减少到3。(5)验证结果表明尽管将StatefulSet的副本数缩小为3,所有4个PVC仍然存在。(6)根据需要删除不再打算使用的PVC。(7)删除以上操作所涉及的对象。任务7.2实现水平自动扩缩容任务7.1使用StatefulSet运行有状态应用程序任务7.3管理Pod的调度任务7.2实现水平自动扩缩容任务说明01OPTION02OPTION03OPTION了解HPA的概念和工作机制了解HPA定义的配置文件了解MetricsServer并掌握其部署方法04OPTION掌握使用HPA实现自动扩缩容的方法任务7.2实现水平自动扩缩容相关知识7.2.1什么是HPAHPA监控分析ReplicationController、Deployment、ReplicaSet或StatefulSet等控制器控制的Pod的负载变化。HPA根据资源利用率或自定义指标自动调整Pod的副本数,从而实现应用程序的水平自动扩缩容,让应用程序部署的规模接近于实际的负载。任务7.2实现水平自动扩缩容相关知识7.2.1什么是HPAHPA的水平自动扩缩容功能由KubernetesAPI资源和控制器实现,资源决定了控制器的行为。任务7.2实现水平自动扩缩容相关知识7.2.2如何定义HPAapiVersion:autoscaling/v2#API版本kind:HorizontalPodAutoscaler#资源类型为HorizontalPodAutoscalermetadata:name:string#HPA名称

spec:behavior:#控制HPA的扩缩容的行为

scaleDown:#缩容策略定义

scaleUp:#扩容策略定义

minReplicas:int#自动缩容的副本数下限,默认是1maxReplicas:int#自动扩容的副本数上限

scaleTargetRef:#指定要扩缩容的对象(控制器)

apiVersion:string#控制器版本,如apps/v1kind:string#控制器类型,如Deploymentname:string#控制器名称

metrics:#定义动态扩缩容的控制指标

-type:string#指标类型,如Resource#具体指标的定义任务7.2实现水平自动扩缩容相关知识7.2.3什么是MetricsServerMetricsServer为Kubernetes内置的自动扩缩容流水线提供资源度量。MetricsServer特性适用于大多数集群的单个部署。每15秒收集一次指标以实现快速自动扩缩容。具有较高的资源效率。可支持多达5000个节点的集群。任务7.2实现水平自动扩缩容任务实现任务7.2.1部署MetricesServer安装MetricsServer使用kubectlapply命令基于YAML格式的配置文件安装。修改部署配置文件containers:-args:---cert-dir=/tmp---secure-port=443---kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname---kubelet-use-node-status-port---metric-resolution=15s---kubelet-insecure-tls#增加此启动参数#针对国内环境替换镜像#image:registry.k8s.io/metrics-server/metrics-server:v0.6.3image:/zailushang/metrics-server:v0.6.0任务7.2实现水平自动扩缩容任务实现任务7.2.1部署MetricesServer验证MetricsServer的部署(1)查出MetricsAPI的版本是/apis/metrics.k8s.io/v1beta1。#kubectlapi-versions|grepmetricsmetrics.k8s.io/v1beta1(2)在运行kubectl的主机和KubernetsAPI服务器之间建立反向代理。#kubectlproxy--port=8088Startingtoserveon:8088(3)打开另一个终端窗口,使用curl命令向/apis/metrics.k8s.io/v1beta1端点发送GET请求,查看可以通过MetricsAPI查询的资源。结果表明,可以获得节点和Pod的资源。任务7.2实现水平自动扩缩容任务实现任务7.2.2通过HPA实现Nginx的自动扩缩容创建并运行NginxapiVersion:apps/v1#版本号kind:Deployment#类型为Deploymentmetadata:#元数据

name:nginxlabels:#标签

app:nginxspec:#详细信息

selector:#选择器,指定该控制器管理哪些PodmatchLabels:#匹配规则

app:nginxtemplate:#定义模板,当副本数量不足时会根据模板定义创建Pod副本

metadata:labels:app:nginx#Pod的标签

spec:containers:#容器列表(本例仅定义一个容器)

-name:nginx#容器的名称

image:nginx:1.17.2#容器所用的镜像

resources:requests:cpu:100mmemory:200Mi任务7.2实现水平自动扩缩容任务实现任务7.2.2通过HPA实现Nginx的自动扩缩容创建并运行NginxapiVersion:v1kind:Service#类型为Servicemetadata:name:nginx#为Service对象命名spec:selector:app:nginx#指定pod的标签

ports:-port:80#Service绑定的端口

targetPort:80#目标Pod的端口任务7.2实现水平自动扩缩容任务实现任务7.2.2通过HPA实现Nginx的自动扩缩容使用命令行创建HPA并进行测试(1)执行kubectlautoscale命令创建HPA。#kubectlautoscaledeploymentnginx--cpu-percent=10--min=1--max=10horizontalpodautoscaler.autoscaling/nginxautoscaled(2)查看该HPA的当前状态。#kubectlgethpaNAMEREFERENCETARGETSMINPODSMAXPODSREPLICASAGEnginxDeployment/nginx0%/10%110167s(3)查看Nginx的Service对象的信息,获得其集群IP地址。#kubectlgetsvcnginxNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEnginxClusterIP4<none>80/TCP2m9s任务7.2实现水平自动扩缩容任务实现任务7.2.2通过HPA实现Nginx的自动扩缩容使用命令行创建HPA并进行测试扩容测试(4)打开另一个终端窗口,运行一个循环语句模拟不停地访问Nginx服务以便进行压力测试,不断增加该Pod的负载。#whiletrue;dowget-q-O-4>/dev/null;done(5)监测该HPA。[root@master01~]#kubectlgethpanginx--watchNAMEREFERENCETARGETSMINPODSMAXPODSREPLICASAGEnginxDeployment/nginx10%/10%11015m49snginxDeployment/nginx26%/10%11026m45snginxDeployment/nginx26%/10%11037mnginxDeployment/nginx17%/10%11067m15snginxDeployment/nginx9%/10%11067m30s(6)依次查看Deployment的副本数和Pod列表,进一步验证扩容结果。任务7.2实现水平自动扩缩容任务实现任务7.2.2通过HPA实现Nginx的自动扩缩容使用命令行创建HPA并进行测试缩容测试(7)切换到执行压力测试语句的终端窗口,终止压力测试。(8)切回监测HPA的终端窗口,继续观察HPA的变化。NAMEREFERENCETARGETSMINPODSMAXPODSREPLICASAGEnginxDeployment/nginx0%/10%110610mnginxDeployment/nginx0%/10%110614mnginxDeployment/nginx0%/10%110514mnginxDeployment/nginx0%/10%110114m15s结束HPA监测,然后执行以下命令查看Pod,可以发现回到最初只有一个副本的状态。#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEnginx-5999d8967d-zz2nk1/1Running015m(9)删除该HPA对象,清理实验环境。任务7.2实现水平自动扩缩容任务实现任务7.2.2通过HPA实现Nginx的自动扩缩容通过配置文件创建HPAapiVersion:autoscaling/v2kind:HorizontalPodAutoscalermetadata:name:nginx-hpaspec:minReplicas:1maxReplicas:10metrics:-type:Resourceresource:name:cputarget:type:UtilizationaverageUtilization:10#CPU平均使用率10%scaleTargetRef:#指定要控制的对象

apiVersion:apps/v1kind:Deploymentname:nginx任务7.2实现水平自动扩缩容任务7.1使用StatefulSet运行有状态应用程序任务7.3管理Pod的调度任务7.3管理Pod的调度任务说明01OPTION02OPTION03OPTION了解Kubernetes调度流程了解Pod的定向调度并掌握其实现方法掌握节点亲和性调度、Pod间亲和性调度和反亲和性调度04OPTION学会基于污点与容忍度进一步优化Pod调度任务7.3管理Pod的调度相关知识7.3.1Kubernetes调度概述调度解决的是Pod与节点的匹配问题,目的是将Pod部署到适当的节点上运行。调度是由调度器来完成的。任务7.3管理Pod的调度相关知识7.3.2Pod的定向调度基于节点名称定向调度spec:containers:-name:nginximage:nginx:1.14.2nodeName:node01#指定将Pod直接调度到node01节点上任务7.3管理Pod的调度相关知识7.3.2Pod的定向调度基于节点选择器定向调度spec:containers:-name:nginximage:nginx:1.14.2nodeSelector:#使用此字段实现节点选择约束,这是关键

nodeenv:prod#指定调度到具有nodeenv=prod标签的节点上任务7.3管理Pod的调度相关知识7.3.3亲和性与反亲和性调度应用场景将前台应用程序和后台服务部署在一起。将某类应用程序部署到某些特定节点。将不同的应用程序部署到不同的节点。两个层级节点Pod任务7.3管理Pod的调度相关知识7.3.3亲和性与反亲和性调度节点亲和性调度spec:affinity:nodeAffinity:#节点亲和性

requiredDuringSchedulingIgnoredDuringExecution:#硬性限制规则

nodeSelectorTerms:#节点选择器配置

-matchExpressions:#匹配表达式

-key:topology.kubernetes.io/zoneoperator:Invalues:-beijing-shanghaipreferredDuringSchedulingIgnoredDuringExecution:#软性限制规则

-weight:1#权重,值的范围1~100preference:#具体的参考规则

matchExpressions:#匹配表达式

-key:departmentoperator:Invalues:-salescontainers:#Pod的容器定义

任务7.3管理Pod的调度相关知识7.3.3亲和性与反亲和性调度Pod间亲和性与反亲和性调度spec:affinity:podAffinity:#Pod间亲和性

requiredDuringSchedulingIgnoredDuringExecution:#硬性限制规则

-labelSelector:#标签选择器

matchExpressions:#匹配表达式

-key:securityoperator:Invalues:-S1topologyKey:topology.kubernetes.io/zone#调度目标的拓扑域任务7.3管理Pod的调度相关知识7.3.3亲和性与反亲和性调度Pod间亲和性与反亲和性调度podAntiAffinity:#Pod间反亲和性

preferredDuringSchedulingIgnoredDuringExecution:#软性限制规则

-weight:100#权重,取值范围是1到100podAffinityTerm:#Pod间反亲和性条件

labelSelector:matchExpressions:-key:securityoperator:Invalues:-S2topologyKey:topology.kubernetes.io/zone#调度目标的拓扑域

containers:

任务7.3管理Pod的调度相关知识7.3.4污点与容忍度使用kubectltaint命令给节点标记一个污点kubectltaintnodes<node_name><key>=<value>:effect在Pod配置文件中通过.spec.toleration字段设置Pod的容忍度tolerations:-key:string#键的名称

operator:string#操作符

value:string#键的值,可选

effect:string#作用任务7.3管理Pod的调度相关知识7.3.4污点与容忍度Pod的容忍度与节点的污点的匹配方式完全匹配不完全匹配特殊情形如果容忍度不指定key字段且operator字段值为Exists,则该容忍度匹配任何污点。如果容忍度不指定effect字段,则可以匹配所有具有该key字段值的污点。任务7.3管理Pod的调度相关知识7.3.4污点与容忍度由节点上污点的effect属性决定如何调度。调度策略NoSchedule:禁止调度。PreferNoSchedule:与NoSchedule类似,只不过是非强制性的。NoExecute:不会将Pod调度到具有该污点的节点上,同时会将节点上已经存在的Pod驱逐出去。任务7.3管理Pod的调度相关知识7.3.4污点与容忍度污点和容忍度的常见用例专用节点,将某些节点专门分配给特定的一组用户使用。配备特殊硬件设备的节点。基于污点的驱逐。如果Pod不能容忍这类污点,Pod会被立即驱逐。如果Pod能够容忍这类污点,但是在容忍度定义中没有指定tolerationSeconds字段,则Pod还会一直在该节点上运行。如果Pod能够容忍这类污点,而且在容忍度定义中指定了tolerationSeconds字段,则Pod还能在该节点上继续运行由tolerationSeconds字段所指定的一段时间。任务7.3管理Pod的调度相关知识7.3.4污点与容忍度Kubernetes内置的污点污点名称说明node.kubernetes.io/not-ready节点未准备好,相当于节点状态Ready的值为"False"node.kubernetes.io/unreachable节点控制器访问不到节点,相当于节点状态Ready的值为"Unknown"node.kubernetes.io/memory-pressure节点存在内存压力node.kubernetes.io/disk-pressure节点存在磁盘压力node.kubernetes.io/pid-pressure节点的PID压力node.kubernetes.io/network-unavailable节点网络不可用node.kubernetes.io/unschedulable节点不可调度node.cloudprovider.kubernetes.io/uninitialized如果kubelet启动时指定一个外部云平台驱动,则它将给当前节点添加一个污点将其标志为不可用。初始化该节点之后,kubelet将删除此污点任务7.3管理Pod的调度任务实现任务7.3.1将应用程序部署在特定的节点上apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deployspec:replicas:2#副本数

selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginx#Pod标签任务7.3管理Pod的调度任务实现任务7.3.1将应用程序部署在特定的节点上spec:affinity:nodeAffinity:#节点亲和性配置

preferredDuringSchedulingIgnoredDuringExecution:#软性限制规则

-weight:80preference:#第1条参考规则

matchExpressions:-key:nodeenvoperator:Invalues:-prod-weight:50preference:#第2条参考规则

matchExpressions:-key:ssdoperator:Existscontainers:-name:nginximage:nginx:1.16-alpine任务7.3管理Pod的调度任务实现任务7.3.2将同一应用程序部署到不同的节点上apiVersion:apps/v1kind:Deploymentmetadata:name:redis-cachespec:selector:matchLabels:app:storereplicas:3#副本数

template:metadata:labels:app:store任务7.3管理Pod的调度任务实现任务7.3.2将同一应用程序部署到不同的节点上spec:affinity:podAntiAffinity:#Pod间反亲和性

requiredDuringSchedulingIgnoredDuringExecution:#硬性限制规则

-labelSelector:matchExpressions:-key:appoperator:Invalues:-storetopologyKey:"kubernetes.io/hostname"#拓扑域为节点

containers:-name:redis-serverimage:redis:3.2-alpine任务7.3管理Pod的调度任务实现任务7.3.3将关联的应用程序部署到同一节点上apiVersion:apps/v1kind:Deploymentmetadata:name:web-serverspec:selector:matchLabels:app:web-storereplicas:2#副本数

template:metadata:labels:app:web-storespec:affinity:任务7.3管理Pod的调度任务实现任务7.3.3将关联的应用程序部署到同一节点上podAntiAffinity:#Pod间反亲和性

requiredDuringSchedulingIgnoredDuringExecution:#硬性限制规则

-labelSelector:matchExpressions:-key:appoperator:Invalues:-web-storetopologyKey:"kubernetes.io/hostname"podAffinity:#Pod间亲和性

requiredDuringSchedulingIgnoredDuringExecution:#硬性限制规则

-labelSelector:matchExpressions:-key:appoperator:Invalues:-storetopologyKey:"kubernetes.io/hostname"containers:-name:web-appimage:nginx:1.16-alpine任务7.3管理Pod的调度任务实现任务7.3.4示范污点和容忍度的使用(1)为node01节点标记污点,其key属性值设置为group,value属性值设置为info,effect属性值设置为NoSchedule,以拒绝将Pod调度到该节点上。(2)编写Deployment配置文件。spec:replicas:2selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:nginximage:nginx:1.16-alpine任务7.3管理Pod的调度任务实现任务7.3.4示范污点和容忍度的使用(3)创建名为nginx-deploy的Deployment对象。(4)查看该Deployment对象的Pod副本列表。(5)修改配置文件taint-nginx-deploy.yaml,在其中增加以下容忍度定义。

tolerations:-key:"group"operator:"Equal"value:"info"effect:"NoSchedule"(6)重新应用该配置文件。(7)查看该Deployment对象的Pod副本列表以验证容忍度设置是否生效。#kubectlgetpod-lapp=nginx-owideNAMEREADYSTATUSRESTARTSAGEIPNODE...nginx-deploy-6496569d95-2rz8g1/1Running082s88node01...nginx-deploy-6496569d95-n626v1/1Running081s1node02...任务7.3管理Pod的调度任务实现任务7.3.4示范污点和容忍度的使用(8)对该Deployment对象进行扩容,副本数增加到4,可以发现4个Pod副本都分布在node01和node02两个节点上运行。(9)将node01节点上标签为group=info的污点的effect属性值修改为NoExecute,以便将该节点上已经存在的Pod驱逐出去。#kubectltaintnodesnode01group=info:NoExecute--overwrite=truenode/node01modified(10)查看Pod副本列表以验证驱逐。#kubectlgetpod-lapp=nginx-owideNAMEREADYSTATUSRESTARTSAGEIPNODE...nginx-deploy-6496569d95-2ht6h1/1Running049s4node02...nginx-deploy-6496569d95-2j77n1/1Running03m19s2node02...nginx-deploy-6496569d95-5f5zd1/1Running049s3node02...nginx-deploy-6496569d95-n626v1/1Running07m51s1node02...任务7.3管理Pod的调度任务实现任务7.3.4示范污点和容忍度的使用(11)通过kubectldescribenodenode01命令查看节点详细信息。#kubectldescribenodenode01|grepgroup=infoTaints:group=info:NoExecutegroup=info:NoSchedule(12)清除节点上的污点。#kubectltaintnodesnode01group-node/node01untainted#kubectltaintnodesnode01group=office:NoExecute-node/node01untainted#kubectltaintnodesnode01group=office:NoSchedule-node/node01untaintedTHANKSKubernetes集群实战(微课版)工业和信息化精品系列教材——云计算技术项目8

高效管理应用程序的部署能力CAPACITY要求了解Helm及其相关概念和基本用法掌握使用Helm部署和管理Kubernetes应用程序的方法了解Kustomization文件了解Kustomize的基本用法学会使用Kustomize管理Kubernetes应用程序的部署任务8.2使用Kustomize定制应用程序的部署配置任务8.1使用Helm简化应用程序的部署和管理任务8.1使用Helm简化应用程序的部署和管理任务说明01OPTION02OPTION03OPTION了解Helm的概念和工作机制了解Chart结构了解Helm的基本用法04OPTION掌握Helm的安装和配置方法05OPTION学会使用Helm在Kubernetes中部署和管理应用程序任务8.1使用Helm简化应用程序的部署和管理相关知识8.1.1什么是HelmHelm是Kubernetes应用程序的包管理器。Helm的主要功能支持公共或私有仓库实现Kubernetes应用程序软件包的版本管理和分发。方便普通用户从第三方获取共享的Kubernetes应用程序软件包。创建和托管自己的Kubernetes应用程序软件包。简化Kubernetes应用程序的安装部署。简化Kubernetes应用程序的管理操作,如升级、删除、回滚等。Helm特别适合管理复杂的Kubernetes应用程序。任务8.1使用Helm简化应用程序的部署和管理相关知识8.1.2Helm是如何工作的Helm的基本概念Chart——代表一个Helm包,其中包含了在Kubernetes集群中运行应用程序、工具或服务所需的所有资源定义等。Repository——用于发布和存储Chart的仓库。Release——代表在Kubernetes集群中运行的Chart的一个实例。Helm模板Helm在Chart包中使用Gotemplate模板语言来编写表示Kubernetes资源的模板文件,并提供让用户配置这些模板变量的能力。任务8.1使用Helm简化应用程序的部署和管理相关知识8.1.2Helm是如何工作的Helm的工作机制任务8.1使用Helm简化应用程序的部署和管理相关知识8.1.3Chart结构Chart的文件组织结构wordpress/Chart.yaml#包含Chart描述信息的YAML文件

LICENSE#提供Chart许可证信息的纯文本文件,该文件是可选的

README.md#易读格式的README文件,此文件也是可选的

values.yaml#提供Chart默认配置值的YAML文件

values.schema.json#影响values.yaml文件结构的JSON模式,这是可选的

charts/#存放此Chart所依赖的其他Chart包的目录

crds/#存放自定义资源定义文件的目录

templates/#存放用于生成有效的Kubernetes配置文件的模板的目录

templates/NOTES.txt#包含模板用法简要说明的纯文本文件任务8.1使用Helm简化应用程序的部署和管理相关

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论