Kubernetes 集群實戰(zhàn)(微課版)課件 項目5、6 發(fā)布應用程序、管理存儲和配置信息_第1頁
Kubernetes 集群實戰(zhàn)(微課版)課件 項目5、6 發(fā)布應用程序、管理存儲和配置信息_第2頁
Kubernetes 集群實戰(zhàn)(微課版)課件 項目5、6 發(fā)布應用程序、管理存儲和配置信息_第3頁
Kubernetes 集群實戰(zhàn)(微課版)課件 項目5、6 發(fā)布應用程序、管理存儲和配置信息_第4頁
Kubernetes 集群實戰(zhàn)(微課版)課件 項目5、6 發(fā)布應用程序、管理存儲和配置信息_第5頁
已閱讀5頁,還剩122頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Kubernetes集群實戰(zhàn)(微課版)工業(yè)和信息化精品系列教材——云計算技術項目5

發(fā)布應用程序能力CAPACITY要求了解Service的概念和工作機制了解不同類型的Service資源定義方法學會使用Service在集群內、外部發(fā)布應用程序了解Ingress和Ingress控制器,學會使用Ingress對外基于HTTP協(xié)議發(fā)布應用程序了解灰度發(fā)布和藍綠發(fā)布及其應用場景,掌握Kubernetes灰度發(fā)布的實現(xiàn)方法任務5.2使用Ingress發(fā)布應用程序任務5.1使用Service發(fā)布應用程序任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務5.1使用Service發(fā)布應用程序任務說明01OPTION02OPTION03OPTION了解Service的概念理解Service的工作機制了解Service的負載均衡機制和服務發(fā)現(xiàn)機制04OPTION了解Service的類型及其配置05OPTION了解Service的類型及其配置06OPTION了解Service的類型及其配置任務5.1使用Service發(fā)布應用程序相關知識5.1.1什么是ServiceService是將運行在一組Pod上的應用程序發(fā)布為網絡服務的抽象方法。主要功能:服務發(fā)現(xiàn)和負載均衡任務5.1使用Service發(fā)布應用程序相關知識5.1.2通過Endpoints理解Service的工作機制什么是EndpointsEndpoints是一種Kubernetes資源,用來記錄一個Service對應的所有Pod的訪問地址。Endpoints實際上是Service后端的可訪問Pod端點集合,其中的Pod必須處于運行狀態(tài)。任務5.1使用Service發(fā)布應用程序相關知識5.1.2通過Endpoints理解Service的工作機制創(chuàng)建Service以驗證Endpoints編輯定義Deployment對象的配置文件。apiVersion:apps/v1#版本號kind:Deployment#類型為Deploymentmetadata:#元數(shù)據(jù)

name:nginx-deploylabels:#標簽

app:nginx-deployspec:#詳細信息

replicas:2#副本數(shù)量

selector:#選擇器,指定該控制器管理哪些PodmatchLabels:#匹配規(guī)則

app:nginx-pod

任務5.1使用Service發(fā)布應用程序相關知識5.1.2通過Endpoints理解Service的工作機制創(chuàng)建Service以驗證Endpoints編輯定義Deployment對象的配置文件。template:#定義模板,當副本數(shù)量不足時會根據(jù)模板定義創(chuàng)建Pod副本

metadata:labels:app:nginx-pod#Pod的標簽

spec:containers:#容器列表(本例僅定義一個容器)

-name:nginx#容器的名稱

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

ports:-name:nginx-portcontainerPort:80#容器需要暴露的端口基于該配置文件創(chuàng)建Deployment對象。任務5.1使用Service發(fā)布應用程序相關知識5.1.2通過Endpoints理解Service的工作機制創(chuàng)建Service以驗證Endpoints創(chuàng)建定義Service對象的配置文件。apiVersion:v1kind:Servicemetadata:name:nginx-svc#為Service對象命名spec:selector:app:nginx-pod#指定Pod的標簽

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

