我是Kubernetes的新手。我正在学习一些与Kubernetes部署相关的教程。我看到两个不同的命令,看起来做类似的事情。
1.以下命令来自谷歌代码实验室(URL:https://codelabs.developers.google.com/codelabs/cloud-springboot-kubernetes/index.html?index=..%2F..index#7$ kubectl create service loadbalancer hello-java --tcp=8080:8080
1.另一个命令与Kubernetes站点沿着出现在不同的位置(https://kubernetes.io/docs/tutorials/stateless-application/expose-external-ip-address/)$ kubectl expose deployment hello-world --type=LoadBalancer --name=my-service
现在,根据我的理解,这两个命令都是从负载平衡器的部署中创建服务,并将它们暴露给外部世界。
我不认为同一个任务会有两个不同的命令。应该会有一些我无法理解的区别。
有人能给我解释一下吗?
4条答案
按热度按时间jljoyd4f1#
在某些情况下,
expose
命令是不够的,您唯一可行的选择是使用create service
。总的来说,Kubernetes服务有4种不同类型,对于某些类型,使用expose还是create并不重要,而对于其他类型,使用expose或create则非常重要。
Kubernetes服务的类型包括:
因此,例如,在NodePort类型服务的情况下,假设我们想要将节点端口设置为值31888:
kubectl expose deployment demo --name=demo --type=NodePort --port=8080 --target-port=80
设置节点端口值的唯一方法是在创建之后使用edit命令更新节点端口值:
kubectl edit service demo
kubectl create service nodeport demo --top=8080:80 --node-port=31888
在本例2中,节点端口值是用命令行设置的,不需要像例1那样手动编辑该值。
create service [service-name]
没有设置服务选择器的选项,因此服务不会自动连接到现有的pod。要将选择器标签设置为针对特定pod,您需要使用
set selector
命令执行create service [service-name]
:kubectl set selector service [NAME] [key1]=[value1]
因此,对于上面的案例2示例,如果您希望服务使用带有标记为
myapp: hello
的pod的部署,则需要以下后续命令:9udxz4iz2#
主要差异可以从文档中看出。
1.-* * kubectl创建命令
从文件或标准输入创建资源。
接受JSON和YAML格式。
2.-* * kubectl公开命令
将资源公开为新的Kubernetes服务。
按名称查找部署、服务、副本集、复制控制器或pod,并将该资源的选择器用作指定端口上新服务的选择器。[...]
虽然在您提供的示例中这两个命令实现的是相同的功能,但create命令更具有全局性,您可以使用它通过命令行或yaml/json文件创建所有资源。然而,expose命令只会创建服务资源,并且它主要用于公开其他已经存在的资源。
来源:K8s单据
vsnjm48y3#
我希望这能有所帮助:这里的关键是要理解服务和部署之间的区别。根据此链接[1],您会注意到部署会自动处理Pod的死亡率。但是,如果一个Pod被终止,然后另一个Pod被启动,当它们的IP更改时,Pod如何继续通信?它们使用服务:“服务是一种抽象,它定义了Pod的逻辑集以及访问它们的策略”。此外,您可能会感兴趣地查看此链接[2],因为它描述了kubectl expose命令创建一个服务,而该服务又创建了一个外部IP和一个负载均衡器。对于初学者,回顾一下Kubernetes使用的命令语言可能会有所帮助。这个链接[3]描述了(正如在另一个答案中提到的)kubectl create命令被用来更具体地描述它所创建的对象。2同样使用create命令你可以创建更多种类的对象。
[1]:服务:https://kubernetes.io/docs/concepts/services-networking/service/ [2]:部署容器化Web应用程序:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app#step_6_expose_your_application_to_the_internet[3]:如何创建对象:https://kubernetes.io/docs/tasks/manage-kubernetes-objects/imperative-command/#how-to-create-objects
mbyulnm04#
据我所知,方法1(使用创建服务)只创建服务对象,由于没有指定标签选择器,因此它没有任何底层目标pod。但在方法2(使用公开部署)中,服务负载平衡了所有使用部署创建的pod,因为服务自动附加了所需的标签。