但我不能使用例如:
kubectl expose pod site-web --type=LoadBalancer --port=8080
当然可以,但是通过LoadBalancer Service 暴露单个Pod 没有多大意义。如果您有一个Deployment,它通常管理一组Pods,在它们之间可以平衡实际负载,LoadBalancer 就可以完成它的工作。但是,您仍然可以将其仅用于公开单个 Pod。
请注意,您的容器公开端口80,而不是8080(containerPort: 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://<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 内)。请记住:我们通过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 定义中至少需要一个标签。在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 中无法创建真正的负载均衡器,而是创建 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 公开的所有端口。