targetPort:80#目標Pod的端口(容器端口)基于該配置文件創(chuàng)建Service對象。任務5.1使用Service發(fā)布應用程序相關知識5.1.2通過Endpoints理解Service的工作機制創(chuàng)建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發(fā)布應用程序相關知識5.1.3Service的負載均衡機制kube-proxy的代理模式iptables代理模式任務5.1使用Service發(fā)布應用程序相關知識5.1.3Service的負載均衡機制kube-proxy的代理模式IPVS代理模式任務5.1使用Service發(fā)布應用程序相關知識5.1.3Service的負載均衡機制負載均衡策略輪詢(round-robin,rr)最少連接(leastconnection,lc)目標哈希(destinationhashing,dh)源哈希(sourcehashing,sh)預計延遲時間最短(shortestexpecteddelay)從不排隊(neverqueue,nq)會話保持首次將某個客戶端來源的IP發(fā)起的請求轉發(fā)到后端的某個Pod,之后來自該IP的請求都將轉發(fā)到該Pod。任務5.1使用Service發(fā)布應用程序相關知識5.1.5定義Service資源apiVersion:v1#API版本kind:Service#資源類型metadata:#元數(shù)據(jù)

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#協(xié)議

port:int#監(jiān)聽的端口

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

nodePort:int#映射到主機的端口任務5.1使用Service發(fā)布應用程序相關知識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#節(jié)點端口任務5.1使用Service發(fā)布應用程序相關知識5.1.6Service類型LoadBalancer類型spec:type:LoadBalancer#Service類型

clusterIP:string#虛擬IPports:-port:int#Service端口

targetPort:int#目標Pod端口(容器端口)status:loadBalancer:#外部負載均衡器,用于公共環(huán)境

ingress:-ip:string#外部負載均衡器的IP地址

hostname:string#外部負載均衡器的主機名ExternalName類型type:ExternalName#Service類型

externalName:string#外部服務域名任務5.1使用Service發(fā)布應用程序相關知識5.1.7無頭Service無頭(Headless)Service一種沒有ClusterIP的特殊Service。不需要負載均衡以及單獨的ClusterIP時,可以通過指定.spec.clusterIP字段的值為None來創(chuàng)建無頭Service。無頭Service不分配ClusterIP。DNS如何查找域名取決于Service是否定義了標簽選擇器。對于未定義標簽選擇器的無頭Service,Kubernetes不會創(chuàng)建Endpoint對象,具體由DNS系統(tǒng)查找和配置。任務5.1使用Service發(fā)布應用程序相關知識5.1.8多端口Serviceports:-name:httpprotocol:TCPport:80targetPort:9376-name:httpsprotocol:TCPport:443targetPort:9377任務5.1使用Service發(fā)布應用程序任務實現(xiàn)任務5.1.1 驗證Kubernetes的服務發(fā)現(xiàn)機制驗證基于環(huán)境變量的服務發(fā)現(xiàn)機制#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發(fā)布應用程序任務實現(xiàn)任務5.1.1 驗證Kubernetes的服務發(fā)現(xiàn)機制驗證基于DNS的服務發(fā)現(xiàn)機制#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發(fā)布應用程序任務實現(xiàn)任務5.1.2使用Service對外發(fā)布集群中的應用程序(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發(fā)布應用程序任務實現(xiàn)任務5.1.2使用Service對外發(fā)布集群中的應用程序(2)修改Service對象配置文件。spec:type:NodePort#Service類型

selector:app:nginx-pod#指定Pod的標簽

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

targetPort:80#目標Pod的端口

