云计算容器编排技术 课件 单元8 Kubernetes项目案例_第1页
云计算容器编排技术 课件 单元8 Kubernetes项目案例_第2页
云计算容器编排技术 课件 单元8 Kubernetes项目案例_第3页
云计算容器编排技术 课件 单元8 Kubernetes项目案例_第4页
云计算容器编排技术 课件 单元8 Kubernetes项目案例_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

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

文档简介

Kubernetes四层负载均衡Service目录Service资源清单01任务Service概述02任务学习目标【知识目标】了解Service的概念和原理;了解Service的类型和用法。1Service概述1Service概述Kubernetes中Service是将运行在一个或一组

Pod

上的网络应用程序公开为网络服务的方法。设计目标:无需修改现有应用程序就能使用不熟悉的服务发现机制。1Service概述PodIP经常变化,Service是Pod的代理,客户端只需要访问Service,就会把请求代理到PodPodIP在集群之外无法访问,需要创建Service访问为什么要有Service1Service概述Service的名称解析依赖于DNS附件不同Kubernetes版本的DNS默认使用的不一样,1.11之前的版本使用的是kubeDNS,较新的版本使用的是coreDNSDNS组件1Service概述kube-proxy组件通过请求方法watch实现监视apiserver中有关service资源的变动信息负载均衡规则可能是iptables,也可能是ipvs,取决于service的实现方式kube-proxy组件1Service概述创建Service时,根据标签选择器(lableselector)查找Pod并创建与Service同名的Endpoint对象Pod地址发生变化,Endpoint也会随之变化负载均衡kube-proxy决定转发到哪个节点的PodService工作原理1Service概述1、NodeNetwork(节点网络):物理节点或者虚拟节点的网络,如ens33接口上的网路地址。[root@master~]#ipa集群中的三类IP地址1Service概述2、Podnetwork(pod网络),创建的Pod具有的IP地址[root@master~]#kubectlgetpods-owide集群中的三类IP地址1Service概述3、ClusterNetwork(集群地址,也称为servicenetwork),这个地址是虚拟的地址(virtualip),没有配置在某个接口上,只是出现在service的规则当中。[root@master~]#kubectlgetsvc集群中的三类IP地址2Service资源清单2Service资源清单定义Service资源需要的字段有哪些?[root@master~]#kubectlexplainserviceFIELDS:apiVersion

<string>#service资源使用的api组kind

<string>

#创建的资源类型metadata

<Object>#定义元数据spec

<Object>

#定义service的具体描述信息status

<Object>#最近观察到的服务状态,由系统填充service字段2Service资源清单定义Service.spec.type需要的字段有哪些?[root@master~]#kubectlexplainservice.spec.typeService的四种类型2Service资源清单1、ExternalName:适用于k8s集群内部容器访问外部资源,它没有selector,也没有定义任何的端口和Endpoint。Service定义将es名称空间中的my-service服务映射。Service的四种类型kind:ServiceapiVersion:v1metadata:name:my-servicenamespace:esspec:type:ExternalNameexternalName:2Service资源清单2、ClusterIP:通过k8s集群内部IP暴露服务,选择该值,服务只能够在集群内部访问,这也是默认的ServiceType。

3、NodePort:通过每个节点上的IP和静态端口(NodePort)暴露服务。NodePort服务会路由到自动创建的ClusterIP服务。通过请求

<节点IP>:<节点端口>,你可以从集群的外部访问一个

NodePort

服务。Service的四种类型2Service资源清单4、LoadBalancer:使用云提供商的负载均衡器,可以向外部暴露服务。外部的负载均衡器可以路由到NodePort服务和ClusterIP

服务。某些云提供商允许设置

loadBalancerIP。在这些情况下,将根据用户设置的

loadBalancerIP

来创建负载均衡器。如果没有设置

loadBalancerIP

字段,将会给负载均衡器指派一个临时IP。如果设置了

