【问题标题】:Kubernetes: create service vs expose deploymentKubernetes:创建服务与公开部署
【发布时间】:2020-04-11 07:57:52
【问题描述】:

我是 Kubernetes 新手。我正在阅读一些与 Kubernetes 部署相关的教程。我看到两个不同的命令看起来做类似的事情。

  1. 以下命令来自谷歌代码实验室(网址:https://codelabs.developers.google.com/codelabs/cloud-springboot-kubernetes/index.html?index=..%2F..index#7

    $ kubectl create service loadbalancer hello-java --tcp=8080:8080

  2. 与 Kubernetes 站点 (https://kubernetes.io/docs/tutorials/stateless-application/expose-external-ip-address/) 一起在不同的地方看到另一个命令

$ kubectl expose deployment hello-world --type=LoadBalancer --name=my-service


现在根据我的理解,这两个命令都在使用负载均衡器从部署中创建服务并将它们暴露给外部世界。

我认为同一任务不会有两个单独的命令。应该有一些我无法理解的差异。

有人可以向我解释一下吗?

【问题讨论】:

  • 就像你说的那样,两者都在做同样的事情,即为部署创建服务。但是,当进入学习 K8s 的下一阶段时,您将访问一个看起来像部署的服务文件,它为您的部署指定 svc 配置,一些工程师将 svc 配置、入口配置、部署配置添加到一个文件中。这就是您想要解决的所有问题。运行每个后,您可以使用 kubectl get svc -n namespace 检查并检查更多信息并澄清。
  • 感谢@BinaryBullet 的解释......现在有点想法

标签: kubernetes google-cloud-platform google-kubernetes-engine


【解决方案1】:

主要区别可以从文档中看出。

1.- kubectl create 命令

从文件或标准输入创建资源。

接受 JSON 和 YAML 格式。

2.- kubectl expose 命令

将资源公开为新的 Kubernetes 服务。

查找部署、服务、副本集、复制控制器或 pod 按名称并使用该资源的选择器作为选择器 指定端口上的新服务。 [...]


尽管在您提供的示例中两者都实现了相同的目标,但 create 命令是一种更全局的命令,您可以使用命令行或 yaml/json 文件创建所有资源。但是,expose 命令只会创建一个服务资源,主要用于暴露其他已经存在的资源。

来源:K8s Docs

【讨论】:

  • 因为没有评论而投反对票而投赞成票。
【解决方案2】:

我希望这会有所帮助:这里的关键是了解服务和部署之间的区别。根据此链接 [1],您会注意到部署会自动处理 Pod 的死亡。但是,如果一个 Pod 被终止,然后另一个 Pod 启动了,如何 当它们的 IP 改变时,Pod 会继续通信吗?他们使用服务:“服务是一种抽象,它定义了一组逻辑 Pod 和访问它们的策略”。此外,查看此链接 [2] 可能会很有趣,因为它描述了 kubectl expose 命令创建了一个服务,该服务又创建了一个外部 IP 和一个负载均衡器。作为初学者,查看 Kubernetes 使用的命令语言可能会有所帮助,此链接 [3] 描述(如另一个答案中所述)kubectl create 命令用于更具体地了解它创建的对象。除了使用 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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在某些情况下,expose 命令是不够的,您唯一可行的选择是使用create service

      总体而言,Kubernetes 服务有 4 种不同类型,对于某些使用暴露或创建真的无关紧要,而对于另一些则非常重要。

      Kubernetes 服务的类型有:

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

      例如,对于 NodePort 类型的服务,假设我们想设置一个值为 31888 的节点端口:

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

        kubectl expose deployment demo --name=demo --type=NodePort --port=8080 --target-port=80

      设置节点端口值的唯一方法是在创建后使用编辑命令更新节点端口值:kebctl edit service demo

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

        kubectl 创建服务节点端口演示 --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
      

      【讨论】:

        猜你喜欢
        • 2020-01-31
        • 2019-05-06
        • 2016-12-22
        • 2019-01-04
        • 2017-06-04
        • 2023-03-21
        • 1970-01-01
        • 2020-04-07
        • 2022-01-23
        相关资源
        最近更新 更多