Kubernetes 集群实战(微课版)课件 项目5、6 发布应用程序、管理存储和配置信息_第1页
Kubernetes 集群实战(微课版)课件 项目5、6 发布应用程序、管理存储和配置信息_第2页
Kubernetes 集群实战(微课版)课件 项目5、6 发布应用程序、管理存储和配置信息_第3页
Kubernetes 集群实战(微课版)课件 项目5、6 发布应用程序、管理存储和配置信息_第4页
Kubernetes 集群实战(微课版)课件 项目5、6 发布应用程序、管理存储和配置信息_第5页
已阅读5页,还剩122页未读, 继续免费阅读

下载本文档

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

文档简介

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

发布应用程序能力CAPACITY要求了解Service的概念和工作机制了解不同类型的Service资源定义方法学会使用Service在集群内、外部发布应用程序了解Ingress和Ingress控制器,学会使用Ingress对外基于HTTP协议发布应用程序了解灰度发布和蓝绿发布及其应用场景,掌握Kubernetes灰度发布的实现方法任务5.2使用Ingress发布应用程序任务5.1使用Service发布应用程序任务5.3实现灰度发布与蓝绿发布任务5.1使用Service发布应用程序任务说明01OPTION02OPTION03OPTION了解Service的概念理解Service的工作机制了解Service的负载均衡机制和服务发现机制04OPTION了解Service的类型及其配置05OPTION了解Service的类型及其配置06OPTION了解Service的类型及其配置任务5.1使用Service发布应用程序相关知识5.1.1什么是ServiceService是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。主要功能:服务发现和负载均衡任务5.1使用Service发布应用程序相关知识5.1.2通过Endpoints理解Service的工作机制什么是EndpointsEndpoints是一种Kubernetes资源,用来记录一个Service对应的所有Pod的访问地址。Endpoints实际上是Service后端的可访问Pod端点集合,其中的Pod必须处于运行状态。任务5.1使用Service发布应用程序相关知识5.1.2通过Endpoints理解Service的工作机制创建Service以验证Endpoints编辑定义Deployment对象的配置文件。apiVersion:apps/v1#版本号kind:Deployment#类型为Deploymentmetadata:#元数据

name:nginx-deploylabels:#标签

app:nginx-deployspec:#详细信息

replicas:2#副本数量

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

app:nginx-pod

任务5.1使用Service发布应用程序相关知识5.1.2通过Endpoints理解Service的工作机制创建Service以验证Endpoints编辑定义Deployment对象的配置文件。template:#定义模板,当副本数量不足时会根据模板定义创建Pod副本

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

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

-name:nginx#容器的名称

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

ports:-name:nginx-portcontainerPort:80#容器需要暴露的端口基于该配置文件创建Deployment对象。任务5.1使用Service发布应用程序相关知识5.1.2通过Endpoints理解Service的工作机制创建Service以验证Endpoints创建定义Service对象的配置文件。apiVersion:v1kind:Servicemetadata:name:nginx-svc#为Service对象命名spec:selector:app:nginx-pod#指定Pod的标签

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

targetPort:80#目标Pod的端口(容器端口)基于该配置文件创建Service对象。任务5.1使用Service发布应用程序相关知识5.1.2通过Endpoints理解Service的工作机制创建Service以验证Endpoints查看该Service对象的ClusterIP地址和Service端口。#kubectlgetservicenginx-svcNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEnginx-svcClusterIP5<none>8080/TCP25s测试通过ClusterIP地址和Service端口访问后端Pod承载的应用程序。#curl5:8080<!DOCTYPEhtml>......</html>查看Endpoints对象列表。#kubectlgetendpointsNAMEENDPOINTSAGEkubernetes0:644329dnginx-svc03:80,76:802m3s任务5.1使用Service发布应用程序相关知识5.1.3Service的负载均衡机制kube-proxy的代理模式iptables代理模式任务5.1使用Service发布应用程序相关知识5.1.3Service的负载均衡机制kube-proxy的代理模式IPVS代理模式任务5.1使用Service发布应用程序相关知识5.1.3Service的负载均衡机制负载均衡策略轮询(round-robin,rr)最少连接(leastconnection,lc)目标哈希(destinationhashing,dh)源哈希(sourcehashing,sh)预计延迟时间最短(shortestexpecteddelay)从不排队(neverqueue,nq)会话保持首次将某个客户端来源的IP发起的请求转发到后端的某个Pod,之后来自该IP的请求都将转发到该Pod。任务5.1使用Service发布应用程序相关知识5.1.5定义Service资源apiVersion:v1#API版本kind:Service#资源类型metadata:#元数据