loadBalancerIP,但云提供商并不支持这种特性,那么设置的

loadBalancerIP

值将会被忽略掉。Service的四种类型2Service资源清单service的spec.ports字段如何定义?[root@master~]#kubectlexplainservice.spec.portsService的端口2Service资源清单appProtocol<string>name<string>#定义端口的名字nodePort<integer>#在宿主机映射的端口,默认在30000-32767之间port<integer>#service端口,集群内部服务可访问的端口protocol<string>#端口IP协议,默认TCPtargetPort<string>#targetPort是pod上的端口Service的端口ThankYOU!Kubernetes创建Service1目录01任务创建ClusterIP类型的Service学习目标【知识目标】掌握Service的类型和用法。【技能目标】能够编写Yaml文件创建ClusterIPService;能够根据不同服务需求,创建Service实现对接。1创建ClusterIP类型的Service1创建ClusterIP类型的Service定义Deployment资源文件创建Pod[root@master~]#catnginx-deploy.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:my-nginxnamespace:defaultspec:replicas:2selector:matchLabels:run:my-nginx定义Deployment资源文件strategy:type:RollingUpdaterollingUpdate:maxSurge:1maxUnavailable:0template:metadata:labels:run:my-nginxspec:containers:-name:my-nginximage:nginxports:-containerPort:80#pod中的容器需要暴露的端口1创建ClusterIP类型的Service部署应用更新资源清单文件:[root@master~]#kubectlapply-fnginx-deploy.yaml查看刚才创建的Podip地址:[root@master~]#kubectlgetpods-owide1创建ClusterIP类型的Service访问应用请求podip地址,查看结果:[root@master~]#curl

[root@master~]#curl1创建ClusterIP类型的Service访问应用进入其中一个pod访问nginx[root@master~]#kubectlexec-itmy-nginx-5b56ccd65f-6gnlb/bin/bash1创建ClusterIP类型的Service模拟错误误删除其中一个Pod:新生成PodIP变化[root@master]#kubectlgetpods-owide1创建ClusterIP类型的Service编写Service资源清单文件yaml文件创建一个Service[root@master]#catnginx-svc.yamlapiVersion:v1kind:Servicemetadata:name:my-nginxlabels:run:my-nginxspec:type:ClusterIPports:-port:80#service的端口,暴露给k8s集群内部服务访问protocol:TCPtargetPort:80#pod容器中定义的端口selector:run:my-nginx#选择拥有run=my-nginx标签的pod1创建ClusterIP类型的Service创建Service创建并查看service[root@master]#kubectlapply-fservice_test.yamlservice/my-nginxcreated[root@master~]#kubectlgetsvc-lrun=my-nginx1创建ClusterIP类型的Service通过Service访问应用访问service的ip:端口,请求代理到后端pod[root@master~]#curl31创建ClusterIP类型的Serviceendpoint与selector协同查看service详细信息,如右图[root@master~]#kubectldescribesvcmy-nginx查看endpoint信息,如下如[root@master~]#kubectlgetepmy-nginx1创建ClusterIP类型的ServiceclusterIP字段由于clusterIP是随机分配的,一旦svc被误删,再次重新生成是clusterIP会发生变化,例如:1创建ClusterIP类型的ServiceclusterIP字段如果不希望clusterIP由K8S随机分发,可以在nginx-svc.yaml文件中写入clusterIP字段,手动确定IP地址。1创建ClusterIP类型的ServiceDNS解析服务资源记录格式:SVC_NAME.NS_NAME.DOMAIN.LTD.服务名.命名空间.域名后缀集群默认的域名后缀是svc.cluster.local如上面创建的my-nginx服务,完整名称解析是my-nginx.default.svc.cluster.localThankYOU!Kubernetes创建Service2目录创建ExternalName类型的Service01任务创建NodePort类型的Service02任务映射外部服务案例任务03学习目标【知识目标】掌握Service的类型和用法。【技能目标】能够编写Yaml文件创建NodePortService;能够编写Yaml文件创建ExternalName

