当前位置: 首页 > 科技观察

图解Kubernetes应用部署

时间:2023-03-18 17:13:25 科技观察

在万物皆容器的时代,Kubernetes无疑是时代的宠儿。越来越多的企业和个人开始使用Kubernetes来虚拟化他们的业务并管理他们自己的容器。那么如何在Kubernetes上部署应用,如何排查集群运行故障,成为越来越受关注的问题。本文虫虫以直观的图形化方式介绍了如何在Kubernetes中部署应用,以及如何排查Kubernetes故障(下一篇,敬请期待)。概述当您想要在Kubernetes中部署应用程序时,您通常会定义三个组件:Deployment:这是您创建Pod应用程序副本的方式Service:一个内部负载均衡器Ingress(入口),它将流量分派给Pod:描述流量如何流动从集群外部到服务。VisualDiagram首先,在Kubernetes中,应用程序应该通过两层负载均衡暴露给外界:一个内部负载均衡器和一个外部负载均衡器。其次,内部负载均衡器称为服务,而外部负载均衡器称为入口。最后:Pod不是直接部署的。相反,Deployment在其上创建Pod和观察者。应用YAML示例以一个简单的HelloWorld应用程序为例。此应用程序的YAML如下:apiVersion:apps/v1kind:Deploymentmetadata:name:my-deploymentlabels:track:canaryspec:selector:matchLabels:any-name:my-apptemplate:metadata:labels:any-name:my-appspec:容器:-名称:cont1image:learnk8s/app:1.0.0ports:-containerPort:8080---apiVersion:v1kind:Servicemetadata:name:my-servicespec:ports:-port:80targetPort:8080selector:name:app---apiVersion:networking.k8s.io/v1beta1kind:Ingressmetadata:name:my-ingressspec:rules:-http:paths:-backend:serviceName:appservicePort:80path:/thedefinition很长,不容易找到组件之间的互连.诸如此类的问题:什么时候应该使用80端口,什么时候应该使用8080端口?我应该为每个服务创建一个新端口以避免冲突吗?标签名称重要吗?它们应该在所有地方都被命名吗?要回答这些问题,请继续阅读:Connectingdeploymentsandservices实际上,服务和deployments并不是直连的,services会跳过deployments直接指向Pod。所以要注意的事情实际上是Pod和服务之间的相互关系。它们关系中需要注意的要点:服务选择器应该至少匹配一个pod的标签;服务的目标端口(targetPort)应该与pod的内部容器的容器端口(containerPort)相匹配;服务端口可以是任意数字。多个服务也可以使用同一个端口,因为它们被分配了不同的IP地址。可视化图示1.考虑service下Pod暴露的端口2.在创建Pod时,应该为Pod中的每个容器定义端口containerPort。3.创建服务时,可以定义端口和目标端口。但是只有容器4可以连接到目标端口。目标端口和容器端口应匹配。5.如果容器暴露端口3000,targetPort应该匹配那个数字。如果您查看YAML,标签和ports/targetPor应该匹配:FAQ那么部署顶部的track:canary标签是什么?应该匹配吗?deployment的track:canary标签属于deployment,不被serviceselector用于流量调度。所以这个标签可以完全删除,或者为它分配另一个值。matchLabels选择器怎么样?它必须与部署用于跟踪Pod的Pod标签相匹配。Pod配置修改,如何测试?我们可以使用以下命令来检查Pod的标签是否正确:kubectlgetpods--show-labels对于属于多个应用程序的Pod使用:kubectlgetpods--selectorany-name=my-app--show-labels其中any-name=my-app表示标签any-name:my-app。或者您可以直接连接到Pod:您可以使用kubectlport-forward命令连接到服务并测试连接。kubectlport-forwardservice/3000:80其中service/为服务的名称,如示例中的“my-service”;3000是你要在电脑上开放的端口;80是暴露在“端口”字段端口的“服务”。如果可以连接,则设置正确。如果不是,则标签很可能已配置,或者端口不匹配。服务和入口连接应用程序发布的最后一步是配置入口。关键点入口必须知道如何检索服务,然后检索pod并将流量调度到它们。Ingress按名称和公开的端口检索服务。Ingress和服务中应该匹配两件事:Ingress的servicePort应该匹配服务的端口Ingress的serviceName应该匹配服务可视化的名称首先,为服务发布了一个端口。其次,该条目有一个名为servicePort的字段。在这种情况下,服务端口和入口服务端口应始终匹配。最后,如果服务分配了80端口,那么它的servicePort也应该改成80。Firstsampleconfiguration需要注意的字段:FAQ如何测试入口的功能?您可以对kubectlport-forward使用与之前相同的策略,但您应该连接到Ingress控制器而不是服务。首先,使用以下命令检索Ingress控制器的Pod名称:kubectlgetpods--all-namespaces对已确认的IngressPod(可能在不同的命名空间中)执行以下命令:kubectldescribepodnginx-ingress-controller-6fc5bcc--namespacekube-system|grepPorts用于连接Pod:kubectlport-forwardnginx-ingress-controller-6fc5bcc3000:80--namespacekube-system这样在电脑上访问3000端口时,请求将被转发到ControllerPod上的入口端口80。你访问localhost:3000就可以看到发布的应用。总结最后,我们总结一下回顾哪些端口和标签应该匹配的要点:serviceselector应该匹配Pod的标签;服务目标端口(targetPort)应与Pod内容器的容器端口(containerPort)相匹配;服务端口可以是任意数字。多个服务可以使用同一个端口,因为它们被分配了不同的IP地址;条目的服务端口servicePort应该与服务中的端口相匹配;服务名称应与条目中的现场服务名称(serviceName)相匹配。