name:string#资源名称

namespace:string#名称空间

labels:#标签

-name:stringannotations:#注解

-name:stringspec:selector:[]#标签选择器配置,选择具有指定标签的Pod作为管理对象

type:string#Service的类型,指定Service的访问方式

clusterIP:string#集群IP地址

sessionAffinity:string#会话亲和性(会话保持)

ports:#Service端口列表

-name:string#端口名称

protocol:string#协议

port:int#监听的端口

targetPort:int#后端Pod的端口(容器端口)

nodePort:int#映射到主机的端口任务5.1使用Service发布应用程序相关知识5.1.6Service类型ClusterIP类型clusterIP:string#集群IP,默认会生成一个

type:ClusterIP#Service类型

ports:-port:int#Service端口

targetPort:int#目标Pod端口(容器端口)NodePort类型type:NodePort#Service类型

ports:-port:int#Service端口

targetPort:int#目标Pod端口(容器端口)

nodePort:int#节点端口任务5.1使用Service发布应用程序相关知识5.1.6Service类型LoadBalancer类型spec:type:LoadBalancer#Service类型

clusterIP:string#虚拟IPports:-port:int#Service端口

targetPort:int#目标Pod端口(容器端口)status:loadBalancer:#外部负载均衡器,用于公共环境

ingress:-ip:string#外部负载均衡器的IP地址

hostname:string#外部负载均衡器的主机名ExternalName类型type:ExternalName#Service类型

externalName:string#外部服务域名任务5.1使用Service发布应用程序相关知识5.1.7无头Service无头(Headless)Service一种没有ClusterIP的特殊Service。不需要负载均衡以及单独的ClusterIP时,可以通过指定.spec.clusterIP字段的值为None来创建无头Service。无头Service不分配ClusterIP。DNS如何查找域名取决于Service是否定义了标签选择器。对于未定义标签选择器的无头Service,Kubernetes不会创建Endpoint对象,具体由DNS系统查找和配置。任务5.1使用Service发布应用程序相关知识5.1.8多端口Serviceports:-name:httpprotocol:TCPport:80targetPort:9376-name:httpsprotocol:TCPport:443targetPort:9377任务5.1使用Service发布应用程序任务实现任务5.1.1 验证Kubernetes的服务发现机制验证基于环境变量的服务发现机制#kubectlexectomcat--printenv|grepNGINXNGINX_SVC_PORT_8080_TCP_PORT=8080NGINX_SVC_PORT_8080_TCP_ADDR=17NGINX_SVC_PORT=tcp://17:8080NGINX_SVC_PORT_8080_TCP=tcp://17:8080NGINX_SVC_SERVICE_PORT=8080NGINX_SVC_PORT_8080_TCP_PROTO=tcpNGINX_SVC_SERVICE_HOST=17任务5.1使用Service发布应用程序任务实现任务5.1.1 验证Kubernetes的服务发现机制验证基于DNS的服务发现机制#kubectlruncurl--image=radial/busyboxplus:curl-i--ttyIfyoudon'tseeacommandprompt,trypressingenter.[root@curl:/]$nslookupnginx-svc#查询域名解析Server:0#提供解析的DNS服务器Address1:0kube-dns.kube-system.svc.cluster.local#以下为解析结果Name:nginx-svc#域名Address1:17nginx-svc.default.svc.cluster.local#解析地址[root@curl:/]$exitSessionended,resumeusing'kubectlattachcurl-ccurl-i-t'commandwhenthepodisrunning任务5.1使用Service发布应用程序任务实现任务5.1.2使用Service对外发布集群中的应用程序(1)基于Deployment对象配置文件运行Nginx。#kubectlapply-f/k8sapp/05/nginx-deploy.yamldeployment.apps/nginx-deploycreated#kubectlgetreplicasets-owideNAMEDESIREDCURRENTREADYAGECONTAINERSIMAGESSELECTORnginx-deploy-7595b97f5f2222m19snginxnginx:1.14.2app=nginx-pod,pod-template-hash=7595b97f5f任务5.1使用Service发布应用程序任务实现任务5.1.2使用Service对外发布集群中的应用程序(2)修改Service对象配置文件。spec:type:NodePort#Service类型

