我是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中从container site-web暴露端口80。在官方文档中,我看到了以下部署:
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
但我不能使用例如:
kubectl expose pod site-web --type=LoadBalancer --port=8080
知道吗?
1条答案
按热度按时间ssm49v7z1#
但我不能使用例如:
当然可以,但是通过
LoadBalancer``Service
暴露单个Pod
没有多大意义。如果您有一个Deployment
,它通常管理一组Pods
,在这些Pods
之间可以平衡实际负载,那么LoadBalancer
就可以完成它的任务。但是,您仍然可以使用它来暴露单个Pod
。请注意,您的容器暴露的是端口
80
,而不是8080
(container
规范中的containerPort: 80
),因此您需要在Service
中将其指定为target-port
。kubectl expose
命令可能如下所示:如果您只为
kubectl expose
命令提供--port=8080
标志,则它假定target-port
的值与--port
的值相同。您可以通过查看您刚刚创建的服务来轻松检查它:你会在
spec.ports
部分看到这样的内容:在正确暴露您的
Pod
(或Deployment
)之后,即使用:你会看到类似的东西:
发出
kubectl get services
后,你应该会看到类似的输出:如果你在浏览器中转到
http://<External IP>:8080
或者运行curl http://<External IP>:8080
,你应该会看到你网站的前端。请记住,这个解决方案是有意义的,并且将在云环境中完全发挥作用,它能够为您提供真正的负载均衡器。请注意,如果你在Minikube中声明这样的
Service
类型,实际上它会创建NodePort服务,因为它无法为你提供真正的负载均衡器。因此,您的应用程序将在您的Node(您的Minikube VM)的IP地址上在范围30000-32767
(在我的示例中是端口31181
)中随机选择的端口上可用。关于你对卷的问题:
我有一个共享卷,所以如果我明白我不能使用部署,而只能使用pod(也许是有状态集?))
是的,如果你想使用特定的EmptyDir卷,它不能在不同的
Pods
之间共享(即使它们被调度在同一节点上),它只能在同一Pod
内的容器之间共享。如果你想使用Deployment
,你需要考虑另一种存储解决方案,比如PersistentVolume。编辑
在第一时间我没有注意到你的命令中的错误:
您试图公开不存在的
Pod
,因为您的Pod
的名称是site-home
,而不是site-web
。site-web
是一个容器的名称(在site-home
Pod
中)。记住:我们是通过Service
暴露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
定义中,它可能看起来像这样:现在你甚至可以在你的服务中提供这个标签作为选择器,但是如果你省略了
--selector
标志,它应该会被自动处理:LoadBalancer
类型的NodePort
。命令kubectl get svc
将告诉您应用程序在哪个端口(在30000-32767
范围内)可用。and
kubectl expose pod site-web--type = LoadBalancer--port = 8080 return:来自服务器的错误(NotFound):pod "site-web"未找到。site-home是pod,site-web是暴露了端口的容器,有什么问题吗? 如果你没有一个名为
"site-web"的
Pod,你可以期待这样的消息。在这里,您只是试图公开不存在的
Pod。 如果我从容器中暴露了一个端口,那么该端口也会自动暴露给pod? 是的,您在容器定义中定义了端口。您的
Pods会自动暴露
Containers`在其中暴露的所有端口。