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

提交评论