selector:app:nginx-pod#指定Pod的标签

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

targetPort:80#目标Pod的端口

nodePort:30008#节点上绑定的端口(3)基于新的Service对象配置文件创建Service来发布Nginx服务。#kubectlapply-f/k8sapp/05/nginx-nodeport-service.yamlservice/nginx-svccreated任务5.1使用Service发布应用程序任务实现任务5.1.2使用Service对外发布集群中的应用程序(4)查看该Service对象的详细信息,重点考察端口信息。Selector:app=nginx-podType:NodePortIPFamilyPolicy:SingleStackIPFamilies:IPv4IP:72IPs:72Port:<unset>8080/TCPTargetPort:80/TCPNodePort:<unset>30008/TCPEndpoints:12:80,85:80SessionAffinity:NoneExternalTrafficPolicy:ClusterEvents:(5)获取其中节点的IP地址。(6)确保节点主机相关的防火墙规则开放NodePort表示的端口。任务5.1使用Service发布应用程序任务实现任务5.1.2使用Service对外发布集群中的应用程序使用节点地址和节点端口来访问发布的服务。[root@master01~]#curl2:30008......<h1>Welcometonginx!</h1>......任务5.1使用Service发布应用程序任务实现任务5.1.3使用Service发布前后端应用程序前端Nginx连接后端Tomcat任务5.1使用Service发布应用程序任务实现任务5.1.3使用Service发布前后端应用程序创建并发布后端应用程序使用Deployment部署该应用程序apiVersion:apps/v1kind:Deploymentmetadata:name:backendspec:selector:matchLabels:#多标签选择器

app:webapptier:backendreplicas:3template:metadata:labels:app:webapptier:backendspec:containers:#容器运行Tomcat服务

-name:tomcatimage:tomcat:8.0-alpineports:-containerPort:8080任务5.1使用Service发布应用程序任务实现任务5.1.3使用Service发布前后端应用程序创建并发布后端应用程序使用Service发布该应用程序apiVersion:v1kind:Servicemetadata:name:webappspec:selector:#组合多标签选择器选择目标Podapp:webapptier:backendports:-protocol:TCPport:80targetPort:8080任务5.1使用Service发布应用程序任务实现任务5.1.3使用Service发布前后端应用程序创建并发布前端应用程序创建ConfigMap对象将Nginx服务的上游服务器配置为后端应用程序。apiVersion:v1kind:Servicemetadata:name:webappspec:selector:#组合多标签选择器选择目标Podapp:webapptier:backendports:-protocol:TCPport:80targetPort:8080任务5.1使用Service发布应用程序任务实现任务5.1.3使用Service发布前后端应用程序创建并发布前端应用程序创建Deployment对象apiVersion:apps/v1kind:Deploymentmetadata:name:frontendspec:selector:matchLabels:app:webapptier:frontendreplicas:1#前端只提供一个副本

template:metadata:labels:app:webapptier:frontend任务5.1使用Service发布应用程序任务实现任务5.1.3使用Service发布前后端应用程序创建并发布前端应用程序创建Deployment对象spec:containers:-name:nginximage:nginx:1.14.2volumeMounts:#挂载由ConfigMap提供的配置文件

-name:nginx-configmountPath:/etc/nginx/conf.d/default.confsubPath:nginx.confvolumes:#定义由ConfigMap提供的特殊卷

-name:nginx-configconfigMap:name:nginx-configitems:-key:nginx.confpath:nginx.conf任务5.1使用Service发布应用程序任务实现任务5.1.3使用Service发布前后端应用程序创建并发布前端应用程序创建Service对象apiVersion:v1kind:Servicemetadata:name:frontendspec:type:NodePort#Service类型为NodePortselector:app:webapptier:frontendports:-protocol:TCPport:80targetPort:80nodePort:30080#节点上绑定的端口任务5.1使用Service发布应用程序任务实现任务5.1.3使用Service发布前后端应用程序通过前端发送流量进行测试#curl1:30080......<title>ApacheTomcat/8.0.35</title>任务5.2使用Ingress发布应用程序任务5.1使用Service发布应用程序任务5.3实现灰度发布与蓝绿发布任务5.2使用Ingress发布应用程序任务说明01OPTION02OPTION03OPTION了解Ingress的概念和定义方法了解Ingress控制器的概念和功能掌握在Kubernetes集群中部署NginxIngress控制器的方法04OPTION学会使用CronJob控制器运行定时任务任务5.2使用Ingress发布应用程序相关知识5.2.1什么是IngressIngress是对集群中Service的外部访问进行管理的资源。Ingress相当于一个第7层的负载均衡器。任务5.2使用Ingress发布应用程序相关知识5.2.2定义IngressapiVersion:networking.k8s.io/v1#API版本kind:Ingress#资源类型metadata:#元数据

name:string#名称,要求合规的DNS子域名名称

labels:#标签

-name:stringannotations:#注解

-name:stringspec:ingressClassName:string#Ingress类名

rules:#路由规则

-host:string#域名

http:#HTTP协议

paths:#路径定义

-path:string#具体路径

pathType:string#路径类型

backend:#资源后端

service:name:string#Service名称

port:number:int#Service绑定的端口任务5.2使用Ingress发布应用程序相关知识5.2.3什么是Ingress控制器Ingress控制器是具体实现反向代理和负载均衡的程序。Kubernetes项目目前支持和维护的Ingress控制器AWSGCENginxIngressIngress控制器需要自行部署。NginxIngress是比较常用的控制器。任务5.2使用Ingress发布应用程序任务实现任务5.2.1部署NginxIngress控制器了解NginxIngress控制器的部署方式使用Deployment和LoadBalancer类型的Service使用Deployment和NodePort类型的Service使用DaemonSet和HostNetwork任务5.2使用Ingress发布应用程序任务实现任务5.2.1部署NginxIngress控制器安装NginxIngress控制器(1)将该控制器部署到指定节点,为该节点(本例为node02)设置标签。#kubectllabelnodenode02ingress=truenode/node02labeled(2)从NginxIngress控制器的官网下载YAML格式的配置文件deploy.yaml,更名为ingress-nginx-controller.yaml。(3)修改该文件,替换其中镜像仓库的地址。image:/google_containers/nginx-ingress-controller:v1.7.0image:/google_containers/kube-webhook-certgen:v1.1.1image:/google_containers/kube-webhook-certgen:v1.1.1任务5.2使用Ingress发布应用程序任务实现任务5.2.1部署NginxIngress控制器安装NginxIngress控制器(4)针对部署方式涉及的DaemonSet资源和HostNetwork定义,修改Deployment对象配置。apiversion:apps/vl#kind:Deploymentkind:DaemonSet#将对象类型由Deployment改为DaemonSetmetadata:......name:ingress-nginx-controllernamespace:ingress-nginxspec:......#将ClusterFirst修改为ClusterFirstWithHostNet,使Nginx可以解析集群内部名称

#dnsPolicy:ClusterFirstdnsPolicy:ClusterFirstWithHostNetnodeSelector:#kubernetes.io/os:linuxingress:"true"#选择部署的节点改为此设置