nodePort:30008#節(jié)點上綁定的端口(3)基于新的Service對象配置文件創(chuàng)建Service來發(fā)布Nginx服務。#kubectlapply-f/k8sapp/05/nginx-nodeport-service.yamlservice/nginx-svccreated任務5.1使用Service發(fā)布應用程序任務實現(xiàn)任務5.1.2使用Service對外發(fā)布集群中的應用程序(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)獲取其中節(jié)點的IP地址。(6)確保節(jié)點主機相關的防火墻規(guī)則開放NodePort表示的端口。任務5.1使用Service發(fā)布應用程序任務實現(xiàn)任務5.1.2使用Service對外發(fā)布集群中的應用程序使用節(jié)點地址和節(jié)點端口來訪問發(fā)布的服務。[root@master01~]#curl2:30008......<h1>Welcometonginx!</h1>......任務5.1使用Service發(fā)布應用程序任務實現(xiàn)任務5.1.3使用Service發(fā)布前后端應用程序前端Nginx連接后端Tomcat任務5.1使用Service發(fā)布應用程序任務實現(xiàn)任務5.1.3使用Service發(fā)布前后端應用程序創(chuàng)建并發(fā)布后端應用程序使用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發(fā)布應用程序任務實現(xiàn)任務5.1.3使用Service發(fā)布前后端應用程序創(chuàng)建并發(fā)布后端應用程序使用Service發(fā)布該應用程序apiVersion:v1kind:Servicemetadata:name:webappspec:selector:#組合多標簽選擇器選擇目標Podapp:webapptier:backendports:-protocol:TCPport:80targetPort:8080任務5.1使用Service發(fā)布應用程序任務實現(xiàn)任務5.1.3使用Service發(fā)布前后端應用程序創(chuàng)建并發(fā)布前端應用程序創(chuàng)建ConfigMap對象將Nginx服務的上游服務器配置為后端應用程序。apiVersion:v1kind:Servicemetadata:name:webappspec:selector:#組合多標簽選擇器選擇目標Podapp:webapptier:backendports:-protocol:TCPport:80targetPort:8080任務5.1使用Service發(fā)布應用程序任務實現(xiàn)任務5.1.3使用Service發(fā)布前后端應用程序創(chuàng)建并發(fā)布前端應用程序創(chuàng)建Deployment對象apiVersion:apps/v1kind:Deploymentmetadata:name:frontendspec:selector:matchLabels:app:webapptier:frontendreplicas:1#前端只提供一個副本

template:metadata:labels:app:webapptier:frontend任務5.1使用Service發(fā)布應用程序任務實現(xiàn)任務5.1.3使用Service發(fā)布前后端應用程序創(chuàng)建并發(fā)布前端應用程序創(chuàng)建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發(fā)布應用程序任務實現(xiàn)任務5.1.3使用Service發(fā)布前后端應用程序創(chuàng)建并發(fā)布前端應用程序創(chuàng)建Service對象apiVersion:v1kind:Servicemetadata:name:frontendspec:type:NodePort#Service類型為NodePortselector:app:webapptier:frontendports:-protocol:TCPport:80targetPort:80nodePort:30080#節(jié)點上綁定的端口任務5.1使用Service發(fā)布應用程序任務實現(xiàn)任務5.1.3使用Service發(fā)布前后端應用程序通過前端發(fā)送流量進行測試#curl1:30080......<title>ApacheTomcat/8.0.35</title>任務5.2使用Ingress發(fā)布應用程序任務5.1使用Service發(fā)布應用程序任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務5.2使用Ingress發(fā)布應用程序任務說明01OPTION02OPTION03OPTION了解Ingress的概念和定義方法了解Ingress控制器的概念和功能掌握在Kubernetes集群中部署NginxIngress控制器的方法04OPTION學會使用CronJob控制器運行定時任務任務5.2使用Ingress發(fā)布應用程序相關知識5.2.1什么是IngressIngress是對集群中Service的外部訪問進行管理的資源。Ingress相當于一個第7層的負載均衡器。任務5.2使用Ingress發(fā)布應用程序相關知識5.2.2定義IngressapiVersion:networking.k8s.io/v1#API版本kind:Ingress#資源類型metadata:#元數(shù)據(jù)

name:string#名稱,要求合規(guī)的DNS子域名名稱

labels:#標簽

-name:stringannotations:#注解

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

rules:#路由規(guī)則

-host:string#域名

http:#HTTP協(xié)議

paths:#路徑定義

-path:string#具體路徑

pathType:string#路徑類型

backend:#資源后端

service:name:string#Service名稱

port:number:int#Service綁定的端口任務5.2使用Ingress發(fā)布應用程序相關知識5.2.3什么是Ingress控制器Ingress控制器是具體實現(xiàn)反向代理和負載均衡的程序。Kubernetes項目目前支持和維護的Ingress控制器AWSGCENginxIngressIngress控制器需要自行部署。NginxIngress是比較常用的控制器。任務5.2使用Ingress發(fā)布應用程序任務實現(xiàn)任務5.2.1部署NginxIngress控制器了解NginxIngress控制器的部署方式使用Deployment和LoadBalancer類型的Service使用Deployment和NodePort類型的Service使用DaemonSet和HostNetwork任務5.2使用Ingress發(fā)布應用程序任務實現(xiàn)任務5.2.1部署NginxIngress控制器安裝NginxIngress控制器(1)將該控制器部署到指定節(jié)點,為該節(jié)點(本例為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發(fā)布應用程序任務實現(xiàn)任務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"#選擇部署的節(jié)點改為此設置

