Kubernetes:创建服务与公开部署

Mon*_*naj 16 google-cloud-platform kubernetes google-kubernetes-engine

我是 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

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

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


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

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

有人可以向我澄清一下吗?

Yar*_*riv 13

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

总的来说,Kubernetes 服务有 4 种不同类型,对于某些服务来说,使用公开还是创建并不重要,而对于其他服务则非常重要。

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: 在此示例中,create service nodeport 专用于创建 NodePort 类型,并具有使我们能够控制节点端口值的参数:

    kubectl create service nodeport demo --tcp=8080:80 --node-port=31888

在此示例 2 中,节点端口值是使用命令行设置的,无需像示例 1 那样手动编辑该值。

重要的

没有create service [service-name]设置服务的选择器的选项,因此该服务不会自动连接到现有的 Pod。

要将选择器标签设置为针对特定 Pod,您需要使用以下create service [service-name]命令set selector

kubectl set selector service [NAME] [key1]=[value1]

因此,对于上面的案例 2 示例,如果您希望服务能够与带有 pod 标记的部署一起使用,myapp: hello那么这是所需的后续命令:

kubectl set selector service demo myapp=hello
Run Code Online (Sandbox Code Playgroud)


小智 7

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

1.- kubectl 创建命令

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

接受 JSON 和 YAML 格式。

2.- kubectl公开命令

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

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


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

来源:K8s 文档