[英]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
,而不是8080
( container
规范中的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
定义中至少需要一个标签。 在Pod
的metadata
部分下添加简单的标签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.