hostNetwork:true#此项设置是增加的,表示启用主机网络任务5.2使用Ingress发布应用程序任务实现任务5.2.1部署NginxIngress控制器安装NginxIngress控制器创建NginxIngress控制器。#kubectlcreate-f/k8sapp/05/ingress-nginx-controller.yamlnamespace/ingress-nginxcreatedserviceaccount/ingress-nginxcreated......working.k8s.io/nginxcreatedvalidatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admissioncreated在集群内部访问该控制器发布的服务进行测试。#curl2......<center><h1>404NotFound</h1></center><hr><center>nginx</center></body></html>任务5.2使用Ingress发布应用程序任务实现任务5.2.1部署NginxIngress控制器本地实际测试(1)创建一个运行简单Web服务器的Deployment和相应的Service对象。#kubectlcreatedeploymentdemo--image=httpd--port=80deployment.apps/democreated#kubectlexposedeploymentdemoservice/demoexposed(2)创建Ingress对象。#kubectlcreateingressdemo-localhost--class=nginx--rule="demo.localdev.me/*=demo:80"working.k8s.io/demo-localhostcreated(3)将一个本地端口转发到Ingress控制器。#kubectlport-forward--namespace=ingress-nginxservice/ingress-nginx-controller8080:80Forwardingfrom:8080->80Forwardingfrom[::1]:8080->80Handlingconnectionfor8080任务5.2使用Ingress发布应用程序任务实现任务5.2.1部署NginxIngress控制器本地实际测试(4)在控制平面节点上使用浏览器访问网址http://demo.localdev.me:8080进行测试任务5.2使用Ingress发布应用程序任务实现任务5.2.2使用Ingress对外发布应用程序使用Deployment和Service部署和发布应用程序(1)编写Nginx的Deployment和Service配置文件。ports:-port:80#Service绑定的端口

targetPort:80#目标Pod的端口(容器端口)(2)编写Tomcat的Deployment和Service配置文件。apiVersion:apps/v1#版本号kind:Deployment#类型为Deployment......spec:containers:-name:tomcatimage:tomcat:8.0-alpine#容器所用的镜像

ports:-containerPort:8080#容器需要暴露的端口---任务5.2使用Ingress发布应用程序任务实现任务5.2.2使用Ingress对外发布应用程序使用Deployment和Service部署和发布应用程序(2)编写Tomcat的Deployment和Service配置文件。apiVersion:v1kind:Servicemetadata:name:tomcat-svc#设置service的显示名字spec:selector:app:tomcat-pod#指定pod的标签

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

targetPort:8080#目标Pod的端口(3)创建Deployment和Service对象。(4)查看Service列表,两个Service的类型都是默认的ClusterIP,只能在集群内部访问。任务5.2使用Ingress发布应用程序任务实现任务5.2.2使用Ingress对外发布应用程序使用Ingress对外发布上述Service(1)编写定义Ingress资源的配置文件。spec:ingressClassName:nginx#指定Ingress类

rules:-host:#访问入口域名

http:paths:-path:/pathType:Prefixbackend:service:name:nginx-svc#指定后端Serviceport:number:80任务5.2使用Ingress发布应用程序任务实现任务5.2.2使用Ingress对外发布应用程序使用Ingress对外发布上述Service(1)编写定义Ingress资源的配置文件。-host:#访问入口域名

http:paths:-path:/pathType:Prefixbackend:service:name:tomcat-svc#指定后端Serviceport:number:8080任务5.2使用Ingress发布应用程序任务实现任务5.2.2使用Ingress对外发布应用程序使用Ingress对外发布上述Service创建Ingress对象。#kubectlcreate-f/k8sapp/05/http-ingress.yamlworking.k8s.io/http-ingresscreated查看所创建的Ingress对象的详细信息。IngressClass:nginxDefaultbackend:<default>Rules:HostPathBackends----------------

/nginx-svc:80(3:80,86:80)

