繁体   English   中英

从 pod minikube kubernetes 中的容器公开端口

[英]Expose port from container in a pod minikube kubernetes

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

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 site-web --type=LoadBalancer --port=8080

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

请注意,您的容器公开端口80 ,而不是8080container规范中的containerPort: 80 ),因此您需要在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://<External IP>:8080或运行curl http://<External IP>: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-web site-web是您的其中一个容器的名称(在您的site-home Pod中)。 请记住:我们公开的是Pod ,而不是通过Service公开的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 (或一组具有相同标签的类似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中无法创建真正的负载均衡器,将创建NodePort类型而不是LoadBalancer 命令kubectl get svc将告诉您您的应用程序将在哪个端口(在30000-32767范围内)可用。

和`kubectl expose pod site-web --type=LoadBalancer --port=8080 return: Error from server (NotFound): pods "site-web" not found. site-home是pod,site-web是暴露端口的容器,有什么问题吗?

如果您没有名为"site-web"Pod ,您会收到这样的消息。 在这里,您只是想公开不存在的Pod

如果我从容器中公开一个端口,该端口是否也会自动公开给 pod?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM