Kubernetes:创建服务与公开部署

yrefmtwq  于 2023-03-07  发布在  Kubernetes
关注(0)|答案(4)|浏览(210)

我是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
现在,根据我的理解,这两个命令都是从负载平衡器的部署中创建服务,并将它们暴露给外部世界。
我不认为同一个任务会有两个不同的命令。应该会有一些我无法理解的区别。
有人能给我解释一下吗?

jljoyd4f

jljoyd4f1#

在某些情况下,expose命令是不够的,您唯一可行的选择是使用create service
总的来说,Kubernetes服务有4种不同类型,对于某些类型,使用expose还是create并不重要,而对于其他类型,使用expose或create则非常重要。
Kubernetes服务的类型包括:

  • 群集IP
  • 节点端口
  • 负载均衡器
  • 外部名称

因此,例如,在NodePort类型服务的情况下,假设我们想要将节点端口设置为值31888

      • 示例1:**在以下命令中,节点端口值没有参数,expose命令会自动创建它:

kubectl expose deployment demo --name=demo --type=NodePort --port=8080 --target-port=80
设置节点端口值的唯一方法是在创建之后使用edit命令更新节点端口值:kubectl edit service demo

      • 示例2:**在此示例中,创建服务nodeport专用于创建NodePort类型,并具有使我们能够控制节点端口值的参数:

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的部署,则需要以下后续命令:

kubectl set selector service demo myapp=hello
9udxz4iz

9udxz4iz2#

主要差异可以从文档中看出。
1.-* * kubectl创建命令
从文件或标准输入创建资源。
接受JSON和YAML格式。
2.-* * kubectl公开
命令
将资源公开为新的Kubernetes服务。
按名称查找部署、服务、副本集、复制控制器或pod,并将该资源的选择器用作指定端口上新服务的选择器。[...]
虽然在您提供的示例中这两个命令实现的是相同的功能,但create命令更具有全局性,您可以使用它通过命令行或yaml/json文件创建所有资源。然而,expose命令只会创建服务资源,并且它主要用于公开其他已经存在的资源。
来源:K8s单据

vsnjm48y

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

mbyulnm0

mbyulnm04#

据我所知,方法1(使用创建服务)只创建服务对象,由于没有指定标签选择器,因此它没有任何底层目标pod。但在方法2(使用公开部署)中,服务负载平衡了所有使用部署创建的pod,因为服务自动附加了所需的标签。

相关问题