/tomcat-svc:8080(4:8080,6:8080,32:8080)Annotations:<none>任务5.2使用Ingress发布应用程序任务实现任务5.2.2使用Ingress对外发布应用程序访问Ingress发布的应用程序访问任务5.2使用Ingress发布应用程序任务实现任务5.2.2使用Ingress对外发布应用程序访问Ingress发布的应用程序访问任务5.2使用Ingress发布应用程序任务5.1使用Service发布应用程序任务5.3实现灰度发布与蓝绿发布任务5.3实现灰度发布与蓝绿发布任务说明01OPTION02OPTION03OPTION了解灰度发布和蓝绿发布了解灰度发布和蓝绿发布的Kubernetes解决方案学会使用NginxIngress控制器实现灰度发布04OPTION学会使用NginxIngress控制器实现蓝绿发布任务5.3实现灰度发布与蓝绿发布相关知识5.3.1什么是灰度发布灰度发布又称金丝雀(Canary)发布。当版本升级时,在一个集群中同时发布旧的稳定版本和新的金丝雀(测试)版本,让部分用户使用金丝雀版本,其他用户继续使用稳定版本,待金丝雀版本测试完成后,将金丝雀版本升级为新的稳定版本,并下线旧的稳定版本。任务5.3实现灰度发布与蓝绿发布相关知识5.3.2什么是蓝绿发布蓝绿发布提供零宕机的发布方式,目的是减少发布过程中服务停止的时间。在保留旧版本(所谓绿色版本)的同时部署新版本(所谓蓝色版本),将两个版本同时在线,不经过灰度发布和滚动升级,一次性将流量从旧版本直接切换到新版本。蓝绿发布的新版本和旧版本同时存在,实际运行的只能为其中之一,非蓝即绿,一般通过开关控制,可以在两个版本之间快速切换任务5.3实现灰度发布与蓝绿发布相关知识5.3.3Kubernetes的灰度发布和蓝绿发布解决方案解决方案适用场景说明Service发布需求简单,简单测试只需利用Kubernetes的原生功能,无需其他插件或复杂用法,不过自动化程度差NginxIngress不限配置NginxIngress所支持的Annotation(注解)来实现灰度发布或蓝绿发布;支持基于Header、Cookie和服务权重等流量分配策略;要求Kubernetes集群安装NginxIngress控制器,并且能够承受一定的资源消耗ASM生产环境无须修改应用程序的代码;支持界面可视化;更多的发布策略;需要为Kubernetes集群启用Istio(为微服务架构提供流量管理机制)连接,管理和保护微服务的开放平台,占用额外资源任务5.3实现灰度发布与蓝绿发布相关知识5.3.4NginxIngress的灰度发布和蓝绿发布方法基于请求头的流量切分策略nginx.ingress.kubernetes.io/canary-by-headernginx.ingress.kubernetes.io/canary-by-header-valuenginx.ingress.kubernetes.io/canary-by-header-pattern基于Cookie的流量切分策略nginx.ingress.kubernetes.io/canary-by-cookie基于权重的流量切分策略nginx.ingress.kubernetes.io/canary-weight优先级从高到低任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.1使用NginxIngress实现灰度发布部署两个版本的应用程序(1)定义旧版本的Deployment和Service。#定义ConfigMap,使用ConfigMap更改Nginx首页文件apiVersion:v1kind:ConfigMap#类型为ConfigMapmetadata:name:nginx-index-html-configmap1#ConfigMap名称data:#定制index.html文件的内容

index.html:|ThisisV1---任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.1使用NginxIngress实现灰度发布部署两个版本的应用程序(1)定义旧版本的Deployment和Service。#定义DeploymentapiVersion:apps/v1kind:Deployment#类型为Deployment......

spec:containers:-name:nginx#容器的名称

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

ports:-name:nginx-portcontainerPort:80#容器需要暴露的端口

volumeMounts:#卷挂载点

-mountPath:/usr/share/nginx/htmlname:nginx-indexvolumes:#定义卷

-name:nginx-indexconfigMap:name:nginx-index-html-configmap1---任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.1使用NginxIngress实现灰度发布部署两个版本的应用程序(1)定义旧版本的Deployment和Service。#定义ServiceapiVersion:v1kind:Servicemetadata:name:nginx-v1spec:selector:app:nginx-v1ports:-targetPort:80port:8080type:NodePort任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.1使用NginxIngress实现灰度发布部署两个版本的应用程序(2)定义新版本的Deployment和Service。metadata:name:nginx-index-html-configmap2#ConfigMap名称data:index.html:|ThisisV2#index.html文件的内容(3)创建Deployment和Service对象,同时还会创建相应的ConfigMap对象。(4)查看Service列表,发现两个新创建的两个版本的Service都能正常运行。(5)测试两个版本的Nginx服务的访问,结果都是正常的。任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.1使用NginxIngress实现灰度发布创建稳定版本IngressapiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:stable-ingress#Ingress名称