Service;能够根据不同服务需求,创建Service实现对接。1创建NodePort类型的Service1创建NodePort类型的Service定义Deployment资源文件创建Pod[root@master~]#catnodeport.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:my-nginx-nodeportspec:selector:matchLabels:run:my-nginx-nodeportreplicas:2定义Deployment资源文件template:metadata:labels:run:my-nginx-nodeportspec:containers:-name:my-nginx-nodeport-containerimage:nginximagePullPolicy:IfNotPresentports:-containerPort:801创建ClusterIP类型的Service部署应用更新资源清单文件:[root@master~]#kubectlapply-fnodeport.yamldeployment.apps/my-nginx-nodeportcreated查看pod是否创建成功:[root@omaster~]#kubectlgetpods1创建ClusterIP类型的Service编写Service资源清单文件yaml文件创建一个Service[root@master~]#catservice_nodeport.yamlapiVersion:v1kind:Servicemetadata:name:my-nginx-nodeportlabels:run:my-nginx-nodeportspec:type:NodePortports:-port:80protocol:TCPtargetPort:80nodePort:30080selector:run:my-nginx-nodeport1创建ClusterIP类型的Service创建Service创建并查看service[root@master~]#kubectlapply-fservice_nodeport.yamlservice/my-nginx-nodeportcreated[root@master~]#kubectlgetsvc-lrun=my-nginx-nodeport1创建ClusterIP类型的Service通过Service访问应用集群内访问service:[root@master~]#curl721创建ClusterIP类型的Service通过Service访问应用集群外访问service,选择K8S集群任意节点IP,例如master节点:[root@master~]#curl0:300801创建ClusterIP类型的Service通过Service访问应用在浏览器访问service:2创建ExternalName类型的Service2创建ExternalName类型的Service实现default名称空间下的client服务想要访问nginx-ns名称空间下的nginx-svc服务。把busybox.tar.gz上传到node2和node1上,手动解压:[root@master]#dockerload-ibusybox.tar.gz上传镜像2创建ExternalName类型的Service定义Deployment资源文件创建Pod[root@master]#catclient.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:clientspec:replicas:1selector:matchLabels:app:busybox定义Deployment资源文件

