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

K8s中创建资源的两种方式

时间:2023-03-21 22:20:17 科技观察

在K8s中,创建资源有两种方式:直接使用kubectlrun命令创建使用kubectlcreate/apply命令从YAML文件创建在本文中,我将解释这两种方法带有示例,以及何时应该使用每个示例。kubectlrunkubectlrun命令在pod中创建并运行特定图像。例如:$kubectlrunnginx--image=nginx--port80pod/nginxcreated$kubectlgetponginxNAMEREADYSTATUSRESTARTSAGEnginex1/1Running025s如果你kubectldescribethisnewpod你会看到:$kubectldescribeponginxName:nginxNamespace:defaultPriority:0Node:ip-10-0-0-146.ec2.internal/10.0.0.146StartTime:Sat,09Apr202216:56:29-0400Labels:run=nginxAnnotations:kubernetes.io/psp:eks.privilegedStatus:RunningIP:10.0.0.69IPs:IP:10.0.0.69注意Labels是run=nginx。也可以在run命令中指定环境变量,例如:$kubectlrunnginx--image=nginx--port80--env="DNS_DOMAIN=cluster"--env="POD_NAMESPACE=default"如果执行kubectldescribe现在是nginx,你可以看到我们刚刚提供的新环境变量:$kubectldescribeponginx|grep"Env"-A2Environment:DNS_DOMAIN:clusterPOD_NAMESPACE:default通常kubectlrun命令用于一些简单、直观、快速的任务,适用于ad-hoc(点对点网络模式)测试或实验。kubectlkubectlcreate/applykubectlcreate/apply命令基于给定的配置文件。配置文件具有以下特点:配置文件描述了应用程序最终将达到的状态。配置文件提供了用于创建可重复部署的资源的模板。部署可以像代码一样进行管理。适用于正式的、跨环境的、大规模的部署。使用此方法需要熟悉配置文件的语法。让我们看另一个例子。我们将创建相同的nginxpod,这次,让我们使用YAML文件来完成:apiVersion:apps/v1kind:Deploymentmetadata:name:nginxlabels:app:nginxspec:replicas:1selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:nginximage:nginxports:-containerPort:80不要担心Deployment文件语法,我将在另一篇文章中讨论K8sDeployment。让我们使用kubectlcreate命令创建资源:$kubectlcreate-fnginx-deployment.yamldeployment.apps/nginxcreated$kubectlgetpoNAMEREADYSTATUSRESTARTSAGEnginex-6799fc88d8-k7tfl1/1Running05s$kubectldelete-fnginx-deployment.yamldeployment.apps"nginx"deleted你也可以使用kubectlapply命令:$kubectlapply-fnginx-deployment.yamldeployment.apps/nginxcreated$kubectlgetpoNAMEREADYSTATUSRESTARTSAGEnginex-6799fc88d8-2fsxk1/117Running0$kubectldelete-fnginx-deployment.yamldeployment.apps"nginx"deleted可以看到create和apply命令都可以用来创建资源,但是它们有什么区别呢?kubectlcreatevskubectlapply先说说create和apply的区别。create这个命令会告诉K8sAPI服务器你要创建、删除或替换一个或多个资源。以更简化的方式,这意味着您可以从头开始创建一个全新的对象。或者,它通过定义需求对任何现有对象进行一些更改。apply此命令意味着通过在给定的YAML文件中准确声明您需要的内容来更改已经存在的对象。为了演示,让我们使用nginx部署文件。首先,让我们创建资源:$kubectlcreate-fnginx-deployment.yamldeployment.apps/nginxcreated现在,假设我们要为pod添加标签,将标签更新为:apiVersion:apps/v1kind:Deploymentmetadata:name:nginxlabels:app:nginxenv:prodspec:replicas:1selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxenv:prodspec:containers:-name:nginximage:nginx如果再次运行创建命令:$kubectlcreate-fnginx-deployment.yamlErrorfromserver(AlreadyExists):errorwhencreating"nginx-deployment.yaml":deployments.apps"nginx"alreadyexists你会得到"nginx"alreadyexists即使YAML文件是略有不同的错误。如果你运行kubectlapply会怎样?让我们试试看:$kubectlapply-fnginx-deployment.yamldeployment.apps/nginxconfigured现在让我们描述资源:$kubectlgetpoNAMEREADYSTATUSRESTARTSAGEnginex-595f565474-zkl4t1/1Running03m39s$kubectldescribepnginx-595f565474-zkl4tName:nginx-595f565474-zkl4tNamespace:defaultPriority:0Node:ip-10-0-0-146.ec2.internal/10.0.0.146StartTime:星期六,2022年4月9日17:20:04-0400appLabels:=nginxenv=prodpod-template-hash=595f565474可以看到新增的标签是env=prod。现在我们了解了kubectlcreate和kubectlapply之间的区别,您可能想知道应该使用哪一个?在kubectlcreate命令中,我们指定了一个具体的行为,就是create,所以是一种比较命令式的方式。在kubectlapply命令中,我们指定了系统的目标状态,而没有指定具体的行为,因此它是一种更声明式的方式。我们让系统决定采取什么行动。如果资源不存在,它将创建它,如果资源存在,则它将配置应用于现有资源。简单来说,如果您在单个文件上运行操作以创建资源,则创建和应用基本相同。但是,apply允许您同时在目录中的多个文件上创建和修补。我希望你喜欢这个小小的知识分享,我们会在下一篇文章中见到你!