annotations:kubernetes.io/ingress.class:nginx#通过注解指定Ingress类spec:rules:-host:#对外发布服务的域名

http:paths:-path:/pathType:Prefixbackend:service:name:nginx-v1#指定后端服务(指向旧版本)

port:number:80任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.1使用NginxIngress实现灰度发布创建金丝雀版本Ingress实现灰度发布apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:canary-ingress#Ingress名称

annotations:kubernetes.io/ingress.class:nginx#通过注解指定Ingress类

nginx.ingress.kubernetes.io/canary:"true"#启用Canary#将20%的流量转发到CanaryIngressnginx.ingress.kubernetes.io/canary-weight:"20"spec:rules:-host:#对外发布服务的域名

http:paths:-path:/pathType:Prefixbackend:service:name:nginx-v2#指定后端服务(指向新版本)

port:number:80任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.1使用NginxIngress实现灰度发布创建金丝雀版本Ingress实现灰度发布创建名为canary-ingress的Ingress对象。查看Ingress列表,发现新创建了名称为canary-ingress的Ingress对象。kubectlgetingNAMECLASSHOSTSADDRESSPORTSAGEcanary-ingress<none>52802m37sstable-ingress<none>5280134m使用Ingress发布的Nginx服务来测试灰度发布。#foriin{1..10};docurl;done;ThisisV1ThisisV1ThisisV1ThisisV1ThisisV1ThisisV1ThisisV1ThisisV1ThisisV2ThisisV2任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.1使用NginxIngress实现灰度发布将所有流量从旧版本迁移至新版本(1)修改稳定版本的Ingress配置,将stable-ingress.yaml文件中的后端服务指向新版本nginx-v2:

backend:service:name:nginx-v2#将后端服务指向新版本(2)应用stable-ingress.yaml配置文件以使配置更改生效。(3)访问Nginx服务进行测试,可以发现所有流量都迁移到新版本。#foriin{1..10};docurl;done;ThisisV2ThisisV2......ThisisV2ThisisV2任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.1使用NginxIngress实现灰度发布将所有流量从旧版本迁移至新版本(4)删除用于灰度发布的金丝雀版本Ingress对象。(5)删除旧版本的Deployment和Service对象,使相应的Nginx服务下线。(6)查看Service列表,发现目前仅有新版本的Service在线运行,完成版本的升级。#kubectlgetsvcNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEnginx-v2NodePort8<none>8080:31005/TCP14h(7)删除稳定版本的Ingress对象,以及新版本的Deployment和Service对象,清理实验环境。任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.2使用NginxIngress实现蓝绿发布(1)沿用灰度发布实验部署的两个版本Nginx服务,创建相应的Deployment和Service对象。(2)将灰度发布实验稳定版本Ingress作为绿色版本Ingress,基于该配置文件创建绿色版本的Ingress对象。(3)访问使用Ingress发布的Nginx服务进行测试,发现所有流量都分配到绿色版本(旧版本)。#foriin{1..10};docurl;done;ThisisV1......ThisisV1(4)将灰度发布实验金丝雀版本Ingress作为蓝色版本Ingress。基于该配置文件创建蓝色版本的Ingress对象。nginx.ingress.kubernetes.io/canary-weight:"100"任务5.3实现灰度发布与蓝绿发布任务实现任务5.3.2使用NginxIngress实现蓝绿发布(5)访问使用Ingress发布的Nginx服务进行测试,发现所有流量都分配到蓝色版本(新版本)。#foriin{1..10};docurl;done;ThisisV2......ThisisV2(6)蓝色版本运行过程中如果出现问题,修改blue-ingress.yaml文件,将流量权重的值改为0,所有流量都切回到绿色版本(旧版本)。(7)修正新版本问题之后,再次更新应用程序部署,完成后再修改blue-ingress.yaml文件,将流量权重值重新设置为100,更新Ingress对象,以便将流量全部导向蓝色版本。(8)新版本一直正常运行并且符合预期,则可以结束蓝绿发布,将新版本应用程序重新以绿色版本发布,撤销蓝色版本,并下线旧版本应用程序。(9)删除所有Ingress对象、Deployment和Service对象,删除NginxIngress控制器。THANKSKubernetes集群实战(微课版)工业和信息化精品系列教材——云计算技术项目6

