Kubernetes集群實戰 拓展訓練匯 項目1-10_第1頁
Kubernetes集群實戰 拓展訓練匯 項目1-10_第2頁
Kubernetes集群實戰 拓展訓練匯 項目1-10_第3頁
Kubernetes集群實戰 拓展訓練匯 項目1-10_第4頁
Kubernetes集群實戰 拓展訓練匯 項目1-10_第5頁
已閱讀5頁,還剩47頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

任務一拓展訓練kubernetes架構圖如下:各個組件的主要功能如下:APIServer[資源操作入口]提供了資源對象的唯一操作入口,其他所有組件都必須通過它提供的API來操作資源數據,只有APIServer與存儲通信,其他模塊通過APIServer訪問集群狀態。第一,是為了保證集群狀態訪問的安全。第二,是為了隔離集群狀態訪問的方式和后端存儲實現的方式:APIServer是狀態訪問的方式,不會因為后端存儲技術etcd的改變而改變。作為kubernetes系統的入口,封裝了核心對象的增刪改查操作,以RESTFul接口方式提供給外部客戶和內部組件調用。對相關的資源數據“全量查詢”+“變化監聽”,實時完成相關的業務功能。ControllerManager[內部管理控制中心]實現集群故障檢測和恢復的自動化工作,負責執行各種控制器,主要有:endpoint-controller:定期關聯service和pod(關聯信息由endpoint對象維護),保證service到pod的映射總是最新的。replication-controller:定期關聯replicationController和pod,保證replicationController定義的復制數量與實際運行pod的數量總是一致的。Scheduler[集群分發調度器]Scheduler收集和分析當前Kubernetes集群中所有Minion/Node節點的資源(內存、CPU)負載情況,然后依此分發新建的Pod到Kubernetes集群中可用的節點。實時監測Kubernetes集群中未分發和已分發的所有運行的Pod。Scheduler也監測Minion/Node節點信息,由于會頻繁查找Minion/Node節點,Scheduler會緩存一份最新的信息在本地。最后,Scheduler在分發Pod到指定的Minion/Node節點后,會把Pod相關的信息Binding寫回APIServer。kubelet負責Node節點上pod的創建、修改、監控、刪除等全生命周期的管理定時上報本Node的狀態信息給APIServer。kubelet是MasterAPIServer和Node之間的橋梁,接收MasterAPIServer分配給它的commands和work,通過kube-apiserver間接與Etcd集群交互,讀取配置信息。具體的工作如下:設置容器的環境變量、給容器綁定Volume、給容器綁定Port、根據指定的Pod運行一個單一容器、給指定的Pod創建network容器。同步Pod的狀態、同步Pod的狀態、從cAdvisor獲取containerinfo、podinfo、rootinfo、machineinfo。在容器中運行命令、結束容器、刪除Pod的所有容器。任務二拓展訓練安裝教材任務二在筆記本上實現。項目二任務一拓展訓練首先使用的鏡像centos/httpd-24-centos7部署deployment控制器,命令如下:[root@master~]#kubectlcreatedeploymenthttpd--image=centos/httpd-24-centos7查看pod狀態,命令如下:[root@master~]#kubectlgetpod結果如下:[root@master~]#kubectlgetpod-owideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATEShttpd-7bb68fdccc-b6c8l1/1Running05m18s4node1<none><none>查看httpd服務版本信息,命令如下:[root@master~]#curl-I4:8080HTTP/1.1403ForbiddenDate:Sun,05Sep202101:23:21GMTServer:Apache/2.4.34(RedHat)OpenSSL/1.0.2k-fipsLast-Modified:Tue,22Sep202023:04:14GMTETag:"f91-5afeefc541780"Accept-Ranges:bytesContent-Length:3985Content-Type:text/html;charset=UTF-8查看容器的名稱[root@master~]#kubectldescribepodhttpd-7bb68fdccc-b6c8lName:httpd-7bb68fdccc-b6c8lNamespace:defaultPriority:0Node:node1/0StartTime:Sun,05Sep202109:16:36+0800Labels:app=httpdpod-template-hash=7bb68fdcccAnnotations:<none>Status:RunningIP:4IPs:IP:4ControlledBy:ReplicaSet/httpd-7bb68fdcccContainers:httpd-24-centos7:ContainerID:升級服務版本信息,命令如下:[root@master~]#kubectlsetimagedeployments.appshttpdhttpd-24-centos7=httpd查看服務升級版本信息,命令如下:[root@master~]#curl-I5HTTP/1.1200OKDate:Sun,05Sep202101:32:41GMTServer:Apache/2.4.48(Unix)Last-Modified:Mon,11Jun200718:53:14GMTETag:"2d-432a5e4a73a80"Accept-Ranges:bytesContent-Length:45Content-Type:text/html項目二任務二拓展訓練創建deployment,命令如下:[root@master~]#kubectlcreatedeploymenthttpd--image=httpd--replicas=3創建service,命令如下:[root@master~]#kubectlexposedeploymenthttpd--port=80service/httpdexposed[root@master~]#kubectlgetserviceNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEhttpdClusterIP8<none>80/TCP6s修改pod中的主頁內容,命令如下:首先查看pod[root@master~]#kubectlgetpod-owideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATEShttpd-757fb56c8d-72tlv1/1Running03m37s7node1<none><none>httpd-757fb56c8d-bdn6v1/1Running03m37s1node2<none><none>httpd-757fb56c8d-cnlsw1/1Running03m37s6node1<none><none>然后進入pod容器,修改主頁內容以名稱為httpd-757fb56c8d-bdn6v的pod為例[root@master~]#kubectlexec-ithttpd-757fb56c8d-bdn6v/bin/bashroot@httpd-757fb56c8d-bdn6v:/usr/local/apache2#echoweb2>/usr/local/apache2/htdocs/index.html訪問服務[root@master~]#curl8web1[root@master~]#curl8web2[root@master~]#curl8web3任務一拓展訓練編寫httpd.yaml腳本創建deploymentapiVersion:apps/v1kind:Deploymentmetadata:name:de2spec:template:metadata:labels:app:httpspec:containers:-name:httpimage:httpdports:-name:p1containerPort:80selector:matchLabels:app:httpreplicas:3編寫s2.service腳本創建serviceapiVersion:v1kind:Servicemetadata:name:myhttpdspec:selector:app:httpports:-name:http80port:80targetPort:80nodePort:30001type:NodePort集群外部訪問如下:任務二拓展訓練編寫以下腳本創建DaemonSet控制器#定義crontab的版本apiVersion:batch/v1beta1#控制器的類型kind:CronJob#源數據信息metadata:name:job3spec:#定義每分鐘執行一次任務schedule:"*/1****"jobTemplate:spec:template:spec:containers:-name:helloimage:busyboxcommand:["/bin/sh","-c","echo'該休息一下了'"]restartPolicy:OnFailure查看創建pod的運行結果[root@masteryaml]#kubectllogsjob2-1630907460-dmwsd該休息一下了任務一拓展訓練編寫探測腳本apiVersion:v1kind:Podmetadata:name:httpget-podnamespace:defaultspec:containers:-name:httpget-containerimage:nginx:1.8.1imagePullPolicy:IfNotPresentports:-name:httpcontainerPort:80command:["/bin/sh","-c","sleep30;rm-rf/index.html"]livenessProbe:httpGet:port:httppath:/index.htmlinitialDelaySeconds:1periodSeconds:3timeoutSeconds:10運行后查看pod重啟狀態[root@master~]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEhttpget-pod1/1Running14m任務二拓展訓練編寫可讀性探測器腳本apiVersion:apps/v1kind:Deploymentmetadata:name:readiness-deploymentspec:template:metadata:labels:app:nginxspec:containers:-name:nginximage:nginx:1.8.1ports:-name:httpcontainerPort:80command:["/bin/sh","-c","sleep30;rm-rf/index.html"]readinessProbe:httpGet:#這里的http指定是定義容器時ports的name,即探測80端口port:http#使用http方式訪問根目錄下是否存在index.htmlpath:/index.htmlinitialDelaySeconds:1periodSeconds:3selector:matchLabels:app:nginxreplicas:3查看運行結果[root@masteryaml]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEreadiness-deployment-7664485764-jdcc50/1Running154sreadiness-deployment-7664485764-jg9dz0/1Running154sreadiness-deployment-7664485764-sx5lb0/1Running154s通過觀察發現容器一直沒有ready狀態,說明readiness的初始值為false,和liveness探測正好相反。任務一拓展訓練編寫使用nodeSelector調度腳本#定義控制器版本apiVersion:apps/v1#定義資源類型kind:Deployment#定義源數據metadata:name:nodeselector#定義容器模板spec:template:metadata:labels:app:httpdspec:containers:-name:httpdimage:httpdports:-name:httpcontainerPort:80#和containers字段對齊,使用nodeSelector調度到cpu=high的節點nodeSelector:cpu:high#定義匹配的labels標簽是app:httpdselector:matchLabels:app:httpd#定義生成3個Podreplicas:3運行后查看pod重啟狀態[root@masteryaml]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEnodeselector-678b44c686-77tcp0/1Pending03m43snodeselector-678b44c686-94q7k0/1Pending03m43snodeselector-678b44c686-h7cw60/1Pending03m43s結果顯示,如果調度的標記不存在,會一直處于pending錯誤狀態。任務二拓展訓練配置node1和node2不在同一拓撲域kubectllabelnodesnode1disk-type=ssdkubectllabelnodesnode2disk-type=sas配置pod軟親和性調度腳本apiVersion:apps/v1kind:Deploymentmetadata:name:pod-preferlabels:app:podpreferspec:replicas:6selector:matchLabels:app:mypodtemplate:metadata:labels:app:mypodspec:containers:-name:myapp-podimage:nginx:1.8.1imagePullPolicy:IfNotPresentports:-name:httpcontainerPort:80affinity:podAffinity:preferredDuringSchedulingIgnoredDuringExecution:-weight:100podAffinityTerm:labelSelector:#由于是Pod親和性,因此這里匹配規則寫的是Pod的標簽信息matchExpressions:-key:appoperator:Invalues:-http#調度到disk作為label關鍵字的相同拓撲域topologyKey:disk查看調度情況[root@masteryaml]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEpod-prefer-7d6f654cc8-k2d2n1/1Running0101spod-prefer-7d6f654cc8-kqfzx1/1Running0101spod-prefer-7d6f654cc8-msspw1/1Running0101spod-prefer-7d6f654cc8-r797q1/1Running0101spod-prefer-7d6f654cc8-tkm4n1/1Running0101spod-prefer-7d6f654cc8-tmccx1/1Running0101s結果中發現,能夠正常調度和運行。任務三拓展訓練定義污點[root@masteryaml]#kubectltaintnodesnode1db=no:NoSchedule[root@masteryaml]#kubectltaintnodesnode2web=no:PreferNoSchedule編寫控制器腳本apiVersion:apps/v1kind:Deploymentmetadata:name:toleration-specialspec:template:metadata:labels:app:nginxspec:containers:-name:nginximage:nginx:1.8.1ports:-name:p1containerPort:80selector:matchLabels:app:nginxreplicas:6觀察調度情況[root@masteryaml]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEtoleration-special-746bc96976-2f6qd0/1Pending02m2stoleration-special-746bc96976-4bn9p0/1Pending02m2stoleration-special-746bc96976-58qg90/1Pending02m2stoleration-special-746bc96976-644m80/1Pending02m2stoleration-special-746bc96976-7r6x40/1Pending02m2stoleration-special-746bc96976-wnqv80/1Pending02m2s通過觀察發現,配置了兩種effect污點的節點不調度Pod任務一拓展訓練輸出base64編碼[root@master~]#echo"zs"|base64enMK[root@master~]#echo"80"|base64ODAK編寫secret腳本apiVersion:v1kind:Secret#定義類型為secretmetadata:name:mysecrettype:Opaque#定義secret的類型為Opaquedata:name:enMKage:ODAK[root@masteryaml]#kubectlapply-fsecret.yaml編寫使用envFrom導入secret的pod腳本apiVersion:v1kind:Podmetadata:name:test-secret#定義名稱為test-secretspec:containers:-name:webimage:nginx:1.8.1envFrom:#使用envFrom定義環境變量來源-secretRef:#定義來源于secretname:mysecret查看環境變量[root@masteryaml]#kubectlexec-ittest-secret/bin/bashroot@test-secret:/#env|grepnamename=zsroot@test-secret:/#env|grepageage=80任務二拓展訓練創建nfs共享目錄/web//24(rw,no_root_squash)/data/24(rw,no_root_squash)重啟nfs,查看服務[root@masteryaml]#showmount-e0Exportlistfor0:/data/24/web/24編寫創建pv的yaml腳本apiVersion:v1kind:PersistentVolumemetadata:name:pv3spec:capacity:storage:1GiaccessModes:-ReadWriteOncepersistentVolumeReclaimPolicy:Retainnfs:path:/webserver:0---apiVersion:v1kind:PersistentVolumemetadata:name:pv4spec:capacity:storage:3GiaccessModes:-ReadWriteOncepersistentVolumeReclaimPolicy:Retainnfs:path:/dataserver:0編寫創建pvc的yaml腳本apiVersion:v1kind:PersistentVolumeClaimmetadata:name:pvc2spec:accessModes:-ReadWriteOnceresources:requests:storage:2Gi觀察綁定結果[root@masteryaml]#kubectlgetpvcNAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGEpvc2Boundpv43GiRWO3s結果中發現已經和pv4進行了綁定,因為pv4的存儲大小為3G。任務三拓展訓練創建pv和pvc同教材內容,創建mysql控制器腳本如下:在yaml目錄下創建文件pvc-pod.yaml,在文件中輸入以下腳本。apiVersion:apps/v1kind:Deploymentmetadata:name:de3spec:template:metadata:labels:app:mysqlspec:containers:-name:mysqlimage:mysql:5.7env:-name:MYSQL_ROOT_PASSWORDvalue:"1"ports:-containerPort:3306volumeMounts:-name:mysql#使用mysql的存儲卷subPath:mysql#在存儲目錄下創建mysql目錄mountPath:/var/lib/mysql#掛載的容器目錄volumes:#定義掛載存儲卷-name:mysql#名稱為mysqlpersistentVolumeClaim:#使用PVC存儲claimName:pvc1#PVC的名稱為pvc1selector:matchLabels:app:mysql任務一拓展訓練查看pv綁定發現web-0綁定的是pv-web4的pv,web-1綁定的是pv-web1的pv,web-2綁定的是pv-web2。配置主頁文件內容[root@masteryaml]#echoweb0>/data/web4/index.html[root@masteryaml]#echoweb1>/data/web1/index.html[root@masteryaml]#echoweb2>/data/web2/index.html刪除pod,查看訪問內容是否變化刪除web-0[root@masteryaml]#kubectldeletepodweb-0pod"web-0"deleted查看pod[root@masteryaml]#kubectlgetpod-owideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATESweb-01/1Running06snode2<none><none>web-11/1Running031mnode2<none><none>web-21/1Running031mnode1<none><none>訪問pod內容[root@masteryaml]#curlweb0發現沒有變化任務二拓展訓練需要將動態web程序放到一個指定的目錄,然后在創建容器時進行掛載,以dami程序為例的yaml腳本如下:apiVersion:apps/v1kind:Deploymentmetadata:name:de2spec:template:metadata:labels:app:damispec:containers:-name:damiimage:php:v1ports:-name:p1containerPort:80volumeMounts:-name:nfs1mountPath:/var/www/htmlvolumes:-name:nfs1nfs:path:/web/damiserver:0selector:matchLabels:app:dami任務一拓展訓練制作dami:v1鏡像編寫制作dami:v1的Dockerfile腳本如下:#基礎鏡像是centos:7FROMcentos:7#安裝httpdphp支持php與mysql連接php-gd圖形支持組件RUNyuminstallhttpdphpphp-mysqlphp-gd-y#將dami源程序添加到默認網站路徑下ADDdami/var/www/html#將默認網站路徑的權限設置成777,否則用戶不能寫入RUNchmod-R777/var/www/html#持久化網站根目錄VOLUME/var/www/html#暴露服務的80端口EXPOSE80#啟動容器時,將httpd程序運行在前臺CMD["/usr/sbin/httpd","-DFOREGROUND"]通過dami:v1鏡像構建pod和service編寫創建deployment和service的yaml腳本如下:apiVersion:apps/v1kind:Deploymentmetadata:name:damispec:replicas:1template:metadata:labels:app:damispec:containers:-name:damiimage:dami:v1selector:matchLabels:app:dami---#創建名稱為httpd-dami的service,提供給ingress規則使用apiVersion:v1kind:Servicemetadata:name:httpd-damispec:selector:app:damiports:-protocol:TCPport:80targetPort:80創建ingress規則apiVersion:extensions/v1beta1kind:Ingressmetadata:name:ingress-dammispec:rules:-host:http:paths:-path:/backend:serviceName:httpd-damiservicePort:80配置域名解析在C:\Windows\System32\drivers\etc的hosts文件,添加入下內容0使用域名訪問服務任務二拓展訓練編寫創建zm:v1的Dockerfile腳本如下:#基礎鏡像是centos:7FROMcentos:7#安裝httpdphp支持php與mysql連接php-gd圖形支持組件RUNyuminstallhttpdphpphp-mysqlphp-gd-y#將dami源程序添加到默認網站路徑下ADDzm/var/www/html#將默認網站路徑的權限設置成777,否則用戶不能寫入RUNchmod-R777/var/www/html#持久化網站根目錄VOLUME/var/www/html#暴露服務的80端口EXPOSE80#啟動容器時,將httpd程序運行在前臺CMD["/usr/sbin/httpd","-DFOREGROUND"]通過zm:v1鏡像構建pod和service編寫創建deployment和service的yaml腳本如下:apiVersion:apps/v1kind:Deploymentmetadata:name:zmspec:replicas:1template:metadata:labels:app:zmspec:containers:-name:zmimage:zm:v1selector:matchLabels:app:zm---#創建名稱為httpd-zm的service,提供給ingress規則使用apiVersion:v1kind:Servicemetadata:name:httpd-zmspec:selector:app:zmports:-protocol:TCPport:80targetPort:80創建ingress規則apiVersion:extensions/v1beta1kind:Ingressmetadata:name:ingress-dami-zmannotations:nginx.ingress.kubernetes.io/rewrite-target:/spec:rules:-host:http:paths:-path:/backend:serviceName:httpd-damiservicePort:80-host:http:paths:-path:/backend:serviceName:httpd-zmservicePort:80配置域名配置hosts文件,添加入下內容00訪問和任務一拓展訓練編寫創建clusterrole的腳本如下:apiVersion:rbac.authorization.k8s.io/v1#定義創建Role的api版本kind:ClusterRole#定義的資源類型是ClusterRolemetadata:name:clusterrole1#資源的名稱是clusterrolerules:#角色定義的規則-apiGroups:[""]#使用””定義api組為核心組resources:["pods"]#核心組內podsverbs:["get","list","delete"]#定義對核心組內的pods具有的權限以上腳本定義了一個名稱為clusterrole的ClusterRole資源,定義了可以訪問集群的核心api組的pods資源,具有獲取、列表、刪除的功能。任務二拓展訓練刪除clusterrolebinding[root@masteryaml]#kubectldelete-fclusterrolebinding-1.yaml修改clusterrolebinding-1配置如下:apiVersion:rbac.authorization.k8s.io/v1beta1kind:ClusterRoleBindingmetadata:name:crbroleRef:apiGroup:rbac.authorization.k8s.iokind:ClusterRolename:cluster-adminsubjects:-apiGroup:rbac.authorization.k8s.iokind:Username:u1使用clusterrolebinding-1構建綁定[root@masteryaml]#kubectlapply-fclusterrolebinding-1.yaml切換到u1,測試[root@masteryaml]#su-u1發現可以訪問其它集群資源。任務一拓展訓練配置https安全訪問Harbor私有倉庫客服端到服務端或服務端到服務端的請求方式通常是http居多,但是考慮到安全性的問題,可以使用給系統添加一個證書來做認證,這種訪問服務的協議就變成了https協議,使用的是443端口,對網站安全性要求高一點應用都需要使用證書的方式加密訪問,因為倉庫的數據對安全性要求也是比較高的,所以這里配置Harbor倉庫的https訪問。生成私鑰文件證書是由一個受信任的機構頒發的,可以把它理解成有認證機構簽字的公鑰文件,這個證書是公開的,當用戶訪問時,使用這個證書進行加密數據,然后用服務器端的私鑰進行解密數據,公鑰和私鑰匙成對出現的,所以一定要先生成私鑰文件,然后在私鑰的基礎上,頒發證書,即頒發有認證機構蓋章的公鑰文件。可以在大型的證書提供平臺申請證書文件,但一般申請證書是收費的,為了方便教學,這里通過自己在本機簽發證書的方式講解生成私鑰和證書過程。下面通過openssl命令生成一個私鑰文件server.key。[root@node~]#opensslgenrsa-idea-outserver.key2048GeneratingRSAprivatekey,2048bitlongmodulus.............+++.......................+++eis65537(0x10001)Enterpassphraseforserver.key:Verifying-Enterpassphraseforserver.key:genrsa指定加密算法#idea是一種加密方式,out后時輸出的文件名,這里是server.key,2028表示生成的私鑰長度,生成私鑰時需要輸入私鑰的密碼。基于私鑰生成證書文件以下使用opensslreq在基于server.key私鑰的基礎上,生成了自己簽發的證書server.crt。[root@node~]#opensslreq-days36500-x509-sha256-nodes-newkeyrsa:2048-keyoutserver.key-outserver.crtGeneratinga2048bitRSAprivatekey.........+++....+++writingnewprivatekeyto'server.key'-----Youareabouttobeaskedtoenterinformationthatwillbeincorporatedintoyourcertificaterequest.WhatyouareabouttoenteriswhatiscalledaDistinguishedNameoraDN.TherearequiteafewfieldsbutyoucanleavesomeblankForsomefieldstherewillbeadefaultvalue,Ifyouenter'.',thefieldwillbeleftblank.-----CountryName(2lettercode)[XX]:cnStateorProvinceName(fullname)[]:lnLocalityName(eg,city)[DefaultCity]:syOrganizationName(eg,company)[DefaultCompanyLtd]:collegeOrganizationalUnitName(eg,section)[]:comCommonName(

溫馨提示

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

評論

0/150

提交評論