【问题标题】:Expose port from container in a pod minikube kubernetes在 pod minikube kubernetes 中从容器中公开端口
【发布时间】:2020-01-23 17:35:59
【问题描述】:

我是 K8s 的新手,我将尝试使用 minikube 和 2 个容器在一个 pod 中运行这个命令:

kubectl apply -f deployment.yaml

还有这个 deployment.yml:

apiVersion: v1
kind: Pod
metadata:
  name: site-home
spec:

  restartPolicy: Never

  volumes:
  - name: v-site-home
    emptyDir: {}

  containers:


  - name: site-web
    image: site-home:1.0.0
    ports:
    - containerPort: 80
    volumeMounts:
    - name: v-site-home
      mountPath: /usr/share/nginx/html/assets/quotaLago
  
  - name: site-cron
    image: site-home-cron:1.0.0
    volumeMounts:
    - name: v-site-home
      mountPath: /app/quotaLago

我有一个共享卷,所以如果我知道我不能使用部署,只能使用 pod(可能是有状态集?)

在任何情况下,我都想从 pod site-home 中的容器 site-web 公开端口 80。 在官方文档中,我看到了部署:

kubectl expose deployment hello-node --type=LoadBalancer --port=8080

但我不能使用例如:

kubectl expose pod site-web --type=LoadBalancer --port=8080

有什么想法吗?

【问题讨论】:

  • 你得到什么错误!使用kubectl expose pod 命令?
  • 另外,给定 Pod 中的容器共享一个 IP 地址和端口空间,并且可以通过 localhost 找到彼此。
  • 查看我对马里奥回答的评论

标签: kubernetes kubectl minikube


【解决方案1】:

但我不能使用例如:

kubectl expose pod site-web --type=LoadBalancer --port=8080

当然可以,但是通过LoadBalancer Service 暴露单个Pod 没有多大意义。如果您有一个Deployment,它通常管理一组Pods,在它们之间可以平衡实际负载,LoadBalancer 就可以完成它的工作。但是,您仍然可以将其仅用于公开单个 Pod

请注意,您的容器公开端口80,而不是8080containerPort: 80 在您的container 规范中),因此您需要在Service 中将其指定为target-port。您的kubectl expose 命令可能如下所示:

kubectl expose pod site-web --type=LoadBalancer --port=8080 --target-port=80

如果您只为您的kubectl expose 命令提供--port=8080 标志,则它假定target-port 的值与--port 的值相同。您可以通过查看刚刚创建的服务轻松地自行检查:

kubectl get svc site-web -o yaml

您会在spec.ports 部分看到类似的内容:

- nodePort: 32576
    port: 8080
    protocol: TCP
    targetPort: 8080

正确暴露您的Pod(或Deployment)后,即使用:

kubectl expose pod site-web --type=LoadBalancer --port=8080 --target-port=80

你会看到类似的东西:

  - nodePort: 31181
    port: 8080
    protocol: TCP
    targetPort: 80

发出kubectl get services 后,您应该会看到类似的输出:

NAME                            TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)          AGE
site-web                              ClusterIP      <Cluster IP>   <External IP>           8080:31188/TCP         4m42s

如果您在浏览器中转到http://&lt;External IP&gt;:8080 或运行curl http://&lt;External IP&gt;:8080,您应该会看到您网站的前端。

请记住,此解决方案是有意义的,并且将在云环境中完全发挥作用,它能够为您提供真正的负载平衡器。请注意,如果您在 Minikukbe 中声明此类 Service 类型,实际上它会创建 NodePort 服务,因为它无法为您提供真正的负载均衡器。因此,您的应用程序将在您的节点(您的 Minikube 虚拟机)的 IP 地址上可用,该地址位于 30000-32767 范围内随机选择的端口上(在我的示例中,它是端口 31181)。

关于音量的问题:

我有一个共享卷,所以如果我明白我不能使用部署但 只有 pod(可能是有状态集?)

是的,如果你想专门使用EmptyDir 卷,它不能在不同的Pods 之间共享(即使它们被调度在同一个节点上),它只能在同一个Pod 内的容器之间共享。如果您想使用Deployment,则需要考虑另一种存储解决方案,例如PersistenetVolume


编辑:

一开始我没有注意到你的命令中的错误:

kubectl expose pod site-web --type=LoadBalancer --port=8080

您试图公开不存在的Pod,因为您的Pod 的名称是site-home,而不是site-website-web 是您的一个容器的名称(在您的 site-home Pod 内)。请记住:我们通过Service 公开Pod,而不是containers

我改 80->8080 但我总是来error:kubectl expose pod site-home --type=LoadBalancer --port=8080 return:error: couldn't retrieve selectors via --selector flag or introspection: the pod has no labels and cannot be exposed'kubectl expose -h' 寻求帮助 和例子。

这里的重点是:the pod has no labels and cannot be exposed

看起来您的Pod 没有定义任何必需的labels,以便Service 可以从在您的集群中的其他 Pods 中。您的Pod 定义中至少需要一个标签。在Podmetadata 部分下添加简单标签name: site-web 应该会有所帮助。在您的 Pod 定义中可能如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: site-home
  labels:
    name: site-web
spec:
...

现在你甚至可以在你的服务中提供这个标签作为选择器,但是如果你省略 --selector 标志,它应该会被自动处理:

kubectl expose pod site-home --type=LoadBalancer --port=8080 --target-port=80 --selector=name=site-web

记住:Minikube 中无法创建真正的负载均衡器,而是创建 LoadBalancer NodePort 类型。命令kubectl get svc 将告诉您应用程序在哪个端口(在30000-32767 范围内)可用。

和 `kubectl 公开 pod site-web --type=LoadBalancer --port=8080 返回:来自服务器的错误(未找到):未找到 pod “site-web”。 site-home 是 pod,site-web 是带有端口的容器 暴露了,有什么问题?

如果您没有名称为"site-web"Pod,您可以期待这样的消息。在这里,您只是试图公开不存在的Pod

如果我从容器中公开了一个端口,该端口会自动公开 也用于吊舱?

是的,您在容器定义中定义了端口。您的Pods 会自动公开其中Containers 公开的所有端口。

【讨论】:

  • 我改 80->8080 但我总是报错:kubectl expose pod site-home --type=LoadBalancer --port=8080 返回:error: couldn't retrieve selectors via --selector flag or introspection: the pod has no labels and cannot be exposed See 'kubectl expose -h' for help and exampleskubectl expose pod site-web --type=LoadBalancer --port=8080 返回:Error from server (NotFound): pods "site-web" not found Site-home 是 pod,site-web 是暴露了端口的容器,有什么问题?如果我从容器中暴露了一个端口,那么该端口也会自动暴露给 pod?
  • 请看我回答的编辑部分。
猜你喜欢
  • 2022-01-13
  • 2021-12-10
  • 2021-08-29
  • 2017-05-15
  • 1970-01-01
  • 2019-01-28
  • 2022-07-21
  • 2017-12-20
  • 1970-01-01
相关资源
最近更新 更多