template:metadata:labels:app:busyboxspec:containers:-name:busyboximage:busyboxcommand:["/bin/sh","-c","sleep36000"]2创建ExternalName类型的Service部署应用更新资源清单文件:[root@master]#kubectlapply-fclient.yaml查看pod是否创建成功:[root@omaster~]#kubectlgetpods2创建ExternalName类型的Service编写Service资源清单文件yaml文件创建一个Service[root@master]#catclient_svc.yamlapiVersion:v1kind:Servicemetadata:name:client-svcspec:type:ExternalNameexternalName:nginx-svc.nginx-ns.svc.cluster.localports:-name:httpport:80targetPort:802创建ExternalName类型的Service创建Service创建并查看service[root@master]#kubectlapply-fclient_svc.yamlservice/client-svccreated[root@master~]#kubectlgetsvc2创建ExternalName类型的Service创建命名空间nginx-ns,新建deployment资源清单文件[root@master]#kubectlcreatensnginx-nsnamespace/nginx-nscreated[root@master]#catserver_nginx.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:nginxnamespace:nginx-ns创建命名空间nginx-ns,新建deploymentspec:replicas:1selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:nginximage:nginximagePullPolicy:IfNotPresent2创建ExternalName类型的Service部署应用更新资源清单文件:[root@master]#kubectlapply-fserver_nginx.yaml查看pod是否创建成功[root@master]#kubectlgetpods-nnginx-ns2创建ExternalName类型的Service编写资源清单文件创建Serviceyaml文件创建一个Service[root@master]#catnginx_svc.yamlapiVersion:v1kind:Servicemetadata:name:nginx-svcnamespace:nginx-nsspec:selector:app:nginxports:-name:httpprotocol:TCPport:80targetPort:80[root@master]#kubectlapply-fnginx_svc.yaml2创建ExternalName类型的Service访问测试登录到clientpod:[root@master~]#kubectlexec-itclient-76b6556d97-zgsrd--bash3映射外部服务案例3映射外部服务案例在node2上安装启动mysql数据库:[root@node2~]#yuminstallmariadb-server.x86_64-y[root@node2~]#systemctlstartmariadbk8s集群引用外部的mysql数据库3映射外部服务案例部署service应用[root@master]#catmysql_service.yamlapiVersion:v1kind:Servicemetadata:name:mysqlspec:type:ClusterIPports:-port:3306[root@master]#kubectlapply-fmysql_service.yamlservice/mysqlcreatedk8s集群引用外部的mysql数据库3映射外部服务案例k8s集群引用外部的mysql数据库查看service[root@master]#kubectlgetsvc|grepmysql[root@master]#kubectldescribesvcmysqlName:mysqlNamespace:defaultLabels:<none>Annotations:<none>Selector:<none>Type:ClusterIPIPFamilies:<none>IP:5IPs:5Port:<unset>3306/TCPTargetPort:3306/TCPEndpoints:<none>#还没有endpointSessionAffinity:NoneEvents:<none>3映射外部服务案例k8s集群引用外部的mysql数据库创建endpoint[root@mastermysql]#catmysql_endpoint.yamlapiVersion:v1kind:Endpointsmetadata:name:mysqlsubsets:-addresses:-ip:0ports:-port:3306[root@master]#kubectlapply-fmysql_endpoint.yamlendpoints/mysqlcreated3映射外部服务案例k8s集群引用外部的mysql数据库再次查看service[root@master]#kubectldescribesvcmysqlName:mysqlNamespace:defaultLabels:<none>Annotations:<none>Selector:<none>Type:ClusterIPIPFamilies:<none>IP:5IPs:5Port:<unset>3306/TCPTargetPort:3306/TCPEndpoints:0:3306#这个就是定义的外部数据库SessionAffinity:NoneEvents:<none>3映射外部服务案例k8s集群引用外部的mysql数据库测试访问mysql服务ThankYOU!Kubernetes代理:kube-proxy1目录kube-proxy工作模式01任务kube-proxy组件介绍02任务学习目标【知识目标】了解Service代理kube-proxy的作用;