hostNetwork:true#此項設置是增加的,表示啟用主機網絡任務5.2使用Ingress發(fā)布應用程序任務實現(xiàn)任務5.2.1部署NginxIngress控制器安裝NginxIngress控制器創(chuàng)建NginxIngress控制器。#kubectlcreate-f/k8sapp/05/ingress-nginx-controller.yamlnamespace/ingress-nginxcreatedserviceaccount/ingress-nginxcreated......working.k8s.io/nginxcreatedvalidatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admissioncreated在集群內部訪問該控制器發(fā)布的服務進行測試。#curl2......<center><h1>404NotFound</h1></center><hr><center>nginx</center></body></html>任務5.2使用Ingress發(fā)布應用程序任務實現(xiàn)任務5.2.1部署NginxIngress控制器本地實際測試(1)創(chuàng)建一個運行簡單Web服務器的Deployment和相應的Service對象。#kubectlcreatedeploymentdemo--image=httpd--port=80deployment.apps/democreated#kubectlexposedeploymentdemoservice/demoexposed(2)創(chuàng)建Ingress對象。#kubectlcreateingressdemo-localhost--class=nginx--rule="demo.localdev.me/*=demo:80"working.k8s.io/demo-localhostcreated(3)將一個本地端口轉發(fā)到Ingress控制器。#kubectlport-forward--namespace=ingress-nginxservice/ingress-nginx-controller8080:80Forwardingfrom:8080->80Forwardingfrom[::1]:8080->80Handlingconnectionfor8080任務5.2使用Ingress發(fā)布應用程序任務實現(xiàn)任務5.2.1部署NginxIngress控制器本地實際測試(4)在控制平面節(jié)點上使用瀏覽器訪問網址http://demo.localdev.me:8080進行測試任務5.2使用Ingress發(fā)布應用程序任務實現(xiàn)任務5.2.2使用Ingress對外發(fā)布應用程序使用Deployment和Service部署和發(fā)布應用程序(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發(fā)布應用程序任務實現(xiàn)任務5.2.2使用Ingress對外發(fā)布應用程序使用Deployment和Service部署和發(fā)布應用程序(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)創(chuàng)建Deployment和Service對象。(4)查看Service列表,兩個Service的類型都是默認的ClusterIP,只能在集群內部訪問。任務5.2使用Ingress發(fā)布應用程序任務實現(xiàn)任務5.2.2使用Ingress對外發(fā)布應用程序使用Ingress對外發(fā)布上述Service(1)編寫定義Ingress資源的配置文件。spec:ingressClassName:nginx#指定Ingress類

rules:-host:#訪問入口域名

http:paths:-path:/pathType:Prefixbackend:service:name:nginx-svc#指定后端Serviceport:number:80任務5.2使用Ingress發(fā)布應用程序任務實現(xiàn)任務5.2.2使用Ingress對外發(fā)布應用程序使用Ingress對外發(fā)布上述Service(1)編寫定義Ingress資源的配置文件。-host:#訪問入口域名