管理存储和配置信息能力CAPACITY要求了解Kubernetes卷的概念和类型,学会使用卷实现基本存储理解PV和PVC的概念并掌握其基本用法学会组合使用PV和PVC实现持久化卷的管理理解StorageClass的概念,掌握使用StorageClass实现动态卷制备的方法学会使用ConfigMap和Secret为容器提供配置和敏感信息任务6.2配置和使用持久化卷任务6.1配置和使用基本存储任务6.3管理配置信息和敏感信息任务6.1配置和使用基本存储任务说明01OPTION02OPTION03OPTION了解卷的概念和常用的卷类型学会使用Empty卷存储数据学会使用HostPath卷存储数据04OPTION掌握NFS卷的配置和使用方法任务6.1配置和使用基本存储相关知识6.1.1什么是卷卷是Pod的一部分,卷不是单独的对象,不能独立创建,只能在Pod中定义。卷关联到外部的存储设备之上的存储空间,独立于容器自身的文件系统。卷是Pod中所有容器挂载的共享目录,Pod中所有容器都可以访问卷,但必须要挂载,卷可以挂载到容器中的任何目录。卷的生命周期与挂载它的Pod相同,但是卷中的文件可能在卷消失后仍然存在,这取决于具体的卷类型。任务6.1配置和使用基本存储相关知识6.1.2卷的类型EmptyDirHostPathConfigMapPersistentVolumeClaimNFS任务6.1配置和使用基本存储任务实现任务6.1.1使用EmptyDir卷存储数据了解EmptyDir卷EmptyDir挂载后就是一个空目录。EmptyDir卷的生命周期与Pod相同。EmptyDir的主要使用场景用作缓存空间为耗时较长的计算任务提供检查点Pod不同容器之间共享文件任务6.1配置和使用基本存储任务实现任务6.1.1使用EmptyDir卷存储数据测试EmptyDir卷的使用编写定义Pod的配置文件apiVersion:v1kind:Podmetadata:name:emptydir-demospec:containers:-name:busyboximage:busyboxvolumeMounts:#容器挂载卷

-name:pod-volume#要挂载的卷名称

mountPath:/pod-data#挂载到容器的路径

#容器启动命令及参数

command:["/bin/sh"]args:["-c","whiletrue;do/bin/echo$(date+%T)'记录'>>/pod-data/test.txt;sleep60;done;"]volumes:#在Pod级别定义卷

-name:pod-volume#卷名称

emptyDir:{}#emptyDir卷任务6.1配置和使用基本存储任务实现任务6.1.1使用EmptyDir卷存储数据测试EmptyDir卷的使用创建名为emptydir-demo的Pod。进入该Pod的容器的Shell,列出该容器根目录下的子目录。#kubectlexec-itemptydir-demo--/bin/sh/#lsbindevetchomepod-dataprocrootsystmpusrvar/#cat/pod-data/test.txt02:52:26记录02:53:26记录/#exit查看该Pod所在的节点,本例的Pod在node02节点上运行。登录到node02节点主机上,从根目录下查找名称为EmptyDir卷名称的文件,可以发现Kubernetes在节点上自动创建了以EmptyDir卷名称命名的目录。任务6.1配置和使用基本存储任务实现任务6.1.1使用EmptyDir卷存储数据测试EmptyDir卷的使用继续查看EmptyDir卷所在目录的内容,可以发现Pod容器所使用的文件。ls/var/lib/kubelet/pods/33a2a82d-1a1e-45c5-90a2-38f64a88464c/volumes/kubernetes.io~empty-dir/pod-volumetest.txt切回控制平面节点上,执行kubectldeletepodemptydir-demo命令删除上述Pod。转到node02节点上查找pod-volume文件,可以发现已找不到了,这就表明随着Pod的删除,EmptyDir卷也被自动删除了。任务6.1配置和使用基本存储任务实现任务6.1.2使用HostPath卷挂载宿主机文件了解HostPath卷

温馨提示

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

评论

0/150

提交评论