了解Service代理kube-proxy三种工作模式。1kube-proxy组件介绍1kube-proxy组件介绍kube-proxy部署在Kubernetes的每一个Node节点上,是Kubernetes的核心组件。创建service时,kube-proxy会在iptables中追加一些规则,实现路由与负载均衡的功能。1kube-proxy组件介绍1、kube-proxy其实就是管理service的访问入口,包括集群内Pod到Service的访问和集群外访问service。2、kube-proxy管理sevice的Endpoints,负责Service的实现,该service对外暴露一个VirtualIP,也可以称为是ClusterIP,集群内通过访问这个ClusterIP:Port就能访问到集群内对应的serivce下的Pod。kube-proxy作用2kube-proxy工作模式2kube-proxy工作模式kube-proxy的工作模式有三种:Userspace、Iptables和IPVS。三种模式2kube-proxy工作模式ClientPod访问ServerPod时,先将请求发给内核空间中的serviceIptables规则,由它再将请求转给监听在指定套接字上的kube-proxy的端口,kube-proxy处理完请求,并分发请求到指定ServerPod后,再将请求转发给serviceip,由serviceIptables将请求转给各个节点中的ServerPod。Userspace模式2kube-proxy工作模式缺点:来回在用户空间和内核空间交互通信导致效率很差在Kubernetes1.1版本之前,userspace是默认的代理模型Userspace模式2kube-proxy工作模式客户端IP请求时,直接请求本地内核serviceip,根据Iptables的规则直接将请求转发到到各Pod上。Iptables模式2kube-proxy工作模式缺点:使用iptablesNAT完成转发,造成性能损耗Service/Endpoint规模庞大,导致性能打折Iptables代理模式由Kubernetes1.1版本引入,自1.2版本开始成为默认类型Iptables模式2kube-proxy工作模式客户端请求先到达内核空间,根据IPVS的规则直接分发到各Pod上。IPVS模式2kube-proxy工作模式kube-proxy监视Service和Endpoints对象,调用netlink接口以相应地创建IPVS规则并定期同步IPVS规则。IPVS基于netfilter的hook功能,使用哈希表作为底层数据结构并在内核空间中工作。IPVS模式2kube-proxy工作模式IPVS为负载均衡算法提供了更多选项:rr:轮询调度lc:最小连接数dh:目标哈希sh:源哈希sed:最短期望延迟nq:不排队调度IPVS模式2kube-proxy工作模式如果某个服务后端Pod发生变化,标签选择器适应的Pod又多一个,适应的信息会立即反映到apiserver上,kube-proxy可以watch到etc中的信息变化,并将它立即转为IPVS或者Iptables中的规则。IPVS模式2kube-proxy工作模式Kubernetes自1.9-alpha版本引入了IPVS代理模式,自1.11版本开始成为默认设置,若IPVS没有被激活,则降级使用Iptables规则。IPVS模式ThankYOU!Kubernetes代理:kube-proxy2目录ipvs规则分析01任务使用ipvs模式02任务学习目标【技能目标】能够修改Kube-proxy工作模式;

能够理解kube-proxy生成的ipvs规则。1使用ipvs模式1使用ipvs模式

随着Kubernetes的使用增长,其资源的可扩展性变得越来越重要。Kube-proxy是服务路由的构建块,它依赖于经过强化攻击的Iptables来实现支持核心的服务类型,如ClusterIP和NodePort。但是,Iptables难以扩展到成千上万的服务,因为它纯粹是为防火墙而设计的,并且基于内核规则列表。另一方面,使用基于IPVS的集群内服务负载均衡可以为这种情况提供很多帮助。IPVS专门用于负载均衡,并使用更高效的数据结构(哈希表),允许几乎无限的规模扩张。为什么使用ipvs代替iptables1使用ipvs模式修改kube-proxy的configmap,在第44行修改为mode:"ipvs",然后保存退出[root@master~]#kubectledit-nkube-systemcmkube-proxyipvs代替iptables1使用ipvs模式删除原有kube-proxy,实现更新[root@master~]#kubectl-nkube-systemgetpod-lk8s-app=kube-proxy|grep-v'NAME'|awk'{print$1}'|xargskubectl-nkube-systemdeletepodipvs代替iptables1使用ipvs模式查看替换结果:UsingipvsProxier[root@master~]#kubectllogs-nkube-systemkube-proxy-k5wkkipvs代替iptables2ipvs规则分析2ipvs规则分析编辑文件创建Pod[root@master~]#catnginx_deploy.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:my-nginxnamespace:defaultspec:replicas:2selector:matchLabels:run:my-nginxClusterIP模式strategy:type:RollingUpdaterollingUpdate:maxSurge:1maxUnavailable:0template:metadata:labels:run:my-nginxspec:containers:-name:my-nginximage:nginxports:-containerPort:802ipvs规则分析编辑文件创建Service[root@master~]#catnginx-svc.yamlapiVersion:v1kind:Servicemetadata:name:my-nginxlabels:run:my-nginxspec:type:ClusterIPclusterIP:28ports:-port:80targetPort:80selector:run:my-nginxClusterIP模式2ipvs规则分析ClusterIP模式查看Pod与Service[root@master~]#kubectlapply-fnginx_deploy.yamldeployment.apps/my-nginxcreated[root@master~]#kubectlapply-fnginx-svc.yamlservice/my-nginxcreated[root@master~]#kubectlgetpods-owide[root@master~]#kubectlgetsvc2ipvs规则分析ClusterIP模式安装ipvs工具查看ipvs规则:以默认轮询的模式代理后端两个nginx的pod[root@master~]#yuminstallipvsadm.x86_64-y2ipvs规则分析修改nginx-svc.yaml文件:[root@master~]#catnginx-svc.yamlapiVersion:v1kind:Servicemetadata:name:my-nginxlabels:run:my-nginxspec:type:NodePortclusterIP:28ports:-port:80protocol:TCPtargetPort:80nodePort:32080selector:run:my-nginxNodePort模式2ipvs规则分析NodePort模式删除原有service,创建新service:[root@master~]#kubectldeletesvcmy-nginxservice"my-nginx"deleted[root@master~]#kubectlapply-fnginx-svc.yamlservice/my-nginxcreated2ipvs规则分析NodePort模式查看ipvs规则:以轮询的方式将请求转发至后端pod[root@master~]#ipvsadm-L-nThankYOU!Kubernetes服务发现目录部署Wordpress个人博客01任务CoreDNS组件02任务学习目标【知识目标】了解CoreDns组件的作用。【技能目标】