http:paths:-path:/pathType:Prefixbackend:service:name:tomcat-svc#指定后端Serviceport:number:8080任務5.2使用Ingress發(fā)布應用程序任務實現(xiàn)任務5.2.2使用Ingress對外發(fā)布應用程序使用Ingress對外發(fā)布上述Service創(chuàng)建Ingress對象。#kubectlcreate-f/k8sapp/05/http-ingress.yamlworking.k8s.io/http-ingresscreated查看所創(chuàng)建的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發(fā)布應用程序任務實現(xiàn)任務5.2.2使用Ingress對外發(fā)布應用程序訪問Ingress發(fā)布的應用程序訪問任務5.2使用Ingress發(fā)布應用程序任務實現(xiàn)任務5.2.2使用Ingress對外發(fā)布應用程序訪問Ingress發(fā)布的應用程序訪問任務5.2使用Ingress發(fā)布應用程序任務5.1使用Service發(fā)布應用程序任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務說明01OPTION02OPTION03OPTION了解灰度發(fā)布和藍綠發(fā)布了解灰度發(fā)布和藍綠發(fā)布的Kubernetes解決方案學會使用NginxIngress控制器實現(xiàn)灰度發(fā)布04OPTION學會使用NginxIngress控制器實現(xiàn)藍綠發(fā)布任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布相關知識5.3.1什么是灰度發(fā)布灰度發(fā)布又稱金絲雀(Canary)發(fā)布。當版本升級時,在一個集群中同時發(fā)布舊的穩(wěn)定版本和新的金絲雀(測試)版本,讓部分用戶使用金絲雀版本,其他用戶繼續(xù)使用穩(wěn)定版本,待金絲雀版本測試完成后,將金絲雀版本升級為新的穩(wěn)定版本,并下線舊的穩(wěn)定版本。任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布相關知識5.3.2什么是藍綠發(fā)布藍綠發(fā)布提供零宕機的發(fā)布方式,目的是減少發(fā)布過程中服務停止的時間。在保留舊版本(所謂綠色版本)的同時部署新版本(所謂藍色版本),將兩個版本同時在線,不經過灰度發(fā)布和滾動升級,一次性將流量從舊版本直接切換到新版本。藍綠發(fā)布的新版本和舊版本同時存在,實際運行的只能為其中之一,非藍即綠,一般通過開關控制,可以在兩個版本之間快速切換任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布相關知識5.3.3Kubernetes的灰度發(fā)布和藍綠發(fā)布解決方案解決方案適用場景說明Service發(fā)布需求簡單,簡單測試只需利用Kubernetes的原生功能,無需其他插件或復雜用法,不過自動化程度差NginxIngress不限配置NginxIngress所支持的Annotation(注解)來實現(xiàn)灰度發(fā)布或藍綠發(fā)布;支持基于Header、Cookie和服務權重等流量分配策略;要求Kubernetes集群安裝NginxIngress控制器,并且能夠承受一定的資源消耗ASM生產環(huán)境無須修改應用程序的代碼;支持界面可視化;更多的發(fā)布策略;需要為Kubernetes集群啟用Istio(為微服務架構提供流量管理機制)連接,管理和保護微服務的開放平臺,占用額外資源任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布相關知識5.3.4NginxIngress的灰度發(fā)布和藍綠發(fā)布方法基于請求頭的流量切分策略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優(yōu)先級從高到低任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.1使用NginxIngress實現(xiàn)灰度發(fā)布部署兩個版本的應用程序(1)定義舊版本的Deployment和Service。#定義ConfigMap,使用ConfigMap更改Nginx首頁文件apiVersion:v1kind:ConfigMap#類型為ConfigMapmetadata:name:nginx-index-html-configmap1#ConfigMap名稱data:#定制index.html文件的內容