能够通过Service实现服务发现。1CoreDNS组件1CoreDNS组件

DNS全称是DomainNameSystem:域名系统,它能够将可被人理解的域名翻译成可被机器理解IP地址,使得互联网的使用者不再需要直接接触很难阅读和理解的IP地址。DNS服务1CoreDNS组件

CoreDNS是一个灵活可扩展的DNS服务器,很多开源项目使用CoreDNS为集群提供服务发现的功能,可以作为Kubernetes集群DNS。CoreDNS1CoreDNS组件把dig.tar.gz上传到node1和node2机器上,手动解压:[root@node1~]#dockerload-idig.tar.gz[root@node2~]#dockerload-idig.tar.gz验证CoreDNS1CoreDNS组件创建Pod[root@master~]#catdig.yamlapiVersion:v1kind:Podmetadata:name:dignamespace:defaultspec:containers:-name:digimage:digcommand:-sleep-"3600"imagePullPolicy:IfNotPresentrestartPolicy:Always验证CoreDNS1CoreDNS组件更新资源清单文件:[root@master~]#kubectlapply-fdig.yamlpod/digconfigured查看默认名称空间的kubernetes服务:[root@master~]#kubectlgetsvc|grepkuberneteskubernetesClusterIP443/TCP5d13h验证CoreDNS1CoreDNS组件解析dns,如有以下返回说明dns安装成功:[root@master~]#kubectlexec-itdig--nslookupkubernetesServer: 0Address: 0#53Name: kubernetes.default.svc.cluster.local#通过其进行访问Address:验证CoreDNS2部署Wordpress个人博客2部署Wordpress个人博客WordPressWordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把WordPress当作一个内容管理系统(CMS)来使用。一个完整的WordPress应⽤程序包括以下Kubernetes对象。2部署Wordpress个人博客部署WordPress创建命名空间wordpress[root@master]#kubectlcreatenamespacewordpressnamespace/wordpresscreated2部署Wordpress个人博客部署WordPress编写Mysql资源文件:包括Service和Deployment[root@master~]#catmysql.yamlapiVersion:v1kind:Servicemetadata:name:wordpress-mysqlnamespace:wordpressspec:selector:app:mysqltype:ClusterIPports:-port:3306targetPort:3306配置Mysql资源2部署Wordpress个人博客部署WordPress---apiVersion:apps/v1kind:Deploymentmetadata:name:mysqlnamespace:wordpressspec:replicas:1selector:matchLabels:app:mysqltemplate:metadata:labels:app:mysqlspec:containers:-

温馨提示

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

评论

0/150

提交评论