index.html:|ThisisV1---任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.1使用NginxIngress實現(xiàn)灰度發(fā)布部署兩個版本的應用程序(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實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.1使用NginxIngress實現(xiàn)灰度發(fā)布部署兩個版本的應用程序(1)定義舊版本的Deployment和Service。#定義ServiceapiVersion:v1kind:Servicemetadata:name:nginx-v1spec:selector:app:nginx-v1ports:-targetPort:80port:8080type:NodePort任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.1使用NginxIngress實現(xiàn)灰度發(fā)布部署兩個版本的應用程序(2)定義新版本的Deployment和Service。metadata:name:nginx-index-html-configmap2#ConfigMap名稱data:index.html:|ThisisV2#index.html文件的內容(3)創(chuàng)建Deployment和Service對象,同時還會創(chuàng)建相應的ConfigMap對象。(4)查看Service列表,發(fā)現(xiàn)兩個新創(chuàng)建的兩個版本的Service都能正常運行。(5)測試兩個版本的Nginx服務的訪問,結果都是正常的。任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.1使用NginxIngress實現(xiàn)灰度發(fā)布創(chuàng)建穩(wěn)定版本IngressapiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:stable-ingress#Ingress名稱

annotations:kubernetes.io/ingress.class:nginx#通過注解指定Ingress類spec:rules:-host:#對外發(fā)布服務的域名

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

port:number:80任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.1使用NginxIngress實現(xiàn)灰度發(fā)布創(chuàng)建金絲雀版本Ingress實現(xiàn)灰度發(fā)布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%的流量轉發(fā)到CanaryIngressnginx.ingress.kubernetes.io/canary-weight:"20"spec:rules:-host:#對外發(fā)布服務的域名

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

port:number:80任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.1使用NginxIngress實現(xiàn)灰度發(fā)布創(chuàng)建金絲雀版本Ingress實現(xiàn)灰度發(fā)布創(chuàng)建名為canary-ingress的Ingress對象。查看Ingress列表,發(fā)現(xiàn)新創(chuàng)建了名稱為canary-ingress的Ingress對象。kubectlgetingNAMECLASSHOSTSADDRESSPORTSAGEcanary-ingress<none>52802m37sstable-ingress<none>5280134m使用Ingress發(fā)布的Nginx服務來測試灰度發(fā)布。#foriin{1..10};docurl;done;ThisisV1ThisisV1ThisisV1ThisisV1ThisisV1ThisisV1ThisisV1ThisisV1ThisisV2ThisisV2任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.1使用NginxIngress實現(xiàn)灰度發(fā)布將所有流量從舊版本遷移至新版本(1)修改穩(wěn)定版本的Ingress配置,將stable-ingress.yaml文件中的后端服務指向新版本nginx-v2:

backend:service:name:nginx-v2#將后端服務指向新版本(2)應用stable-ingress.yaml配置文件以使配置更改生效。(3)訪問Nginx服務進行測試,可以發(fā)現(xiàn)所有流量都遷移到新版本。#foriin{1..10};docurl;done;ThisisV2ThisisV2......ThisisV2ThisisV2任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.1使用NginxIngress實現(xiàn)灰度發(fā)布將所有流量從舊版本遷移至新版本(4)刪除用于灰度發(fā)布的金絲雀版本Ingress對象。(5)刪除舊版本的Deployment和Service對象,使相應的Nginx服務下線。(6)查看Service列表,發(fā)現(xiàn)目前僅有新版本的Service在線運行,完成版本的升級。#kubectlgetsvcNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEnginx-v2NodePort8<none>8080:31005/TCP14h(7)刪除穩(wěn)定版本的Ingress對象,以及新版本的Deployment和Service對象,清理實驗環(huán)境。任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.2使用NginxIngress實現(xiàn)藍綠發(fā)布(1)沿用灰度發(fā)布實驗部署的兩個版本Nginx服務,創(chuàng)建相應的Deployment和Service對象。(2)將灰度發(fā)布實驗穩(wěn)定版本Ingress作為綠色版本Ingress,基于該配置文件創(chuàng)建綠色版本的Ingress對象。(3)訪問使用Ingress發(fā)布的Nginx服務進行測試,發(fā)現(xiàn)所有流量都分配到綠色版本(舊版本)。#foriin{1..10};docurl;done;ThisisV1......ThisisV1(4)將灰度發(fā)布實驗金絲雀版本Ingress作為藍色版本Ingress?;谠撆渲梦募?chuàng)建藍色版本的Ingress對象。nginx.ingress.kubernetes.io/canary-weight:"100"任務5.3實現(xiàn)灰度發(fā)布與藍綠發(fā)布任務實現(xiàn)任務5.3.2使用NginxIngress實現(xiàn)藍綠發(fā)布(5)訪問使用Ingress發(fā)布的Nginx服務進行測試,發(fā)現(xiàn)所有流量都分配到藍色版本(新版本)。#foriin{1..10};docurl;done;ThisisV2......ThisisV2(6)藍色版本運行過程中如果出現(xiàn)問題,修改blue-ingress.yaml文件,將流量權重的值改為0,所有流量都切回到綠色版本(舊版本)。(7)修正新版本問題之后,再次更新應用程序部署,完成后再修改blue-ingress.yaml文件,將流量權重值重新設置為100,更新Ingress對象,以便將流量全部導向藍色版本。(8)新版本一直正常運行并且符合預期,則可以結束藍綠發(fā)布,將新版本應用程序重新以綠色版本發(fā)布,撤銷藍色版本,并下線舊版本應用程序。(9)刪除所有Ingress對象、Deployment和Service對象,刪除NginxIngress控制器。THANKSKubernetes集群實戰(zhàn)(微課版)工業(yè)和信息化精品系列教材——云計算技術項目6

管理存儲和配置信息能力CAPACITY要求了解Kubernetes卷的概念和類型,學會使用卷實現(xiàn)基本存儲理解PV和PVC的概念并掌握其基本用法學會組合使用PV和PVC實現(xiàn)持久化卷的管理理解StorageClass的概念,掌握使用StorageClass實現(xiàn)動態(tài)卷制備的方法學會使用ConfigMap和Secret為容器提供配置和敏感信息任務6.2配置和使用持久化卷任務6.1配置和使用基本存儲任務6.3管理配置信息和敏感信息任務6.1配置和使用基本存儲任務說明01OPTION02OPTION03OPTION了解卷的概念和常用的卷類型學會使用Empty卷存儲數(shù)據(jù)學會使用HostPath卷存儲數(shù)據(jù)04OPTION掌握NFS卷的配置和使用方法任務6.1配置和使用基本存儲相關知識6.1.1什么是卷卷是Pod的一部分,卷不是單獨的對象,不能獨立創(chuàng)建,只能在Pod中定義。卷關聯(lián)到外部的存儲設備之上的存儲空間,獨立于容器自身的文件系統(tǒng)。卷是Pod中所有容器掛載的共享目錄,Pod中所有容器都可以訪問卷,但必須要掛載,卷可以掛載到容器中的任何目錄。卷的生命周期與掛載它的Pod相同,但是卷中的文件可能在卷消失后仍然存在,這取決于具體的卷類型。任務6.1配置和使用基本存儲相關知識6.1.2卷的類型EmptyDirHostPathConfigMapPersistentVolumeClaimNFS任務6.1配置和使用基本存儲任務實現(xiàn)任務6.1.1使用EmptyDir卷存儲數(shù)據(jù)了解EmptyDir卷EmptyDir掛載后就是一個空目錄。EmptyDir卷的生命周期與Pod相同。EmptyDir的主要使用場景用作緩存空間為耗時較長的計算任務提供檢查點Pod不同容器之間共享文件任務6.1配置和使用基本存儲任務實現(xiàn)任務6.1.1使用EmptyDir卷存儲數(shù)據(jù)測試EmptyDir卷的使用編寫定義Pod的配置文件apiVersion:v1kind:Podmetadata:name:emptydir-demospec:containers:-name:busyboximage:busyboxvolumeMounts:#容器掛載卷

-name:pod-volume#要掛載的卷名稱

mountPath:/pod-data#掛載到容器的路徑

#容器啟動命令及參數(shù)

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配置和使用基本存儲任務實現(xiàn)任務6.1.1使用EmptyDir卷存儲數(shù)據(jù)測試EmptyDir卷的使用創(chuàng)建名為emptydir-demo的Pod。進入該Pod的容器的Shell,列出該容器根目錄下的子目錄。#kubectlexec-itemptydir-demo--/bin/sh/#lsbindevetchomepod-dataprocrootsystmpusrvar/#cat/pod-data/test.txt02:52:26記錄02:53:26記錄/#exit查看該Pod所在的節(jié)點,本例的Pod在node02節(jié)點上運行。登錄到node02節(jié)點主機上,從根目錄下查找名稱為EmptyDir卷名稱的文件,可以發(fā)現(xiàn)Kubernetes在節(jié)點上自動創(chuàng)建了以EmptyDir卷名稱命名的目錄。任務6.1配置和使用基本存儲任務實現(xiàn)任務6.1.1使用EmptyDir卷存儲數(shù)據(jù)測試EmptyDir卷的使用繼續(xù)查看EmptyDir卷所在目錄的內容,可以發(fā)現(xiàn)Pod容器所使用的文件。ls/var/lib/kubelet/pods/33a2a82d-1a1e-45c5-90a2-38f64a88464c/volumes/kubernetes.io~empty-dir/pod-volumetest.txt切回控制平面節(jié)點上,執(zhí)行kubectldeletepodemptydir-demo命令刪除上述Pod。轉到node02節(jié)點上查找pod-volume文件,可以發(fā)現(xiàn)已找不到了,這就表明隨著Pod的刪除,EmptyDir卷也被自動刪除了。任務6.1配置和使用基本存儲任務實現(xiàn)任務6.1.2使用HostPath卷掛載宿主機文件了解HostPath卷

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論